constWORLDant

DES 본문

0x05 Crypto

DES

data type ConS_tanT 2017.06.22 04:17


목표: 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의 위치를 바꾼다. 

라운드가 끝날 때 까지 반복한다.




'0x05 Crypto' 카테고리의 다른 글

DES  (0) 2017.06.22
0 Comments
댓글쓰기 폼