본문 바로가기

암호학/대칭키암호

1. AES

1) AES란

AES(Advanced Encryption Standard)는 고급 암호화 표준이라 불린다.

대칭키 암호이기 때문에 같은 키로 암호화와 복호화를 진행한다.

SPN 구조를 사용하고 한 라운드 안에 4개의 처리과정이 있다.

*SPN 구조(Substitution Permutation Network) : 입력을 나눈 후 Sbox에 치환시킨다. 그리고 재배열 시키는 구조

암호화와 복호화가 같은 구조로 되어있지만, 복호화할 때 역함수를 짜야하는 함수들이 있다.

2) AES의 규격

1. AES의 블록 길이 : 128 bit

2. AES의 키 길이 : 128, 192, 256 bit

3. AES의 라운드수 : 10, 12, 14 라운드

 

3) AES의 구조

1. SubBytes

=> Sbox에 치환한다. // 역함수가 필요하다.

2. ShiftRows

=> 각 행별로 규칙적으로 이동한다. // 역함수가 필요하다.

3. MixColumns

=> 각 열별로 행렬계산을 한다. // 역함수가 필요하다.

4. AddRoundKey

=> 현재 상태와 라운드키를 xor를 한다.

=> 라운드키를 생성하는 키스케쥴 함수가 있다.

 

이 4개의 과정을 한 라운드로 하며, 처음에 시작할 때는 입력값과 AddRoundkey를 먼저 진행한다.

마지막 라운드에서는 MixColumn이 없다.

4) AES의 복호화

AES의 암호화 과정을 바로 뒤집으면 복호화가 된다. 하지만 앞에서 말했듯이 암호화와 복호화의 과정을 같게 해주기 위해서는 함수의 순서바꿈이 필요하다. 또, 연산을 미리하여 테이블로 만든 후 빠르게 연산할 수 있도록 해줄 수도 있다.

이는 하나씩 알아보도록 하고, 일단 바로 뒤집었을 때의 경우 먼저 알아보자.

먼저, 암호화에서 AddRoundKey를 먼저 진행한 다음의 진행과정부터 라운드라 했기 때문에 복호화에서도 동일하게 해보자.

 

1. InvShiftRows

2. InvSubBytes

3. AddRoundKey

4. InvMixColumns

 

이러한 꼴이 나온다. InvShiftRows와 InvSubBytes는 순서를 바꾸어도 결과에 영향을 끼치지 않는다.

그러면,

1. InvSubBytes

2. InvShiftRows

3. AddRoundKey

4. InvMixColumns

 

또, InvMixColumns를 진행하는 함수는 선형함수이기 때문에 InvMixColumns와 AddRoundKey 순서를 바꿀 수 있다.

하지만 AddRoundKey도 InvMixColumns를 진행해야 가능하다.

InvMixColums(state xor RoundKey) = InvMixColums(state) xor InvMixColums(RoundKey)

그러면 최종적으로

1. InvSubBytes

2. InvShiftRows

3. InvMixColumns

4. AddRoundKey

 

이는 Inverse 함수라는 걸 제외하면 암호화의 구조가 같다.

구조를 같게 하면, 함수만 바꾸면 암호화와 복호화를 빠르게 할 수 있다.

더 빠르게 하려면, 미리 연산을 테이블화 해서 만들어 놓는 방법이 있다.

 

다음글에서는 AES의 암호화를 코딩해보도록 하겠다.

'암호학 > 대칭키암호' 카테고리의 다른 글

1.3 [C++] AES 구현  (0) 2022.01.07
1.2 [C++] AES 구현  (0) 2022.01.06
1.1 [C++] AES 구현  (0) 2021.12.29
0. 대칭키암호  (0) 2021.12.23