AES(Advanced Encryption Standard)는 미국 표준 기술 연구소 NIST에서 고안한 암호화 알고리즘이다.
이전에 존재했던 DES의 암호화 알고리즘을 보안해 나온 게 AES인데 향후 30년을 사용할 수 있을 정도의 안정성이 있다고 하며, 다양한 암호화 키의 길이를 갖춘 대칭형 암호 알고리즘이다.
현대에는 많이 사양되는 암호화의 표준 알고리즘이라고 볼 수 있다.
AES의 암호화 키는 128, 192, 256 bit를 가질 수 있는데 AES-128, AES-192, AES-256과 같이 표기한다.
AES128을 예로 암호화하는 알고리즘은 순서는 아래와 같다.
(AES-192는 12라운드 AES-256은 14라운드까지 있다.)
step-1
0(initial round)
AddRoundKey
step-2
1~9th round(9번 반복)
1-SubBytes
2-ShiftRows
3-MixColumns
4-AddRoundKey
step-3
10th(final) round
SubBytes
ShiftRows
AddRoundKey
1.
먼저 Key Expansion(key Schedule)이라는 단계에서 round에서 사용할 round key 11개를 생성해야한다.
(192는 13개, 256은 15개)
그리고 array[16]={0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}라는 16바이트의 데이터가 있다고 가정했을 때, 우선 아래와같이 정렬해야 한다.
아래와 같이 정렬된 행렬을 상태 행렬(state matrix)이라고 한다.
(AES-128=4x4, AES-192=4x6, AES-256=4x8)
0x01 | 0x05 | 0x09 | 0x0d |
0x02 | 0x06 | 0x0a | 0x0e |
0x03 | 0x07 | 0x0b | 0x0f |
0x04 | 0x08 | 0x0c | 0x10 |
2.
그다음 step-1에서 Add Round를 해줘야 하는데 step-1 에서는 그대로 사용한다.
3.
step-2에서 SubBytes를 진행한다.
SubBytes는 아래의 표와 위의 상태 행렬의 데이터를 대치해주는 과정이다.
4.
SubBytes를 한 결과값은 아래와 같다.
0x7c | 0x6b | 0x01 | 0xd7 |
0x77 | 0x6f | 0x67 | 0xab |
0x7b | 0xc5 | 0x2b | 0x76 |
0xf2 | 0x30 | 0xfe | 0xca |
5.
다음으로 ShiftRow이다. ShiftRow는 1번째 줄은 그대로 두고 2번째 줄은 왼쪽으로 1번, 3번째 줄은 왼쪽으로 2번 4번째 줄은 왼쪽으로 3번씩 밀어주면 된다.
결과값은 아래와 같다.
0x7c | 0x6b | 0x01 | 0xd7 |
0x6f | 0x67 | 0xab | 0x77 |
0x2b | 0x76 | 0x7b | 0xc5 |
0xca | 0xfe | 0x30 | 0xfe |
6.
다음으로 MixColumns은 아래와 같이 행렬을 곱해준다.
왼쪽 행렬이 고정값으로 정해진 건지 아닌지는 잘 모르겠으나 구글링을 해봤을 때 내가 찾아본 바에 의하면 모두 이 행렬이었다.(MixColumns 결과값은 패스...)
7.
다음은 AddRoundKey인데 1. 단계에서 Key Expansion 통해 생성한 Key를 바탕으로 XOR연산을 해준다.
8.
step-2의 과정을 8번 더 반복한다.
9.
step-3을 진행한다.
여기까지가 AES의 암호화 과정이며 복호화 과정은 반대로 진행하면 된다.
SubBytes의 반대로 하는 방법은 아래 차트를 참조해서 SubBytes와 똑같이 하면 된다.
ShiftRows 를 반대로 하는 방법은 반대로 오른쪽으로 밀면 된다.
아래 그래프행렬을 역으로 ShiftRows 하면
0x01 | 0x05 | 0x09 | 0x0d |
0x02 | 0x06 | 0x0a | 0x0e |
0x03 | 0x07 | 0x0b | 0x0f |
0x04 | 0x08 | 0x0c | 0x10 |
아래와 같이 되겠다.
0x01 | 0x05 | 0x09 | 0x0d |
0x0e | 0x02 | 0x06 | 0x0a |
0x0b | 0x0f | 0x03 | 0x07 |
0x08 | 0x0c | 0x10 | 0x04 |
여기까지 AES의 암호화와 복호화를 하는 방법을 정리해봤다.