AES: 개념, 대칭 암호화 알고리즘 및 활용 분야

저자: IT Sectr 게시일: 2026-04-02 읽는 시간: 9 분

AES(Advanced Encryption Standard)는 2001년 미국 국립표준기술연구소(NIST)에 의해 공식 표준으로 채택된 대칭 블록 암호화 알고리즘입니다. AES는 구식 DES를 대체했으며 이후 은행 시스템부터 모바일 애플리케이션까지 세계에서 가장 널리 사용되는 암호화 알고리즘이 되었습니다. NIST(2023)에 따르면, AES는 256비트 키에 대해 2^256 작업에 해당하는 보안을 제공하여 최신 무차별 대입 공격에 무적입니다. NIST FIPS 197, 2023

핵심 요점

  • AES는 고정 블록 크기 128비트, 키 128/192/256비트의 대칭 블록 암호입니다.
  • GCM 모드는 모바일 애플리케이션에 권장되는 AES 작동 모드로, 인증된 암호화를 제공합니다.
  • AES-256은 최대 보안 수준의 버전으로, 고민감도 데이터 보호에 권장됩니다.
  • 하드웨어 가속 — AES-NI 프로세서 명령어를 통해 최신 기기에서 최대 10GB/s 속도로 암호화가 가능합니다.
  • Android 및 iOS는 AES용 내장 API를 제공합니다: Android Keystore 및 iOS CryptoKit(하드웨어 가속 지원).

AES란?

AES(Advanced Encryption Standard)는 벨기에 암호학자 Joan Daemen과 Vincent Rijmen이 Rijndael이라는 이름으로 개발한 대칭 블록 암호입니다. 2001년 NIST는 5년간의 공개 테스트와 분석 후 Rijndael을 새로운 미국 암호화 표준 경쟁의 승자로 선정했습니다. AES는 고정 크기(128비트) 데이터 블록에서 작동하며 128, 192, 256비트의 세 가지 키 길이를 지원합니다. 변환 라운드 수는 키 길이에 따라 다릅니다: 128비트는 10라운드, 192비트는 12라운드, 256비트는 14라운드입니다. 각 라운드에는 SubBytes(S-box를 통한 비선형 바이트 치환), ShiftRows(순환 행 이동), MixColumns(열 혼합), AddRoundKey(라운드 키 XOR)의 네 가지 작업이 포함됩니다.

AES 표준의 역사

AES의 개발은 1997년 NIST가 DES를 대체할 경쟁을 발표하면서 시작되었습니다. DES의 56비트 키는 1998년 전문 장치 Deep Crack에서 22시간 만에 해독되었습니다. Serpent(영국), Twofish(미국), RC6(미국) 등 여러 국가의 15개 알고리즘이 참여했습니다. 1999년 결승전까지 5명의 후보가 남았습니다. Rijndael은 모든 플랫폼(8비트 마이크로컨트롤러부터 64비트 서버까지)에서의 높은 속도, 암호 해독에 대한 저항성, 컴팩트한 하드웨어 구현의 조합으로 승리했습니다. 2006년부터 AES는 미국 정부 시스템에서 SECRET 및 TOP SECRET 등급 데이터 암호화에 사용되고 있습니다. 오늘날 AES는 모든 주요 프로토콜에 내장되어 있습니다: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3, Bluetooth BR/EDR.

AES 암호화 작동 방식

AES는 128비트(16바이트) 블록으로 데이터를 처리하며, state라는 4x4 바이트 행렬로 구성됩니다. 각 암호화 라운드는 결정론적 변환 시퀀스를 수행하여 집합적으로 눈사태 효과를 생성합니다: 입력 데이터의 1비트를 변경하면 출력 비트의 약 50%가 변경됩니다. 이 효과로 AES는 블록 암호를 해독하는 기본 방법인 차분 및 선형 암호 해독에 저항성을 갖습니다.

프로세스는 AddRoundKey로 시작됩니다 — 초기 키와 state의 XOR. 그런 다음 라운드가 실행됩니다: SubBytes는 각 state 바이트를 S-box(치환 테이블)의 값으로 대체합니다. ShiftRows는 두 번째 행을 1위치, 세 번째를 2, 네 번째를 3만큼 순환 이동하여 열 간 혼합을 보장합니다. MixColumns는 각 state 열을 갈루아 필드 GF(2^8)의 고정 행렬과 곱하여 각 출력 바이트를 열의 네 입력 바이트 모두에 종속시킵니다. AddRoundKey는 Key Expansion을 통해 원래 키에서 파생된 다음 라운드 키로 XOR합니다. 마지막 라운드는 MixColumns 작업이 없습니다. 복호화는 역순으로 InvSubBytes, InvShiftRows, InvMixColumns 및 AddRoundKey를 사용합니다. 모바일 개발자의 경우 AES의 내부 구조를 이해할 필요가 없습니다 — 올바른 매개변수로 플랫폼의 내장 API를 올바르게 호출하는 방법만 알면 됩니다.

눈사태 효과와 AES의 암호화 강도

AES의 암호화 강도를 보장하는 주요 특성은 눈사태 효과입니다. 평문 또는 키의 1비트를 변경하면 암호문 비트의 약 50%가 변경되어 AES가 차분 및 선형 암호 해독에 매우 강력해집니다. SubBytes(S-box를 통한 비선형성)와 MixColumns(갈루아 필드 곱셈을 통한 확산)의 조합은 암호문의 일부를 알더라도 무차별 대입보다 빠르게 키를 복구할 수 없는 수학적 복잡성을 만듭니다. NIST 분석(2018)에 따르면, AES-128에 대한 가장 잘 알려진 공격인 biclique 공격은 유효 키 길이를 2비트만 줄입니다(126.2비트). AES-256의 경우 무차별 대입을 능가하는 실질적으로 실행 가능한 공격은 존재하지 않습니다.

AES 키 크기 및 보안 수준

AES는 세 가지 키 크기를 지원하며, 각각 특정 암호화 강도 수준에 해당합니다. 키 크기 선택은 보안, 성능 및 장치 리소스 요구 사항에 영향을 미칩니다.

키 크기라운드 수보안 수준용도
AES-12810128비트상용 애플리케이션, TLS
AES-19212192비트정부 시스템(SECRET)
AES-25614256비트TOP SECRET, 금융 부문

실용적인 규칙: 모바일 애플리케이션에는 기본적으로 AES-256을 사용합니다. AES-NI 지원 최신 기기에서 AES-128과 AES-256의 성능 차이는 10~15%를 넘지 않지만 보안 수준은 두 배가 됩니다. 양자 분석(Grassl et al., 2016)에 따르면 AES-128을 해독하려면 Grover 알고리즘을 통해 2^77의 양자 연산이 필요한 반면, AES-256은 2^149가 필요하여 향후 20~30년간 양자 공격에 저항합니다. AES-128조차도 대다수의 상업적 시나리오에 충분한 보호를 제공합니다: Bruce Schneier의 추정에 따르면 128비트 키의 무차별 대입에는 우주에 존재하는 것보다 더 많은 에너지가 필요합니다. 그러나 보안 표준(GDPR, HIPAA, PCI DSS)은 종종 AES-256을 명시적으로 요구하므로 프로덕션 프로젝트에서는 최대 키 길이를 사용해야 합니다.

AES 작동 모드

AES는 블록 암호로서 고정 크기(128비트) 블록을 암호화합니다. 임의 길이의 데이터를 암호화하려면 작동 모드가 사용됩니다. 모드 선택은 보안에 중요한 영향을 미칩니다: 잘못된 모드는 AES의 강도를 무효화할 수 있습니다.

  • ECB(Electronic Codebook) — 가장 간단하고 가장 안전하지 않은 모드. 각 블록은 동일한 키로 독립적으로 암호화됩니다. 동일한 평문 블록이 동일한 암호문 블록을 생성하여 데이터 구조 복구가 가능합니다. 모든 최신 보안 표준에서 금지됩니다. 모바일 애플리케이션에서 ECB를 절대 사용하지 마십시오.
  • CBC(Cipher Block Chaining) — 이전 암호문 블록이 다음 블록의 초기화 벡터(IV)로 사용됩니다. 각 메시지에 대해 무작위 IV가 필요합니다. 잘못 구현된 경우 패딩 오라클 공격에 취약합니다. 파일 암호화에 적합하지만 데이터 무결성을 위해 MAC(HMAC)이 필요합니다.
  • GCM(Galois/Counter Mode) — 모바일 애플리케이션에 권장되는 모드입니다. 인증된 암호화(AEAD) 제공: 단일 작업으로 암호화 + 무결성 검증. 키 스트림 생성에 카운터를 사용하고 인증에 갈루아 필드 곱셈을 사용합니다. GCM은 각 메시지에 대해 고유한 nonce(12바이트)가 필요합니다. NIST 권장, TLS 1.2/1.3 및 Android Keystore에서 사용됩니다.
  • CCM(Counter with CBC-MAC) — CTR + CBC-MAC 기반의 대체 AEAD 모드. GCM보다 느리고 병렬 처리를 지원하지 않습니다. ZigBee 및 802.11(Wi-Fi) 프로토콜에서 사용됩니다. 모바일 애플리케이션의 경우 GCM이 선호됩니다.

모바일 프로젝트에는 12바이트 nonce와 함께 AES-256-GCM을 사용하세요. GCM은 데이터 암호화와 인증이라는 두 가지 문제를 동시에 해결하여 패딩 오라클 및 선택 암호문 공격을 방지합니다. Android Keystore와 iOS CryptoKit은 추가 암호화 기본 요소 없이 AES-GCM을 기본 지원합니다. GCM으로 작업할 때 동일한 키로 nonce를 절대 재사용하지 않는 것이 중요합니다 — 이는 암호화 보안을 완전히 파괴합니다. 각 암호화마다 새 무작위 nonce를 생성하고 암호문과 함께 저장하십시오.

모바일 애플리케이션에서 AES 구현

Jetpack Security를 사용하여 Android에서 안전한 AES-256-GCM 구현의 예를 살펴보겠습니다. 아래 코드는 전체 사이클을 보여줍니다: MasterKey를 통한 AES-256 키 생성, 추가 인증 데이터(AAD)가 포함된 문자열 암호화 및 복호화.

kotlin
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

val securePrefs = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

fun storeSecureData(key: String, value: String) {
    securePrefs.edit().putString(key, value).apply()
}

fun readSecureData(key: String): String? {
    return securePrefs.getString(key, null)
}

이 솔루션의 주요 특징은 AES-256-GCM이 두 수준에서 사용된다는 것입니다: 키-값 쌍(PrefValueEncryptionScheme) 암호화와 키 이름 자체 보호(PrefKeyEncryptionScheme은 nonce 재사용에 저항하는 AES-256-SIV 사용). MasterKey는 AES-256-GCM 알고리즘을 사용하여 생성되며 Trusted Execution Environment가 있는 기기에서는 하드웨어로 보호되는 Android Keystore에 저장됩니다. 하드웨어 지원(TEE)이 없는 기기에서는 키가 Bouncy Castle을 통해 암호화되어 SharedPreferences에 저장하는 것보다 여전히 안전합니다.

대량의 데이터(예: 이미지 또는 파일)를 직접 암호화하려면 AndroidX Security의 EncryptedFile을 통해 AES-256-GCM을 사용하세요. 키 내보내기(예: 백업)의 경우 PBKDF2와 100000+ 반복을 사용하여 사용자 비밀번호로 추가 암호화를 사용하세요.

CryptoKit을 통한 iOS에서의 AES

iOS에서 AES 작업은 CryptoKit 프레임워크(Swift 5.0+)를 통해 구성됩니다. AES-256 키는 SymmetricKey(size: .bits256)를 통해 생성되며 Secure Enclave에 저장됩니다 — 메인 CPU 및 운영 체제와 격리된 하드웨어 암호 프로세서입니다. CryptoKit은 두 가지 AES 구현을 제공합니다: AES.GCM(권장) 및 AES.CBC(레거시 형식과의 하위 호환성용). 암호화는 데이터, 키 및 nonce(12바이트)를 받아 암호문과 인증 태그가 포함된 구조체 AES.GCM.SealedBox를 반환하는 seal() 메서드를 통해 수행됩니다. 복호화는 open()을 통해 수행됩니다. Apple은 CommonCrypto를 직접 사용하지 말 것을 강력히 권장합니다: CryptoKit은 자동으로 최적 매개변수를 선택하고, 부채널 공격으로부터 보호하며, Apple Silicon 프로세서에서 AES-NI 하드웨어 가속을 사용합니다. Secure Enclave가 있는 기기에서는 키가 하드웨어 모듈을 절대 떠나지 않아 앱이 완전히 손상되어도 도난을 방지합니다. 키 직렬화를 위해 withUnsafeBytes 메서드를 사용한 다음 kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly 속성으로 SecItemAdd를 통해 Keychain에 저장합니다.

자주 묻는 질문

간단히 말해 AES란 무엇인가요?

AES는 비밀 키를 사용하여 읽을 수 있는 데이터를 읽을 수 없는 바이트 집합으로 변환하는 알고리즘입니다. 데이터를 원래 형태로 되돌리려면 동일한 키가 필요합니다. AES는 매우 신뢰할 수 있어 미국 정부 기밀 문서를 암호화하는 데 사용됩니다.

AES-128과 AES-256의 차이점은?

AES-128은 128비트 키를 사용하고 10라운드의 암호화를 수행합니다. AES-256은 256비트 키와 14라운드를 사용하여 해독하기 2^128배 더 어렵습니다. 모바일 애플리케이션의 경우 최소 성능 차이로 인해 AES-256이 권장됩니다.

가장 안전한 AES 모드는 무엇인가요?

AES-256-GCM이 가장 안전하고 권장되는 모드입니다. GCM은 인증된 암호화(암호화 + 무결성 검증)를 제공합니다. ECB 모드는 금지되어 있으며, CBC는 별도의 MAC이 필요합니다. GCM은 모바일 애플리케이션의 사실상 표준입니다.

AES를 해독할 수 있나요?

이론적으로 AES는 무차별 대입으로 해독할 수 있지만, AES-256의 경우 2^256번의 시도가 필요합니다 — 관측 가능한 우주의 원자 수보다 많습니다. AES-256에 대한 실질적인 공격은 존재하지 않습니다. 부채널 공격(Spectre, Meltdown)은 AES를 해독하는 것이 아니라 메모리에서 키를 훔치는 것이므로 하드웨어 키 저장소가 중요합니다.

Android 모바일 앱에서 AES를 어떻게 사용하나요?

AndroidX Security 라이브러리를 사용하세요: KeyScheme.AES256_GCM을 사용한 MasterKey.Builder는 Android Keystore에서 보호된 키를 생성하고, EncryptedSharedPreferences는 AES-256-GCM을 통해 모든 데이터를 자동으로 암호화합니다. 수동 암호화 불필요 — API는 기본적으로 안전하며 개발자 오류 위험이 없습니다.

요약

  • AES는 2001년 NIST에 의해 표준화된 가장 널리 사용되고 입증된 대칭 암호화 알고리즘입니다.
  • AES-256은 향후 20~30년간 양자 공격에 대한 여유를 가지고 최대 보안을 제공합니다.
  • GCM 모드는 모바일 애플리케이션에 권장되는 유일한 모드: 단일 작업으로 암호화 + 인증.
  • Android Keystore 및 iOS Secure Enclave — AES 키를 애플리케이션에서 격리하는 하드웨어 저장소.
  • Jetpack Security(Android) 및 CryptoKit(iOS)은 수동 암호화 없이 안전한 AES-256-GCM 구현을 제공합니다.
  • GCM용 Nonce(IV)는 각 암호화마다 고유해야 합니다 — 재사용은 보안을 완전히 파괴합니다.
  • 권장사항: 모든 민감한 데이터에 대해 Android에서는 EncryptedSharedPreferences, iOS에서는 CryptoKit을 통해 AES-256-GCM을 사용하세요.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기