Crypto

AES의 정의와 암호화 알고리즘 순서

총알 2022. 11. 2. 18:10
728x90

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는 아래의 표와 위의 상태 행렬의 데이터를 대치해주는 과정이다.

치환 변환 테이블(SBox) - 출처 나무wiki

 

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와 똑같이 하면 된다.

치환 변환 테이블(inv-SBox) - 출처 나무wiki

 

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의 암호화와 복호화를 하는 방법을 정리해봤다.

728x90

'Crypto' 카테고리의 다른 글

HASH에 관하여  (0) 2022.11.03
CCM(Counter with CBC-MAC) 과 GCM(Galois / Counter Mode)의 차이  (0) 2022.11.03
CBC와 ECB  (0) 2022.11.03
ECDSA란?  (0) 2022.11.02
RSA란...?  (0) 2022.11.01