[부채널] SEED CPA하기 두번째
저번에 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값이 조금 낫긴한데 범위 조정잘하면 될거같다.)