controlpro
[부채널] SEED CPA 하기 세번째 본문
두번째 스토리에서 CPA를 이용해서 K0와 K1의 xor된 값을 얻을 수 있었다.
이번에는 완전한 K0와 K1의 쌍을 얻어보자
저번에는 첫번째 g에서 CPA를 했지만 이번에는 두번째 G에서 CPA를 해서 K0를 찾아내자
내가 결국 K0와 K1의 연산값을 알고 있으면 결국에는 왼쪽으로 가는 화살표의 연산값을 계산할 수 있다.
ex) SEED_G(C ^ D ^ K0 ^ K1) => K0 ^ K1는 CPA로 알아낸 값
그래서 위에서 아래로 내려오는 값은 C ^ K0값 즉
(RK[0] | RK[1] | RK[2] | RK[3]) ^ (PT[8] |PT[9] | PT[10] | PT[11]) |
다음과 같고 이번에는 RK[0] ~ RK[3] 까지만 연산에 사용되기 때문에 따로 알아낼 수 있다.
코드는 다음과같다.
코드 설명을 하면 R0 = C , R1 = D이고 Guesskey 는 위에서 CPA해서 얻어낸 값이다. 이 값을 XOR하고 G연산을 거치면 위에서본 왼쪽으로 가는 화살표의 값이 완성이 되고
temp2에서는 +연산을 거치고 나서의 최하위 1byte값이 저장된다. 이 값이 iv값이 되고 이 블록의 값 7E가 나온다.
하지만 다음블록은 조금 신경쓸 부분이 있다. 바로 +연산할 때 생기는 문제점이다.
4byte값을 한번에 더할 때는 문제가 생기지 않는데 , 1byte씩 덧셈을 할때는 carry값을 고려해야한다. 그림으로 보면
다음과 같은 상황에서는 어짜피 mod 2 ^ 32에서 이루어지니까 unsigned long 형을 사용하면 상관이 없는데
1byte씩 덧셈을 할때는 빨간색 화살표 처럼 1byte + 1byte의 값이 0xff가 넘었을 때를 생각해줘야한다.
그래서 다음블록 부터는 carry값을 계산하는 부분이 추가가된다.
이런식으로 carry값을 전부다 고려해주면서 계산을 하면 다음과 같이 나온다.
첫번째 KEY값을 구했다
결론적으로 0x7c8f8c7e ^ 0xbbb82e52 = 0xc737a22c가 나오므로 첫번째 RoundKey를 전부다 알 수 있다!!
최종적으로는 KEY를 복구하기 위해서는 두번째 RoundKey의 값까지 알아야 한다. (범위를 조정해주면된다.)
다음과 같이 한라운드를 돌려주고 위의 과정과 똑같이 진행해주면된다.
그럼
최종적으로 2라운드 key를 얻을 수 있다.!
'코딩 > 부채널 관련' 카테고리의 다른 글
[부채널 해상도 복원] 연구 (0) | 2021.11.01 |
---|---|
[부채널] SEED CPA하기 두번째 (0) | 2021.02.02 |
[부채널] SEED CPA 하기 첫번째(기본적인 setting) (0) | 2021.01.26 |
[Coding] 필요한 알뜰신잡 (0) | 2020.12.16 |
[Coding] correlation (0) | 2020.12.15 |