1. AES (Advanced Encryption Standard) 기본 구조
하드웨어가 발전하면서 DES 알고리즘은 22시간만에 깨지게 되어버렸고 새로운 더 강력한 암호 알고리즘이 필요해졌다. AES는 기존 DES를 대체하기 위해 1977년 NIST(미국 표준 기술 연구소)의 공모로 선정된 암호알고리즘이다. 여러개의 후보 중 Joan Daemen과 Vincent Rijmen이 설계한 Rijndael(레인달) 알고리즘이 최종 선정되었다.
![]() |
DES는 Feistel 구조였지만, AES는 아니다. AES는 매 라운드마다 전체 블록을 처리하는 반복 구조를 가진다. 암호화 과정은 128비트 데이터를 4x4 바이트 행렬인 State 상태 배열로 배열해서 처리한다. 마지막 라운드에서는 Mix Column 변환이 생략된다. 나머지 라운드에서는 4개의 단계를 모두 거친다. |
AES는 키 길이가 128bit, 192bit, 256bit 버전이 있다. 키 길이가 다를 때마다 라운드 수가 다르다는 것을 유념해야한다.
| AES-128 | AES-192 | AES-256 | |
| 키 길이 (bits) | 128 bit | 192 bit | 256 bit |
| 라운드 수 | 10 | 12 | 14 |
| 확장 키 크기 (words) | 44 | 52 | 60 |
2. AES 암호화
AES는 데이터를 바이트 단위로 처리하는 블록암호이다.

128bit 블록은 16개의 바이트로 나뉘어 4x4 행렬 형태의 상태(State) 배열로 관리된다 각 데이터는 위 그림과 같이 Column-major 방식으로 배치한다.

AES는 매 라운드마다 전체 블록을 처리하는 반복적 구조라고 설명했다. 각 라운드는 위에서 처럼 4단계를 거치게 된다.
- Byte Substitution: S-Box를 이용한 바이트 단위의 비선형 치환 과정
- Shift Rows: 행 단위로 바이트를 순환 이동 시키는 Permutation 과정
- Mix Columns: 각 열을 독립적으로 처리하며, $GF(2^8)$ 상의 행렬 곱셈을 이용해 열 내부의 바이트를 혼합한다.
- AddRoundKey: 현재의 State와 라운드 키(Subkey)를 비트 단위로 XOR 연산한다.
각 과정을 자세히 살펴보자.
1. Byte Substitution (S-Box)
![]() |
![]() |
ByteSub 변환은 AES의 유일한 비선형(Non-linear) 계층이다. 이를 통해 차분 및 선형 암호 분석 공격에 대한 저항성을 제공한다. 여기에 S-Box를 활용하는데 각각을 독립적으로 변환한다. S-Box가 Non-linearity를 제공한다.
2. Diffusion Layer (ShiftRow + MixColumn)
Diffusion Layer 계층은 비트들을 블록 전체로 섞어 확산시키는 역할을 한다.
2-1. ShiftRow: 바이트 단위의 순환 치환을 수행한다.
- 1행은 변경하지 않는다.
- 2행은 왼쪽으로 1바이트, 3행은 2바이트, 4행은 3바이트씩 순환이동한다.


2-2. MixColumn: 각 열을 독립적으로 처리하며, $GF(2^8)$ 상에서 행렬 곱셈을 통해 열 내의 4바이트를 혼합한다.
- 각 결과 바이트는 해당 열의 모든 4바이트 값에 의존하게 된다.
- 이 변환은 $DIFF(A) + DIFF(B) = DIFF(A + B)$를 만족하는 선형 연산이다.


3. AddRoundKey: State의 128비트 블록과 라운드 키의 128비트를 XOR 연산한다. XOR은 자기 자신이 역원이므로 복호화 시에도 동일하게 XOR을 적용하면된다.
[전체 과정]

3. Key Expansion
Key Expansion은 입력된 마스터 키를 바탕으로 암호화의 각 라운드에서 사용할 라운드 키(서브키)들을 생성하는 것이다.

- $서브키 수 = 라운드 수 + 1$
키 확산 효과를 위해 입력 및 출력 단계에도 키가 사용되기 때문에 서브키의 수는 $라운드 수 + 1$개가 필요하게 된다.
AES는 마스터 키로부터 서브키를 재귀적으로 도출한다. 128bit 마스터 키는 16바이트이고, 11개의 서브키는 44워드로 정리된다.
KeyExpansion(byte key[16], word w[44]) {
word temp;
// 1. 초기 키 복사: 마스터 키(16바이트)를 첫 4개 워드에 채움
for (i = 0; i < 4; i++) {
w[i] = (key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]);
}
// 2. 나머지 40개 워드 생성
for (i = 4; i < 44; i++) {
temp = w[i-1]; // 직전 워드를 가져옴
// 4번째 워드마다 특수 변환(T-함수) 수행
if (i mod 4 == 0) {
temp = SubWord(RotWord(temp)) ^ Rcon[i/4];
}
// 새로운 워드 = 4개 전 워드 XOR temp
w[i] = w[i-4] ^ temp;
}
}
- RotWord([b0, b1, b2, b3]): 1바이트 왼쪽 순환 시프트 수행 → [b1, b2, b3, b0].
- SubWord([b0, b1, b2, b3]): 각 바이트에 AES S-Box를 적용하여 치환.
- Rcon[j] (Round Constant): 매 4번째 워드마다 더해지는 상수로, $Rcon[j] = (RC[j], 0, 0, 0)$ 형태다. $RC[j]$는 $GF(2^8)$ 상에서 $x^{j-1}$ 값으로 정의된다. 실제로는 아래 표 보고 변환하면 된다.

* T 함수
: 키 확장 도중 4번째 워드마다 적용되는 비선형 변환 함수이다.
RotWord -> SubWord -> Rcon XOR을 진행한다.
for (i = 4; i < 44; i++) {
temp = w[i-1];
// 바로 이 부분이 T-함수(g-함수)가 실행되는 지점
if (i % 4 == 0) {
// T-함수 역할: RotWord -> SubWord -> Rcon XOR
temp = SubWord(RotWord(temp)) ^ Rcon[i/4];
}
// T-함수 결과(또는 직전 워드)를 사용하여 새로운 워드 생성
w[i] = w[i-4] ^ temp;
}
- Rotate: 워드의 바이트를 순환 이동한다.
- S-Box Substitution: 4바이트 각각에 S-Box 치환을 적용한다 .
- Rcon XOR: 가장 왼쪽 바이트에만 라운드 상수 $RC[i]$를 XOR 연산한다.

4. AES 복호화
AES 복호화는 기본적으로 암호화의 역과정을 수행하는 것은 맞지만, 암호화와 복호화의 단계가 완전히 대칭적이지는 않다.

복호화의 라운드는 구성 순서가 다르다.
Inverse ShiftRow → Inverse ByteSub → AddRoundKey → Inverse MixColumn 순서로 진행된다.
1. Inverse ByteSub
- 암호화에 사용된 S-Box의 역함수인 Inverse S-Box 룩업 테이블을 사용한다.
- 암호화 시 {CB}가 {1F}로 바뀌었다면, 복호화 시에는 {1F}를 입력으로 받아 다시 {CB}를 출력한다.
2. Inverse ShiftRow
- 암호화 시 왼쪽으로 순환 이동했던 행들을 반대 방향인 오른쪽으로 순환 이동시킨다.
- 1행은 고정, 2행은 오른쪽 1바이트, 3행은 2바이트, 4행은 3바이트 이동한다.
3. Inverse MixColumn
- 암호화 시 사용된 행렬의 역행렬(Inverse Matrix)을 곱하여 혼합된 열을 원래대로 되돌린다.
- 행렬 원소: 역행렬의 원소는 {0E, 0B, 0D, 09}와 같은 $GF(2^8)$ 상의 값들로 구성된다.
4. Inverse AddRoundKey
- XOR 연산은 자기 자신이 역원이므로, 암호화와 동일한 비트 단위 XOR 연산을 수행하면 된다. 단, 라운드 키는 복호화 순서에 맞게 역순으로 적용해야 한다.
'컴퓨터공학 > 정보보안' 카테고리의 다른 글
| [정보보안] 보안 수학 (Group, Ring, Field, GF, 유클리드 알고리즘) (0) | 2026.04.26 |
|---|---|
| [정보보안] 난수 생성기 (Random Number Generator) (1) | 2026.04.22 |
| [정보보안] 블록암호 운용모드 (Modes of Operation) (1) | 2026.04.16 |
| [정보보안] 대칭키 암호 - DES (0) | 2026.04.16 |
| [정보보안] 스트림 암호 vs 블록 암호 (Stream Cipher vs Block Cipher) (0) | 2026.04.15 |


