코딩/부채널 관련

[부채널] SEED CPA하기 두번째

controlpro 2021. 2. 2. 14:42
728x90

저번에 SEED를 CPA하기 위해서 파형을 정렬하고 plaintext와 ciphertext의 형태를 봐 보았다. 오늘은 직접 CPA하기 위해서 알고리즘을 부터 확인하자

 

첫번째 시간에도 말한 것처럼 S-box와 같은 비선형연산을 할 때 우리가 원하는 corrt가 하나의 key의 대응한다는 것을 증명했고, 이번에는 Seed에서 직접 적용을 해보자 

 

(추가로 S-box연산을 할때 값을 불러오는 과정에서 전력이 그만큼 소비되서 더 잘나온다.)

 

일단 SEED의 알고리즘 부터 확인을 해보자 

 

F함수의 알고리즘이다. S-box연산은 F 함수안에 G함수에서 진행되므로, 결국에는 K와 연산이되는 R 블록이 필요하다. 

즉 16bytes의 plaintext가 있을때 (PT[16] 배열로 대체) CPA할 때는 결과적으로 PT[8] ~ PT[15] 까지 필요하다

 

C와 D는 위의 R블록이 각각 4byte로 나누어진 것이고 각각 PT[8] ~ PT[11] , PT[12] ~ PT[15]와 대응 되게 된다. 

SEED의 RoundKey는 각각 8bytes이다 (RK[8]로 대체)

 

그러면 위의 Ki의 모습은 다음과 같다

 

K0 = RK[0] | RK[1] | RK[2] | RK[3]
K1 = RK[4] | RK[5] | RK[6] | RK[7]

 

그러면 결국 G 박스에 들어가기전에 연산 과정은 

 

(PT[8] | PT[9] | PT[10] | PT[11]) ^ (RK[0] | RK[1] | RK[2] | RK[3]

XOR 

(PT[12] | PT[13] | PT[14] | PT[15]) ^ (RK[4] | RK[5] | RK[6] | RK[7]

 

다음과 같다. 이를 Sbox에 들어가는 한블록으로 잘라서 봤을때는 다음과 같다. (1byte)

 

PT[8] ^ PT[12] ^ RK[0] ^ RK[4]

결국에는 S2box[PT[8] ^ PT[12] ^ RK[0] ^ RK[4]] 다음의 값이 들어간다. 

 

여기서 생기는 의문점? 

 

RK[0]과 RK[4]는 모르는데 동시에 추측을 해야하나???? 

 

그러면 2^8 * 2 ^8을 동시에 추측을 해야하는 데 굉장히 비효율적일 수밖에 없다. 

 

따라서 결론은 두 라운드키가 XOR된 값을 한번에 추측을 하자! , 즉 첫번째 CPA을 할때는 K0와 K1이 XOR된 값을 알아 낼수 있다. 

 

코드는 다음과 같다. 

 

\v 값으로 위에서 연산한 값을 넣고 xor 되는 연산값을 확인을 한다. 

나는 K = 0 * 16 으로 짰는데 다음과 같은 RoundKey를 얻을 수 있고, 위의 코딩에서는 7c와 c7값이 xor된 bb를 얻을 수 있고 최종적으로 이번 CPA에선, 0xBBB82E52의 값을 얻어야한다. 

최종적으로 전부 CPA를하면 다음과 같이 값을 얻을 수 있다.(마지막 블록 corrT값이 조금 낫긴한데 범위 조정잘하면 될거같다.)

 

 

 

728x90
반응형