controlpro

[CryptoGraphy] SEED 공부 본문

암호학/알고리즘

[CryptoGraphy] SEED 공부

controlpro 2020. 12. 18. 21:50
728x90

부채널 공부를 하면서 다양한 암호 알고리즘을 스스로 정리하고 공부해야겠다는 생각에 쓴다.

 

참고는 kisa에서 제공하는 seed 128bit 알고리즘 상세 명세서를 보았다. 

 

1. 기본 알고리즘의 형태

 

기본적인 알고리즘의 형태는 Feistel 구조로 이루어져 있고 128bit의 평문과 128bit의 키를 입력을 거치고 총 16 Round를 진행

<SEED 알고리즘>

기본적인 알고리즘의 구조를 보면 128bit를 64bit씩 쪼개서 각각 L0 와 R0으로 나눠지고 하나의 Round를 거칠 때 마다 블록이 크로스(?)형태를 띈다. 하나의 블록이 F - 함수를 거치면서 계속해서 암호화되는 구조이다. 

 

2. F-함수

문서에 써져 있는 대로 표현해보자면 우리가  SPN 구조와 다르게 Feistel 구조는 F 함수의 특성에 따라 구분이된다. 

여기서 간단하게 Feistel 구조의 특징을 알아보면

Feistel 암호의 강도를 결정짓는 요소

1. 평문 블록 길이

2. 키의 길이

3. 라운드의 수

복호화 과정의 보조키 Ki 의 입력순서는, 암호화 과정의 입력 순서와 반대가 됨 (암호화 할때 넣은 반대로 넣어주면 됨)

출처 : makeperfect.tistory.com/5

SEED에서 F 함수의 구조를 보면 

<F-함수의 구조>

각각 C와 D 블록은 위에서 진행된 L0 또는 R0(64bit)를 반으로 쪼갠 32bit로 구성이 되어있다. 또한 내부함수 G에 의해서 Sbox 연산도 거친다. 

3. G-함수

G함수는 다시한번 32bit로 쪼개진 C나 D를 가지고 8bit로 나누어줘서 각각 Sbox1 혹은 Sbox2에 들어가서 각각 복잡하게  서로와 서로가 Xor 연산을 거치게 된다. 

 

void SEED_G(ULONG* S)
{
	UCHAR  Y[4];
	
	Y[0] = SEED_S1box[((*S) >>  0) & 0xFF];
	Y[1] = SEED_S2box[((*S) >>  8) & 0xFF];		
	Y[2] = SEED_S1box[((*S) >> 16) & 0xFF];
	Y[3] = SEED_S2box[((*S) >> 24) & 0xFF];
	
	(*S) = ((ULONG)((Y[0] & 0xFC) ^ (Y[1] & 0xF3) ^ (Y[2] & 0xCF) ^ (Y[3] & 0x3F)) <<  0) |
		   ((ULONG)((Y[0] & 0xF3) ^ (Y[1] & 0xCF) ^ (Y[2] & 0x3F) ^ (Y[3] & 0xFC)) <<  8) |
	       ((ULONG)((Y[0] & 0xCF) ^ (Y[1] & 0x3F) ^ (Y[2] & 0xFC) ^ (Y[3] & 0xF3)) << 16) |
	       ((ULONG)((Y[0] & 0x3F) ^ (Y[1] & 0xFC) ^ (Y[2] & 0xF3) ^ (Y[3] & 0xCF)) << 24) ;
}

다음과 같은 C함수로 구현할 수 있다. 

 

3. Sbox1 ,Sbox2

<Sbox>

3. Roundkey 생성

아까 SEED의 암호화에 사용되는 KEY의 길이가 128bit라는 것은 기억할 태고, 다시 이 128bit를 A, B , C ,D라는 블록으로 나누어서 아래 보이는 연산을 거쳐서 KEY가 생성된다.

728x90
반응형

'암호학 > 알고리즘' 카테고리의 다른 글

[알고리즘] PIPO Masking 구현  (0) 2021.10.15
[암호 코딩] SEED 코딩  (0) 2021.01.08