ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 국가암호공모전 2018 (II-A)분야 4번 문제
    문제 풀이/2018 국가암호공모전 2020. 2. 26. 19:05

    현재 작성중인 글입니다. 좀 걸릴 것 같아서, 일단 대회때 제출했던 답안을 올렸습니다. 궁금한게 있으시면 댓글 부탁드립니다.

     

    1. 마지막 라운드 키의 첫 번째 바이트 rk0(10)의 값 : 54

     

    2. 1.의 풀이과정

    캐시 부채널 공격을 통하여 라운드 키를 복구할 수 있다. 공격 대상자 V는 AES-128 암호연산을 수행하는 소프트웨어이며, 공격자 A는 암호연산이 종료된 후 캐시 부채널을 통해 V의 메모리 엑세스 여부를 파악할 수 있다. 문제에서 주어진 제한조건은, A는 단 하나의 메모리 블록(64바이트)에 대해서만 정보를 얻을 수 있다는 것이다. 메모리 블록에 대한 정보를 바탕으로 AES-128 암호연산 중 마지막 라운드 키의 첫 번째 바이트 rk0(10)의 값을 구하는 것이 목표이다.

     

    문제를 풀기 위한 아이디어를 얻기 위해, 암호문 바이트 x0(10)의 값이 가장 높은 16개의 카운터에 대응하는 값 중 하나라고 가정하자. 또한 10번째 라운드 연산은 다음과 같이 수행된다.

    1번 식

    문제에서 제시된 x0(10) 바이트는 다른 바이트 값과 비교하여 T2의 9번째 메모리 블록에 접근한 횟수가 많다. 암호연산을 충분한 횟수만큼 반복했으므로 제시된 x0(10) 바이트는 T2의 9번째 메모리 블록에 접근하게 되는

    이의 값이어야 한다.

    문제에서 주어진 정보는 총 256개의 x0(10) 바이트 값 중에서 가장 높은 16개의 카운터에 대응하는 바이트가 주어졌다. T2의 9번째 메모리 블록의 0번째 바이트 16개(T2[x0(9)][0])도 aes_table.c 내부에 Te2 테이블로써 제시되었다. rk0(10)의 값을 0부터 255까지 각각 확인하여 "1번식" 을 만족하도록, 즉 T2의 9번째 메모리 블록의 0번째 바이트 16개와 rk0(10)의 값을 각각의 rk0(10)에 대해 XOR 연산하여 그 결과가 가장 높은 16개의 카운터에 대응하는 x0(10) 바이트와 일치하면 그 때의 rk0(10)값이 지막 라운드 키의 첫 번째 바이트임을 알 수 있다.

     

    코드는 다음과 같으며, 아래에 작성하였다. result array는 x0(10), cache array는 T2의 9번째 메모리 블록의 0번째 바이트, i는 rk0(10)에 대응된다.

    cache = [0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73] #cache's 9th table
    result = [0x0b,0x21,0x25,0x2f,0x3a,0x45,0x48,0x52,0x69,0x6b,0x72,0x91,0xa1,0xda,0xf2,0xfb]
    
    for i in range(256):
        counter = 0
        for c in cache:
            if (i ^ c) in result:
                counter += 1
            if counter == 16:
                print i #print: 54

     

    댓글

Designed by Tistory.