AES 암호화 표준의 구조와 운영 모드 선택

AES의 블록·키 구조, 라운드 변환, ECB·CBC·CTR·GCM 운영 모드와 구현·보안 고려사항을 정리한다.

2026-08-14 · 최초 발행 2025-06-08

Rijndael에서 출발한 대칭키 암호 표준

AES(Advanced Encryption Standard)는 2001년 미국 NIST가 표준화한 대칭키 블록 암호화 알고리즘이다. 벨기에 암호학자 Joan Daemen과 Vincent Rijmen이 개발한 Rijndael 알고리즘을 기반으로 하며, DES(Data Encryption Standard)의 취약점과 한계를 대체할 차세대 표준으로 채택됐다.

현재 AES는 전 세계적으로 널리 쓰이는 암호화 알고리즘 중 하나다. 미국 정부의 기밀 정보 보호에도 사용되며, 안전성이 검증된 알고리즘으로 자리 잡았다.

블록과 키 길이가 정하는 AES의 형태

AES는 고정된 128비트(16바이트) 블록 단위로 데이터를 암호화한다. 지원하는 키 길이는 128비트(16바이트), 192비트(24바이트), 256비트(32바이트)이며, 이에 따라 AES-128, AES-192, AES-256으로 구분한다.

키가 길어질수록 수행 라운드도 늘어난다.

구분 키 길이 라운드 수
AES-128 128비트(16바이트) 10라운드
AES-192 192비트(24바이트) 12라운드
AES-256 256비트(32바이트) 14라운드

AES는 SPN(Substitution-Permutation Network) 구조를 사용한다. 하드웨어와 소프트웨어 모두에서 효율적으로 구현할 수 있다는 점도 널리 채택된 이유다.

평문이 암호문이 되기까지

초기 키 덧셈 뒤에 라운드 변환을 반복하고, 마지막 라운드를 거쳐 암호문을 만든다.

라운드 변환SubBytesShiftRowsMixColumnsAddRoundKey평문 입력초기 덧셈라운드 변환 반복최종 라운드암호문 출력

바이트 치환으로 비선형성을 만든다

SubBytes는 각 바이트를 S-box를 통해 다른 값으로 바꾸는 비선형 치환 연산이다. S-box는 갈루아 필드(GF(2^8))에서의 곱셈의 역원을 기반으로 한 미리 계산된 대체 테이블이며, 차분 공격과 선형 공격에 대한 저항력을 제공한다.

행을 이동해 열 사이에 데이터를 퍼뜨린다

ShiftRows는 상태 배열의 행을 서로 다른 오프셋만큼 순환 이동한다. 첫 번째 행은 이동하지 않고, 두 번째 행은 1바이트, 세 번째 행은 2바이트, 네 번째 행은 3바이트만큼 좌측 순환 이동한다. 이 과정은 열 간 데이터 확산을 만든다.

열 단위 선형 변환

MixColumns는 상태의 각 열에 갈루아 필드 상에서 정의된 행렬을 곱하는 단계다. 바이트 사이의 확산 효과를 제공해 보안성을 강화하며, 최종 라운드에서는 수행하지 않는다.

라운드 키를 상태에 더한다

AddRoundKey는 확장된 키의 해당 부분을 상태와 XOR 연산하는 과정이다. 라운드마다 서로 다른 라운드 키를 사용하고, 키 스케줄링 알고리즘이 원래 키에서 이 키들을 생성한다.

복호화는 역변환과 역순 키 적용으로 처리한다

복호화는 암호화 과정의 역순으로 진행된다. Inverse SubBytes, Inverse ShiftRows, Inverse MixColumns 같은 역 연산을 사용하며, 라운드 키도 역순으로 적용한다.

라운드 변환Inverse ShiftRowsInverse SubBytesAddRoundKeyInverse MixColumns암호문 입력초기 덧셈 라운드 변환 반복최종 라운드평문 출력

운영 모드에 따라 달라지는 처리 특성

AES는 블록 암호이므로 운영 모드와 결합해 활용한다. 같은 AES라도 모드에 따라 패턴 노출, 병렬 처리, 인증 기능의 특성이 달라진다.

ECB는 블록을 독립적으로 처리한다

ECB(Electronic Codebook)는 각 블록을 독립적으로 암호화하는 가장 단순한 방식이다. 동일한 평문 블록은 동일한 암호문 블록을 만들기 때문에 패턴이 유지되고, 보안에 취약하다. 테스트 용도로만 권장되며 실제 환경에서는 사용을 지양한다.

평문 블록1AES 암호화평문 블록2AES 암호화평문 블록3AES 암호화암호문 블록1암호문 블록2암호문 블록3비밀키

CBC는 이전 암호문 블록을 연결한다

CBC(Cipher Block Chaining)는 각 블록을 암호화하기 전에 이전 암호문 블록과 XOR 연산한다. 첫 블록은 초기화 벡터(IV)와 XOR한다. 한 블록의 변경은 이후 모든 블록에 영향을 미치며, 병렬 암호화는 불가능하지만 병렬 복호화는 가능하다.

초기화 벡터XOR평문 블록1AES 암호화암호문 블록1XOR평문 블록2AES 암호화암호문 블록2비밀키

CTR은 암호화한 카운터를 키스트림으로 쓴다

CTR(Counter)은 카운터 값을 암호화해 키스트림을 만들고, 이 키스트림과 평문을 XOR해 암호문을 생성한다. 병렬 처리가 가능하며, 스트림 암호처럼 동작해 블록 크기와 무관한 데이터를 처리할 수 있다.

Nonce+Counter1AES 암호화Nonce+Counter2AES 암호화XORXOR평문 블록1평문 블록2암호문 블록1암호문 블록2비밀키

GCM은 암호화와 인증을 함께 제공한다

GCM(Galois/Counter Mode)은 CTR 모드에 인증 기능을 더한 방식이다. AEAD(Authenticated Encryption with Associated Data)를 제공하고 병렬 처리가 가능해 고성능 환경에 적합하다. TLS 1.2, 1.3 등 많은 보안 프로토콜에서도 채택된다.

알고리즘의 강도와 구현의 공격 표면

AES에 대한 실용적인 전수 공격은 현재 불가능하다. AES-128에는 2^128(약 3.4x10^38)개의 키 조합이 존재하며, 슈퍼컴퓨터로도 전수 공격에 수십억 년이 소요될 것으로 예상된다.

다만 알고리즘의 강도와 구현의 안전성은 별개의 문제다. AES 구현은 타이밍 공격, 전력 분석 공격, 캐시 타이밍 공격 같은 사이드 채널 공격에 취약할 수 있다. 관련 키 공격(Related-key attack), 부채널 공격(Side-channel attack), 구현 결함을 이용한 공격도 고려 대상이다.

네트워크부터 저장 데이터까지의 적용 범위

AES는 VPN(Virtual Private Network), SSL/TLS 프로토콜, 무선 네트워크 보안(WPA2, WPA3), IPsec에서 네트워크 보안을 위해 사용된다.

저장 데이터 영역에서는 BitLocker와 FileVault 같은 디스크 암호화, 파일 암호화, 데이터베이스 암호화에 적용된다. 금융 거래에서는 신용카드 정보 보호, 전자 결제 시스템, 암호화폐 지갑 보안에 쓰인다.

클라우드 환경에서는 저장 데이터 암호화, API 통신 보안, 사용자 인증 정보 보호에 활용된다. 모바일에서도 앱 간 통신 암호화, 기기 저장 데이터 보호, Signal과 WhatsApp 같은 메시징 앱 암호화에 사용된다.

하드웨어와 라이브러리에서의 구현

인텔 AES-NI(AES New Instructions)는 CPU에 AES 연산 전용 명령어 세트를 제공한다. ARM 프로세서의 암호화 확장(Cryptographic Extensions), FPGA와 ASIC 기반 하드웨어 암호화 모듈도 AES 처리를 지원한다.

소프트웨어에서는 OpenSSL이 AES 구현을 제공하며, Bouncy Castle은 Java 및 C#용 암호화 API다. Crypto++는 C++ 암호화 라이브러리이고, NaCl/libsodium은 고수준 암호화 라이브러리로 사용된다.

Python에서 CBC 모드를 사용하는 예시는 다음과 같다.

from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad

# 키 생성 (AES-256)
key = get_random_bytes(32)  # 256 비트 키

# 초기화 벡터 생성
iv = get_random_bytes(16)   # 128 비트 IV

# 암호화 객체 생성 (CBC 모드)
cipher = AES.new(key, AES.MODE_CBC, iv)

# 데이터 암호화
data = b'Sensitive information that needs protection'
ciphertext = cipher.encrypt(pad(data, AES.block_size))

# 복호화
decipher = AES.new(key, AES.MODE_CBC, iv)
plaintext = unpad(decipher.decrypt(ciphertext), AES.block_size)

print(f"원본 데이터: {data}")
print(f"암호화된 데이터: {ciphertext.hex()}")
print(f"복호화된 데이터: {plaintext}")

양자 컴퓨팅 이후에도 남는 역할

양자 컴퓨팅이 발전하면 그로버 알고리즘으로 대칭키 암호의 보안 강도가 절반으로 감소할 수 있다. AES-256은 양자 컴퓨팅 시대에도 128비트 보안 강도를 유지할 것으로 예상된다.

IoT 기기처럼 자원이 제한된 환경에서는 AES 대안으로 경량 암호 개발이 진행되고 있다. 포스트 양자 암호와 결합하는 하이브리드 암호화 방식에서도 AES는 대칭키 요소로 계속 사용될 전망이다. 하드웨어 구현은 성능과 에너지 효율성을 높이는 방향으로도 최적화가 이어지고 있다.

AES대칭키 암호블록 암호암호화 운영 모드정보보안