[암호학] 2. DES의 심장, f-함수(f-function)를 C언어로 구현해보았다.
[암호학] 2. DES의 심장, f-함수(f-function)를 C언어로 구현해보았다.
DES Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
unsigned int IP[] = { ...
unsigned int inv_IP[] = { ...
unsigned int S[8][4][16] = { ...
unsigned int E[] = { ...
unsigned int P[] = { ...
void f_function(unsigned int *R, unsigned int *Key) {
unsigned int ER[49];
for (int i = 1; i < 49; i++){ //Expansion & Key XOR
ER[i] = R[E[i-1]];
ER[i] ^= Key[i];
}
unsigned int row;
unsigned int column;
for (int i = 0; i < 8; i++) //ER을 S박스에 넣어서 나온 값을 R에 넣기
{
row = (ER[i * 6 + 1] << 1) | ER[i * 6 + 6];
column = (ER[i * 6 + 2] << 3) | (ER[i * 6 + 3] << 2) | (ER[i * 6 + 4] << 1) | ER[i * 6 + 5];
R[i*4 + 1] = (S[i][row][column] >> 3) & 1; // 8의 자리
R[i*4 + 2] = (S[i][row][column] >> 2) & 1; // 4의 자리
R[i*4 + 3] = (S[i][row][column] >> 1) & 1; // 2의 자리
R[i*4 + 4] = (S[i][row][column] >> 0) & 1; // 1의 자리
}
unsigned int Final_R[33];
for (int i = 0; i < 32; i ++)
Final_R[i+1] = R[P[i]];
memcpy(R + 1, Final_R + 1, sizeof(unsigned int) * 32); //코드 복사
};
DES는 Feistel 네트워크 구조를 가진다. 여기서 가장 중요한 건 32비트 데이터를 48비트 키와 섞어 비선형적으로 변환하는 f-함수이다.
F-function 구조
- 확장(Expansion E): 32비트 데이터를 48비트로 확장
- 혼합(Key XOR): 라운드 키를 섞어 보안성 강화
- 치환(S-Box): 6비트씩 8개 뭉치를 비선형적으로 4비트씩 변환 (총 32비트로 출력)
- 전치(Permutation P): 비트 순서를 뒤섞어 확산(Diffusion) 효과 극대화
1
memcpy(R + 1, Final_R + 1, sizeof(unsigned int) * 32);
포인터 산술을 이용해 전치(Permutation)가 끝난 데이터를 원본 주소에 단숨에 덮었다. for 루프보다 훨씬 효율적인 방식 이라고 할 수 있다.
This post is licensed under CC BY 4.0 by the author.
