Simplified Data Encryption Standard (Simplified DES) Practice
Author silnex
이전 글에서 SDES에 대한 내용과 필요한 함수들에 대해서 알아 보았다.
이번엔 직접 Keygen, Encryption 및 Decryption을 해보며 SDES에 대해서 알아본다.
Key Generation
Key | 1 0 1 0 0 0 0 0 1 0 |
P10 | 3 5 2 7 4 10 1 9 8 6 |
P8 | 6 3 7 4 8 5 10 9 |
위 함수와 Key를 사용해 subKey(k1,k2)를 생성한다.
먼저 10bit의 key인 1010000010를 함수 P10에 넣는다.
▶ P10(1010000010) ::= (1000001100)
P10의 결과 값을 5bit 씩 쪼개어 LS-1을 진행한 뒤 다시 하나로 합친다.
▶ LS-1(10000) = (00001)
LS-1(01100) = (11000) ::= 00001 11000
subKey 1 Gen LS-1의 결과 값을 P8에 넣는다.
▶ P8(0000111000) ::= 10100100 (k1)
LS한 결과 값에 LS-2를 한번 더 적용한 뒤 하나로 합친다.
▶ LS-2(00001) = (00100)
LS-2(11000) = (00011) ::= 00100 00011
subKey 2 Gen LS-2의 결과값을 P8에 넣는다.
▶ P8(0010000011) ::= 01000011 (k2)
K1 | K2 |
10100100 | 01000011 |
Encryption
PlainText | 0 1 1 0 1 1 0 1 |
IP | 2 6 3 1 4 8 5 7 |
E/P | 4 1 2 3 2 3 4 1 |
P4 | 2 4 3 1 |
IP-1 | 1 3 5 7 2 8 6 |
S0 | 1 | 0 | 3 | 2 | S1 | 0 | 1 | 2 | 3 |
3 | 2 | 1 | 0 | 2 | 0 | 1 | 3 | ||
0 | 2 | 1 | 3 | 3 | 0 | 1 | 0 | ||
3 | 1 | 3 | 2 | 2 | 1 | 0 | 3 |
위 함수를 통해 fk를 2번 반복한다.
8bit의 PlainText를 함수 IP에 넣는다.
▶ IP(01101101) ::= 1110 0110
{START fk} IP의 결과 값 중 오른쪽4bit(0110)를 함수 E/P에 넣는다.
▶ E/P(0110) ::= 00111100
E/P 결과 값에 subkey k1과 xor 연산을 한다.
▶ 00111100 ⊕ 10100100 ::= 1001 1000
k1과 Xor한 결과 값을 S-Box에 넣어 매치되는 행렬값을 구한 뒤 합친다.
▶ S0(11,00) = S0(3,0) = 11 (3) | S1(10,00) = S1(2,0) = 11 (3) ::= 1111
S-Box의 결과 값을 P4에 넣고 처음 IP의 결과 값 중 왼쪽4bit와 Xor 연산을한다.
▶ P4(1111) ::= 1111
1111 ⊕ 1110 ::= 0001 {END fk}
Xor의 결과 값과 처음 IP의 결과 값 중 오른쪽4bit의 순서를 바꾼다.
▶ SW(0001 0110) ::= {0110 0001}
SW값을 한번 더 함수 fk를 반복한다.
{START fk} ▶ E/P(0001) ::= 10000010
▶ 10000010 ⊕ 01000011 ::= 1100 0001
▶ S0(10,10) = S0(2,2) = 01 (1) | S1(01,00) = S1(1,0) = 10 (2) ::= 0110
▶ P4(0110) ::= 1010
1010 ⊕ 0110 ::= 1100 {END fk}
▶ >> {1100 0001}
두번의 fk에서 나온 결과 값을 IP-1에 넣는다.
▶ IP-1(1100 0001) = 01000110
이렇게 나온 결과 값 0 1 0 0 0 1 1 0가 PlainText(01101101)를 Key(1010000010)로 암호화한 CipherText(암호문)이 된다.
Decryption
CipherText | 0 1 0 0 0 1 1 0 |
IP | 2 6 3 1 4 8 5 7 |
E/P | 4 1 2 3 2 3 4 1 |
P4 | 2 4 3 1 |
IP-1 | 1 3 5 7 2 8 6 |
S0 | 1 | 0 | 3 | 2 | S1 | 0 | 1 | 2 | 3 |
3 | 2 | 1 | 0 | 2 | 0 | 1 | 3 | ||
0 | 2 | 1 | 3 | 3 | 0 | 1 | 0 | ||
3 | 1 | 3 | 2 | 2 | 1 | 0 | 3 |
위 함수를 통해 fk를 2번 반복하는데 Encryption과 과정은 동일하다.
하지만 이번엔 Decryption이기 때문에 fk에서 사용되는 key의 순서가 k2, k1순으로 사용되어야한다.
8bit의 CipherText를 함수 IP에 넣는다.
▶ IP(01000110) ::= 1100 0001
{START fk} IP의 결과 값 중 오른쪽4bit(0001)를 함수 E/P에 넣는다.
▶ E/P(0001) ::= 10000010
E/P 결과 값에 subkey k1과 xor 연산을 한다.
▶ 10000010 ⊕ 01000011 ::= 1100 0001
k1과 Xor한 결과 값을 S-Box에 넣어 매치되는 행렬값을 구한 뒤 합친다.
▶ S0(10,10) = S0(2,2) = 01 (1) | S1(01,00) = S1(1,0) = 10 (2) ::= 0110
S-Box의 결과 값을 P4에 넣고 처음 IP의 결과 값 중 왼쪽4bit와 Xor 연산을한다.
▶ P4(0110) ::= 1010
1010 ⊕ 1100 ::= 0110 {END fk}
Xor의 결과 값과 처음 IP의 결과 값 중 오른쪽4bit의 순서를 바꾼다.
▶ SW(0110 0001) ::= {0001 0110}
SW값을 한번 더 함수 fk를 반복한다.
{START fk} ▶ E/P(0110) ::= 00111100
▶ 00111100 ⊕ 10100100 ::= 1001 1000
▶ S0(11,00) = S0(3,0) = 11 (3) | S1(10,00) = S1(2,0) = 11 (3) ::= 1111
▶ P4(1111) ::= 1111
1111 ⊕ 0001 ::= 1110 {END fk}
▶ >> {1110 0110}
두번의 fk에서 나온 결과 값을 IP-1에 넣는다.
▶ IP-1(1110 0110) = 01101101
이렇게 나온 결과 값 0 1 1 0 1 1 0 1가 CipherText(01000110)를 Key(1010000010)로 복호화한 PlainText(평문)이 된다.
이미지 출처 및 참고 자료