AES(Advanced Encryption Standard)란?
AES란 대칭키 블록암호의 종류로 직역하면 고급 암호화 표준이다. DES가 더이상 안전하지 않게되자 이를 대체하기 위해 NSA가 공개적으로 투명한 연구를 진행하며 선정한 높은 안정성(부르트 포스 방지)과 빠른 속도를 가진 암호 알고리즘이다. DES 처럼 반복되는 암호블록 형식을 띄고 있지만 페이스텔 암호는 아니다.
AES 종류
AES-128 : 블록 크기가 128비트로 9번의 라운드를 반복한다
AES-192 : 블록 크기가 192비트로 11번의 라운드를 반복한다
AES-256 : 블록 크기가 256비트로 13번의 라운드를 반복한다
AES의 구조 및 알고리즘
좌측이 암호화 알고리즘, 우측이 복호화 알고리즘이다. 전반적인 루트는 비슷하다.
암호화에서 사용하는 세부적인 알고리즘(각 단계)는 다음과 같다
Add Round Key
Sub Byte
Shift Row
Mix Column
복호화에서 사용하는 세부적인 알고리즘(각 단계)는 다음과 같다
Add Round Key
Inv_Shift Row
Inv_Sub Byte
Inv_Mix Column
Add Round Key
이 과정은 단순히 받아들인 키와 데이터를 XOR연산을 한다
Sub Byte
이 과정은 각 바이트를 S-box(Substitution Box)에 있는 바이트들과 치환한다
암호화시 S-box는 다음과 같다
--- | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
00 | 0x63 | 0x7C | 0x77 | 0x7B | 0xF2 | 0x6B | 0x6F | 0xC5 | 0x30 | 0x01 | 0x67 | 0x2B | 0xFE | 0xD7 | 0xAB | 0x76 |
10 | 0xCA | 0x82 | 0xC9 | 0x7D | 0xFA | 0x59 | 0x47 | 0xF0 | 0xAD | 0xD4 | 0xA2 | 0xAF | 0x9C | 0xA4 | 0x72 | 0xC0 |
20 | 0xB7 | 0xFD | 0x93 | 0x26 | 0x36 | 0x3F | 0xF7 | 0xCC | 0x34 | 0xA5 | 0xE5 | 0xF1 | 0x71 | 0xD8 | 0x31 | 0x15 |
30 | 0x04 | 0xC7 | 0x23 | 0xC3 | 0x18 | 0x96 | 0x05 | 0x9A | 0x07 | 0x12 | 0x80 | 0xE2 | 0xEB | 0x27 | 0xB2 | 0x75 |
40 | 0x09 | 0x83 | 0x2C | 0x1A | 0x1B | 0x6E | 0x5A | 0xA0 | 0x52 | 0x3B | 0xD6 | 0xB3 | 0x29 | 0xE3 | 0x2F | 0x84 |
50 | 0x53 | 0xD1 | 0x00 | 0xED | 0x20 | 0xFC | 0xB1 | 0x5B | 0x6A | 0xCB | 0xBE | 0x39 | 0x4A | 0x4C | 0x58 | 0xCF |
60 | 0xD0 | 0xEF | 0xAA | 0xFB | 0x43 | 0x4D | 0x33 | 0x85 | 0x45 | 0xF9 | 0x02 | 0x7F | 0x50 | 0x3C | 0x9F | 0xA8 |
70 | 0x51 | 0xA3 | 0x40 | 0x8F | 0x92 | 0x9D | 0x38 | 0xF5 | 0xBC | 0xB6 | 0xDA | 0x21 | 0x10 | 0xFF | 0xF3 | 0xD2 |
80 | 0xCD | 0x0C | 0x13 | 0xEC | 0x5F | 0x97 | 0x44 | 0x17 | 0xC4 | 0xA7 | 0x7E | 0x3D | 0x64 | 0x5D | 0x19 | 0x73 |
90 | 0x60 | 0x81 | 0x4F | 0xDC | 0x22 | 0x2A | 0x90 | 0x88 | 0x46 | 0xEE | 0xB8 | 0x14 | 0xDE | 0x5E | 0x0B | 0xDB |
A0 | 0xE0 | 0x32 | 0x3A | 0x0A | 0x49 | 0x06 | 0x24 | 0x5C | 0xC2 | 0xd3 | 0xAC | 0x62 | 0x91 | 0x95 | 0xE4 | 0x79 |
B0 | 0xE7 | 0xC8 | 0x37 | 0x6D | 0x8D | 0xD5 | 0x4E | 0xA9 | 0x6C | 0x56 | 0xF4 | 0xEA | 0x65 | 0x7A | 0xAE | 0x08 |
C0 | 0xBA | 0x78 | 0x25 | 0x2E | 0x1C | 0xA6 | 0xB4 | 0xC6 | 0xE8 | 0xdD | 0x74 | 0x1F | 0x4B | 0xBD | 0x8B | 0x8A |
D0 | 0x70 | 0x3E | 0xB5 | 0x66 | 0x48 | 0x03 | 0xF6 | 0x0E | 0x61 | 0x35 | 0x57 | 0xB9 | 0x86 | 0xC1 | 0x1D | 0x9E |
E0 | 0xE1 | 0xF8 | 0x98 | 0x11 | 0x69 | 0xD9 | 0x8E | 0x94 | 0x9B | 0x1E | 0x87 | 0xE9 | 0xCE | 0x55 | 0x28 | 0xDF |
F0 | 0x8C | 0xA1 | 0x89 | 0x0D | 0xBF | 0xE6 | 0x42 | 0x68 | 0x41 | 0x99 | 0x2D | 0x0F | 0xB0 | 0x54 | 0xBB | 0x16 |
복호화시 Inv_S-box는 다음과 같다
--- | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
00 | 0x52 | 0x09 | 0x6A | 0xD5 | 0x30 | 0x36 | 0xA5 | 0x38 | 0xBF | 0x40 | 0xA3 | 0x9E | 0x81 | 0xF3 | 0xD7 | 0xFB |
10 | 0x7C | 0xE3 | 0x39 | 0x82 | 0x9B | 0x2F | 0xFF | 0x87 | 0x34 | 0x8E | 0x43 | 0x44 | 0xC4 | 0xDE | 0xE9 | 0xCB |
20 | 0x54 | 0x7B | 0x94 | 0x32 | 0xA6 | 0xC2 | 0x23 | 0x3D | 0xEE | 0x4C | 0x95 | 0x0B | 0x42 | 0xFA | 0xC3 | 0x4E |
30 | 0x08 | 0x2E | 0xA1 | 0x66 | 0x28 | 0xD9 | 0x24 | 0xB2 | 0x76 | 0x5B | 0xA2 | 0x49 | 0x6D | 0x8B | 0xD1 | 0x25 |
40 | 0x72 | 0xF8 | 0xF6 | 0x64 | 0x86 | 0x68 | 0x98 | 0x16 | 0xD4 | 0xA4 | 0x5C | 0xCC | 0x5D | 0x65 | 0xB6 | 0x92 |
50 | 0x6C | 0x70 | 0x48 | 0x50 | 0xFD | 0xED | 0xB9 | 0xDA | 0x5E | 0x15 | 0x46 | 0x57 | 0xA7 | 0x8D | 0x9D | 0x84 |
60 | 0x90 | 0xD8 | 0xAB | 0x00 | 0x8C | 0xBC | 0xD3 | 0x0A | 0xF7 | 0xE4 | 0x58 | 0x05 | 0xB8 | 0xB3 | 0x45 | 0x06 |
70 | 0xD0 | 0x2C | 0x1E | 0x8F | 0xCA | 0x3F | 0x0F | 0x02 | 0xC1 | 0xAF | 0xBD | 0x03 | 0x01 | 0x13 | 0x8A | 0x6B |
80 | 0x3A | 0x91 | 0x11 | 0x41 | 0x4F | 0x67 | 0xDC | 0xEA | 0x97 | 0xF2 | 0xCF | 0xCE | 0xF0 | 0xB4 | 0xE6 | 0x73 |
90 | 0x96 | 0xAC | 0x74 | 0x22 | 0xE7 | 0xAD | 0x35 | 0x85 | 0xE2 | 0xF9 | 0x37 | 0xE8 | 0x1C | 0x75 | 0xDF | 0x6E |
A0 | 0x47 | 0xF1 | 0x1A | 0x71 | 0x1D | 0x29 | 0xC5 | 0x89 | 0x6F | 0xB7 | 0x62 | 0x0E | 0xAA | 0x18 | 0xBE | 0x1B |
B0 | 0xFC | 0x56 | 0x3E | 0x4B | 0xC6 | 0xD2 | 0x79 | 0x20 | 0x9A | 0xDB | 0xC0 | 0xFE | 0x78 | 0xCD | 0x5A | 0xF4 |
C0 | 0x1F | 0xDD | 0xA8 | 0x33 | 0x88 | 0x07 | 0xC7 | 0x31 | 0xB1 | 0x12 | 0x10 | 0x59 | 0x27 | 0x80 | 0xEC | 0x5F |
D0 | 0x60 | 0x51 | 0x7F | 0xA9 | 0x19 | 0xB5 | 0x4A | 0x0D | 0x2D | 0xE5 | 0x7A | 0x9F | 0x93 | 0xC9 | 0x9C | 0xEF |
E0 | 0xA0 | 0xE0 | 0x3B | 0x4D | 0xAE | 0x2A | 0xF5 | 0xB0 | 0xC8 | 0xEB | 0xBB | 0x3C | 0x83 | 0x53 | 0x99 | 0x61 |
F0 | 0x17 | 0x2B | 0x04 | 0x7E | 0xBA | 0x77 | 0xD6 | 0x26 | 0xE1 | 0x69 | 0x14 | 0x63 | 0x55 | 0x21 | 0x0C | 0x7D |
테이블 사용법은 아래와 같이 4bit씩 확인하면 된다
Shift Row
각 행들을 시프트 연산을 하는 과정이다. 한 행이 내려갈 수록 시프트 크기가 1씩 커진다
아래는 암호화시 행해지는 shift row 과정이다
|
|
|
| --- Left Shift 0 --> | ||||
|
|
|
| --- Left Shift 1 --> | ||||
|
|
|
| --- Left Shift 2 --> | ||||
|
|
|
| --- Left Shift 3 --> |
암호화 시에는 0,1,2,3 순으로 시프트가 이루어지고, 복호화 시에는 0,3,2,1 순으로 이루어진다.
Mix Columns
이 단계가 이해하기까지 가장 오래걸렸다. 아래 과정을 보자
a를 c와 연산하여 b를 도출한다. 이때 이 특수연산은 다음과 같다 (위의 c행렬은 아래의 [2 3 1 1 ... ] 과 같다)
위의 그림에서 볼 수 있듯이 a[0] * [ 2 3 1 1 ] = r[0] 와 같은 방식으로 진행된다
위의 연산에서 곱하기를 AES에서는 x2 연산(xtime 방식)과 +1 연산을 통해 구현된다
예를 들자면 x3의 경우 x2+1 이런식으로 구현될 수 있다는 말과 같다
최근에는 속도 향상을 위해 계산과정 없이 거대한 룩업 테이블을 이용해서 치환한다고 한다
'Study > crypto' 카테고리의 다른 글
블록암호(Block Cipher) #DES (4) | 2018.04.23 |
---|---|
블록암호(Block Cipher) #페이스텔(Feistel) (0) | 2018.04.22 |
스트림 암호(Stream Cipher) #RC4 (2) | 2018.04.22 |
스트림 암호(Stream Cipher) #A5/1 (0) | 2018.04.22 |
암호분석(Crytanalysis) (0) | 2018.04.22 |