지난번 포스트에서 AES 복호화 코딩에 대해 기록했는데 이번에는 고속화에 대해 기록하려 한다.

 

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[0] 테이블

우선 Td 테이블을 제작한다.

 

Td원리

Td[0]는 위 식에 기반해 S_box에 넣은 값과 연산하여 32bit로 만들어  256개의 원소를 가진 테이블을 제작한다.

위 방식대로 나머지 Td[1], Td[2], Td[3]도 마저 제작한다.

 

main 함수

기본적인 세팅을 해준 뒤, AES_KeySchedule_32bit함수를 작성해준다.

 

RoundkeyGeneration128_32bit

RoundkeyGeneration128_32bit함수를 들어가면 대부분 RoundkeyGeneration128과 같지만 각각 8bit로 쪼개 주는 AES_KeyWordToByte함수가 없는 것을 알 수 있다.

 

이번엔 File_AES_Decryption_Optimization함수를 보자. 

 

File_AES_Decryption_Optimization_1

 

위는 File_AES_Decryption_Optimization함수의 일부분이다. 초기벡터를 CT에 넣고 key인 W를 거꾸로 넣는 것이 불편해 앞, 뒤 숫자를 바꿔주는 코드를 넣었다.

 

이 뒤에 KeyMixcolumns해주었는데,  총 두 가지 방법으로 성공했다. 

 

KeyMixcolumns_1

 

첫 번째 방법은 키 W를 Td테이블에 SBox연산을 한 W를 넣는 방법이다.

 

KeyMixcolumns_2

두 번째 방법은 키 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를 이용해 연산해준다.

 

File_AES_Decryption_Optimization_2

 

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

마지막으로 AES_CBC만 해주면 복호화가 끝난다.

 

위 코드는 팀원 RyuH님의 도움으로 대부분 작성되었습니다~!

팀 프로젝트 과제로 AES 암호화 (key size : 128 bit)된 mp3 파일을 해독하여 노래 제목을 찾는 과제가 나왔다.

 

과제 조건

조건은 이 정도.

 

u8, u32 설정

u8과 u32를 설정해주고

 

inv_Sbox 생성 함수

위 함수로 inv_Sbox를 생성해 준다. 

 

inv_Sbox

inv_Sbox를 코드에 넣어주고

 

main

main 문 작성. mp3파일을 올려야 해서 fp사용.

 

File_AES_Decryption

File_AES_Decryption 함수를 작성. 기본적인 CT, PT, IV(초기 벡터), MK, RK, keysize 등을 설정해준다.

 

RoundkeyGeneration128

AES_KeySchedule에서  key가 128bit임으로 RoundkeyGeneration128 함수로 건너뛰어서 함수를 작성한다.

 

Rcon

Rcon을 설정해주고,

 

AES_RotWord & AES_SubWord

AES_RotWord(key shift column)와 AES_SubWord(Sbox 대입)를 설정해준다.

 

AES_Roundkey_4words_generation

AES_Roundkey_4words_generation로 각 라운드 키를 마저 만들어주고,

 

AES_KeyWordToByte

AES_KeyWordToByte로 32bit로 묶여있던 W배열을 8bit로 다시 쪼개 준다.

 

AES_KeySchedule을 다 수행했으므로 다시  File_AES_Decryption로 돌아간다.

 

File_AES_Decryption_2

현재 CBC모드로 암호화가 되어있기 때문에 CT에 초기 백터를 넣어준 후, 파일을 128bit만큼 각각 쪼개서 파일이 끝날 때까지 while문을 돌려 복호화해주는 방식으로 코드를 작성했다.

 

AES_DEC

AES_DEC 코드를 보면 AES_LRound(AES_Inv_MixColumn 없음), AES_Round, AES_Inv_AddRoundKey 순서로 함수를 돌면서 복호화되도록 코드를 작성했다.

 

AES_CBC

마지막으로 AES_CBC를 돌면서 복호화가 끝난다.

 

위 코드는 팀원 RyuH님의 도움으로 대부분 작성되었습니다~!

+ Recent posts