DES

2017. 6. 22. 04:170x05 Crypto

728x90

 

목표: 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의 위치를 바꾼다. 
라운드가 끝날 때 까지 반복한다.