AES 알고리즘

코딩 파인애플·2026년 8월 17일

CRYPTOGRAPHY

목록 보기
4/4
post-thumbnail

안녕하십니까 코딩 파인애플입니다
이번 시간에는 AES 알고리즘에 관해 알아보겠습니다.

들어가기 앞서 https://www.youtube.com/watch?v=gP4PqVGudtg 영상을 시청하면 좋을 것 같습니다

ⒶE⒮ 란?

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

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 단게마다 하나씩 순서대로 사용됩니다.

SubBytes

각각의 값을 다른 값으로 바꿉니다

AES에는 미리 정해져 있는 S-Box라는 변환표가 있는데
이를 기준으로 값을 매칭시켜 매칭한 값으로 바꿉니다

(S-BOX 변환표)

예를 들어 0x53이라는 값을 매칭한다면 0xED가 되는 식입니다

ShiftRows

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 # 세 번 밀어냄

MixColumns

위 내용은 살짝 복잡한데 간단히 말하면 열을 섞는데 이제 섞는 걸

아래의 행렬과 각각의 열(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 과정을 생략한다)

AddRoundKey

현재 State와 해당 라운드에서 사용할 Round Key를 XOR하는 과정입니다

예를 들어 State의 한 바이트가 10110101이고 Round Key의 해당 바이트가 01100110이라면 XOR하여 11010011이라는 값이 산출됩니다

AES-128/AES-192/AES-256 의 차이

각각의 숫자는 원본 키의 비트 길이를 뜻합니다 셋 다 처리하는 블록 크기는 똑같이 128비트 (16바이트) 이지만 키 길이와 라운드 수가 달라집니다

키 길이라운드 수라운드 키 개수
AES-128128비트 (16바이트)10 라운드11개
AES-192192비트 (24바이트)12 라운드13개
AES-256256비트 (32바이트)14 라운드15개




이상으로 글을 마치도록 하겠습니다 감사합니다.

참고로 이 글 작성하느라 6시간 가까이 (작성 2시간, 4시간 꿈나라 ^^)소비됬습니다...하트 및 팔로우 해주시면 감사할 것 같습니다...

profile
안녕하떼요취미로콤푸타배우는고든학교6학년유치원생이빈다주말재외하고(러블럭스해야대요💢💢)주중연재하고안한날애눈이월(February)됨니다(안할수도있음)

0개의 댓글