지난번 포스트에서 AES 복호화 코딩에 대해 기록했는데 이번에는 고속화에 대해 기록하려 한다.
해당 그림을 보면 Inv_Shift Row -> Inv_Sub Byte -> Add Round key -> Inv_Mix Column순서로 한 라운드를 돈다.
고속화의 핵심은 우선 8bit짜리 16개의 블록을 32bit짜리 4블록으로 묶고, Inv_Sub Byte와 Inv_Mix Column연산을 묶은 Td테이블을 만들어 최대한 연산 수를 줄이는 것이다.
우선 Td 테이블을 제작한다.
Td[0]는 위 식에 기반해 S_box에 넣은 값과 연산하여 32bit로 만들어 256개의 원소를 가진 테이블을 제작한다.
위 방식대로 나머지 Td[1], Td[2], Td[3]도 마저 제작한다.
기본적인 세팅을 해준 뒤, AES_KeySchedule_32bit함수를 작성해준다.
RoundkeyGeneration128_32bit함수를 들어가면 대부분 RoundkeyGeneration128과 같지만 각각 8bit로 쪼개 주는 AES_KeyWordToByte함수가 없는 것을 알 수 있다.
이번엔 File_AES_Decryption_Optimization함수를 보자.
위는 File_AES_Decryption_Optimization함수의 일부분이다. 초기벡터를 CT에 넣고 key인 W를 거꾸로 넣는 것이 불편해 앞, 뒤 숫자를 바꿔주는 코드를 넣었다.
이 뒤에 KeyMixcolumns해주었는데, 총 두 가지 방법으로 성공했다.
첫 번째 방법은 키 W를 Td테이블에 SBox연산을 한 W를 넣는 방법이다.
두 번째 방법은 키 W를 AES_Inv_MixColumns에 넣고 돌리는 방법이다.
KeyMixcolumns을 해주는 이유는 복호화 순서가 Inv_Shift Row -> Inv_Sub Byte -> Add Round key -> Inv_Mix Column인데 가운데 Add Round key과정 때문에 Td테이블을 활용하기 위해 해 준 것이다. Mixcolumn은 선형연산으로 Mix(Sub_Byte^Add_Round_key)를 Mix(Sub_Byte)^Mix(Add_Round_key)로 분리할 수 있다. 해서 앞부분은 Td테이블을 활용, 뒤에는 KeyMixcolumns를 이용해 연산해준다.
KeyMixcolumns연산이 끝났다면 이제 본격적으로 128bit씩 파일에서 받아와 라운드를 돌리면 된다.
AES_DEC_Optimization을 보면 아까보다 훨씬 라운드가 간단해진 것을 볼 수 있다. 첫 번째 라운드에서 s에 32bit씩 넣어 Add Round key를 해주고 9라운드를 돌아주면 된다. 각 라운드를 잘 보면 Td테이블 연산과 동시에 Inv_Shift Row도 해주는 것을 볼 수 있다. 9라운드를 돌고나면 마지막 라운드는 Inv_Mix Column연산이 없음으로 Inv_Shift Row, Inv_Sub Byte, Add Round key만 해준다.
마지막으로 AES_CBC만 해주면 복호화가 끝난다.
위 코드는 팀원 RyuH님의 도움으로 대부분 작성되었습니다~!
'Cryptology > assignment' 카테고리의 다른 글
AES 복호화 코딩 고속화 source (key size : 128 bit) (0) | 2019.04.03 |
---|---|
AES 복호화 코딩 source (key size : 128 bit) (0) | 2019.04.03 |
AES 복호화 코딩 및 음악파일 제목 찾기 (key size : 128 bit) (0) | 2019.04.03 |