
안녕하십니까 코딩 파인애플입니다
이번 시간에는 AES 알고리즘에 관해 알아보겠습니다.
들어가기 앞서 https://www.youtube.com/watch?v=gP4PqVGudtg 영상을 시청하면 좋을 것 같습니다
AES는 Advanced Encryption Standard (고급 암호화 표준)의 약자로 현재 가장 널리 사용되는 대칭키 암호화 알고리즘 중 하나입니다
대칭키 암호화란?
암호화할 때 키와 복호화할 때의 사용하는 키가 같은 방식이다
AES의 알고리즘과 규격은 공개되어 있어 누구나 구현하고 사용할 수 있습니다
AES-128을 기준으로 설명하자면
AES-128의 가장 중요한 특징은 데이터를 128비트 단위로 처리합니다
128/8=16byte의 데이터가 있다고 가정하였을 때 ABCDEFGHIJKLMNOP
A B C D
E F G H
I J K L
M N O P
컴퓨터는 이를 내부적으로 4*4 의 표 형태로 만듭니다
이것을 상태 배열이라 부릅니다
AES는 다음과 같은 과정을 거칩니다
(KeyExpansion) SubBytes -> ShiftRows -> MixColumns -> AddRoundKey
여기서 이 과정 한 번을 Round라 부릅니다
KeyExpansion은 128비트 원본 키 하나로부터, 각 라운드마다 사용할 128비트 라운드 키를 생성해내는 과정입니다.
AES-128은 초기 AddRoundKey 1번 + 10라운드에서 각 1번씩, 총 11번의 AddRoundKey를 수행하는데, 이때마다 서로 다른 라운드 키가 필요합니다
이 11개의 라운드 키를 원본 키 하나로부터 만들어내는 게 바로 KeyExpansion입니다.
원본 128비트 키를 4바이트씩 4개의 워드로 나눕니다: W0, W1, W2, W3.
이후 W4부터는 이전 워드들을 이용해 새로운 워드를 계속 만들어나가는데, 4워드마다(=새로운 라운드 키가 시작될 때마다) 특별한 처리를 거칩니다
앞으로의 연산은 KeyExpansion의 별도의 알고리즘으로 처리되는 전용 연산들입니다
RotWord : 워드 안의 4바이트를 왼쪽으로 한 칸 순환 이동
[a, b, c, d] → [b, c, d, a]
SubWord : SubBytes와 같은 S-box를 이용해 워드의 각 바이트를 치환
Rcon(라운드 상수) XOR : 라운드마다 정해진 고정 상수와 XOR
이 세 단계를 다 거친 뒤
이렇게 RotWord → SubWord → Rcon XOR을 거친 결과를, 4워드 전에 만들어진 워드와 XOR해서 새 워드를 만듭니다.
새 워드 = (RotWord → SubWord → Rcon XOR 결과) XOR (4워드 전 워드)
예를 들어 W4를 만들 땐 W0와, W8을 만들 땐 W4와 XOR하는 식입니다
그 과정에서 반들어진 W4~W43 (총 44개 워드) 가 순차적으로 다 만들어지면 4워드씩 묶은 게 각각 하나의 라운드 키가 되고, 이 라운드키[1]부터 라운드키 [10]까지 총 10개 (+원본 키인 라운드키 [0]가 완성됩니다
그렇게 만들어진 11개의 라운드 키가 실제 암호화 과정에서 AddRoundKey 단게마다 하나씩 순서대로 사용됩니다.
각각의 값을 다른 값으로 바꿉니다
AES에는 미리 정해져 있는 S-Box라는 변환표가 있는데
이를 기준으로 값을 매칭시켜 매칭한 값으로 바꿉니다
(S-BOX 변환표)
예를 들어 0x53이라는 값을 매칭한다면 0xED가 되는 식입니다
4×4 배열의 각 줄을 왼쪽으로 조금씩 이동시킵니다
A B C D
E F G H
I J K L
M N O P
4×4 State 배열의 각 행을 왼쪽으로 순환 이동시킵니다
0번째 행은 그대로 두고, 1번째 행은 1칸, 2번째 행은 2칸, 3번째 행은 3칸 왼쪽으로 이동합니다.
이를 최대 3번 인덱스까지 밀어낸다면 다음과 같은 배열이 나오게 됩니다
A B C D # X
F G H E # 한 번 밀어냄
K L I J # 두 번 밀어냄
P M N O # 세 번 밀어냄
위 내용은 살짝 복잡한데 간단히 말하면 열을 섞는데 이제 섞는 걸
아래의 행렬과 각각의 열(Column)들을 곱해주는 연산을 해줍니다

2 3 1 1
1 2 3 1
1 1 2 3
3 1 1 2
위 이미지처럼 정해진 배열과 함께 행렬연산을 통해 곱해줍니다
하지만 16진수에서 곱셈을 어떻게하냐?
*1은 아무것도 안하고
*2는 왼쪽으로 한 번 쉬프트를 해줍니다 단, 순환 쉬프트가 아니라서 맨 오른쪽 비트는 0으로 채워집니다
마지막으로 *3의 경우 좌로 한 번 시프트 후 원래의 값을 더해줍니다 (단 +는 XOR 연산)
(단 마지막 10번째 라운드에는 MixColumns 과정을 생략한다)
현재 State와 해당 라운드에서 사용할 Round Key를 XOR하는 과정입니다
예를 들어 State의 한 바이트가 10110101이고 Round Key의 해당 바이트가 01100110이라면 XOR하여 11010011이라는 값이 산출됩니다
각각의 숫자는 원본 키의 비트 길이를 뜻합니다 셋 다 처리하는 블록 크기는 똑같이 128비트 (16바이트) 이지만 키 길이와 라운드 수가 달라집니다
| 키 길이 | 라운드 수 | 라운드 키 개수 | |
|---|---|---|---|
| AES-128 | 128비트 (16바이트) | 10 라운드 | 11개 |
| AES-192 | 192비트 (24바이트) | 12 라운드 | 13개 |
| AES-256 | 256비트 (32바이트) | 14 라운드 | 15개 |
이상으로 글을 마치도록 하겠습니다 감사합니다.
참고로 이 글 작성하느라 6시간 가까이 (작성 2시간, 4시간 꿈나라 ^^)소비됬습니다...하트 및 팔로우 해주시면 감사할 것 같습니다...
