2017. 6. 22. 04:17ㆍ0x05 Crypto
목표: DES에 대해 공부하며 개념을 정리하면서, 개념을 토대로 소스코드를 구현
DES의 핵심요소
1. 56비트 키
2. S-BOX 설계 (비선형 함수)
3. 입출력 64비트
4. 16라운드
DES의 기본 구조
[초기치환 IP]
[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] |
58 50 42 34 26 18 10 2 60 52 44 36 28 20 12 4 |
62 54 46 38 30 22 14 6 64 56 48 40 32 24 16 8 |
57 49 41 33 25 17 9 1 59 51 43 35 27 19 11 3 |
61 53 45 37 29 21 13 5 63 55 47 39 31 23 15 7 |
총 64비트 (입력)
[소스코드]
unsigned char DES_INIT_IP[4][16] = { {58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28,20,12,4}, {62 ,54 ,46 ,38 ,30 ,22 ,14 ,6 ,64 ,56 ,48 ,40 ,32 ,24 ,16 ,8}, {57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3}, {61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7} }; // 각 첨자의 숫자 모두 -1 해야함 그래야 [0]~[63]이 적용됨 |
[암호문]
I LOVE YOU
PYTHON |
>>> "ILOVEYOU".encode('hex') '494c4f5645594f55' >>> bin(0x49) '0b1001001' >>> bin(0x4c) '0b1001100' >>> bin(0x4F) '0b1001111' >>> bin(0x56) '0b1010110' >>> bin(0x45) '0b1000101' >>> bin(0x59) '0b1011001' >>> bin(0x4F) '0b1001111' >>> bin(0x55) '0b1010101' |
unsigned int PLAIN_TEXT[64]= { 0,1,0,0, 1,0,0,1, // I 0,1,0,0, 1,1,0,0, // L 0,1,0,0, 1,1,1,1, // O 0,1,0,1, 0,1,1,0, // V 0,1,0,0, 0,1,0,1, // E 0,1,0,1, 1,0,0,1, // Y 0,1,0,0, 1,1,1,1, // O 0,1,0,1, 0,1,0,1 // U }; |
TEST
2X2배열로 올바르게 비트에 맞춰 값이 적용 되는지
// TEST unsigned int init[4]= { 0,2,1,3 }; unsigned int plain[4] = { 5,6,7,8 }; unsigned int after[4] = {0}; /* after 배열에 57 68 나와야함 */ |
[실제 코드에 적용]
for(i=0; i<MAX; i++) { tmp = DES_INIT_IP[i]; RE_LOCATE[i] = PLAIN_TEXT[tmp]; } |
[RE_LOCATE 배열을 L1, R1으로 쪼개야함]
for(i=0; i<64; i++) { if(i<32) { DES_INIT_IP_L1[i] = RE_LOCATE[i]; } else { DES_INIT_IP_R1[i] = RE_LOCATE[i]; } } |
[L2 = R1 ^ S1-BOX]
for(i=0; i<64; i++) { DES_INIT_IP_L2[i] = DES_INIT_IP_R1[i] ^ S1_BOX[i]; } |
[SWAP]
for(i=0; i<64; i++) { if(i<32) { static int j=32; SWAP_LOCATE_1[j] = DES_INIT_IP_L2[i]; j++; } else { static int k=0; SWAP_LOCATE_1[k] = DES_INIT_IP_R2[i]; k++; } } |
[1ROUND]
void get_Round1_Func() { set_LOCATE_Func(); set_L1_R1_Func(); set_MAKEL2_Func(); set_SWAP_1_Func(); } |
데이터 암호화부는 입력부의 초기 치환(IP-Initial and Final Permutations) 후, 라운드 함수의 16회 적용, 역초기 치환으로 구성되어 있다.
(역초기 치환)
초기치환 IP의 숫자의 의미들은 "입력된 평문 비트의 초기치환 후의 위치"
1) f 함수
32비트를 48비트로 확장시키는 선형함수 E(Ex-panson)와 DES의 안전성에 중요 역할을 하는 S-Box 32비트 치환인 P(Permutation)으로 구성.
[시나리오 1]
[확장표 E]
32 1 2 3 4 5 4 5 6 7 8 9 8 9 10 11 12 13 12 13 14 15 16 17 16 17 18 19 20 21 20 21 22 23 24 25 24 25 26 27 28 29 30 31 32 1 |
원리:
● F 함수는 32비트의 입력을 확장표 E에 의해 48비트로 선형 확장되고 48비트의 라운드 키와 비트 단위로 XOR 연산을 한 후 8개의 lookup table(S-BOX)로 입력하여 32비트의 출력을 얻게 된다.
● 32비트의 S-BOX 출력은 32비트 치환인 P를 통과하여 최종 32비트 출력을 얻게 된다.
DES의 암호화 과정
암호문을 IP에 재배치 한다.(첫번째 블록) 첫번째 블록 64비트를 반으로 나누어 L1과 R1으로 나눈다. R1을 S-Box를 통해 f함수를 만들어 치환 한다. 치환한 값을 L1과 XOR연산 수행한다. L2와 R2의 위치를 바꾼다. 라운드가 끝날 때 까지 반복한다. |