AES(Advanced Encryption Standard)는 2001년 미국 국립표준기술연구소(NIST)에 의해 공식 표준으로 채택된 대칭 블록 암호화 알고리즘입니다. AES는 구식 DES를 대체했으며 이후 은행 시스템부터 모바일 애플리케이션까지 세계에서 가장 널리 사용되는 암호화 알고리즘이 되었습니다. NIST(2023)에 따르면, AES는 256비트 키에 대해 2^256 작업에 해당하는 보안을 제공하여 최신 무차별 대입 공격에 무적입니다. NIST FIPS 197, 2023
핵심 요점
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의 개발은 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는 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의 암호화 강도를 보장하는 주요 특성은 눈사태 효과입니다. 평문 또는 키의 1비트를 변경하면 암호문 비트의 약 50%가 변경되어 AES가 차분 및 선형 암호 해독에 매우 강력해집니다. SubBytes(S-box를 통한 비선형성)와 MixColumns(갈루아 필드 곱셈을 통한 확산)의 조합은 암호문의 일부를 알더라도 무차별 대입보다 빠르게 키를 복구할 수 없는 수학적 복잡성을 만듭니다. NIST 분석(2018)에 따르면, AES-128에 대한 가장 잘 알려진 공격인 biclique 공격은 유효 키 길이를 2비트만 줄입니다(126.2비트). AES-256의 경우 무차별 대입을 능가하는 실질적으로 실행 가능한 공격은 존재하지 않습니다.
AES는 세 가지 키 크기를 지원하며, 각각 특정 암호화 강도 수준에 해당합니다. 키 크기 선택은 보안, 성능 및 장치 리소스 요구 사항에 영향을 미칩니다.
| 키 크기 | 라운드 수 | 보안 수준 | 용도 |
|---|---|---|---|
| AES-128 | 10 | 128비트 | 상용 애플리케이션, TLS |
| AES-192 | 12 | 192비트 | 정부 시스템(SECRET) |
| AES-256 | 14 | 256비트 | 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는 블록 암호로서 고정 크기(128비트) 블록을 암호화합니다. 임의 길이의 데이터를 암호화하려면 작동 모드가 사용됩니다. 모드 선택은 보안에 중요한 영향을 미칩니다: 잘못된 모드는 AES의 강도를 무효화할 수 있습니다.
모바일 프로젝트에는 12바이트 nonce와 함께 AES-256-GCM을 사용하세요. GCM은 데이터 암호화와 인증이라는 두 가지 문제를 동시에 해결하여 패딩 오라클 및 선택 암호문 공격을 방지합니다. Android Keystore와 iOS CryptoKit은 추가 암호화 기본 요소 없이 AES-GCM을 기본 지원합니다. GCM으로 작업할 때 동일한 키로 nonce를 절대 재사용하지 않는 것이 중요합니다 — 이는 암호화 보안을 완전히 파괴합니다. 각 암호화마다 새 무작위 nonce를 생성하고 암호문과 함께 저장하십시오.
Jetpack Security를 사용하여 Android에서 안전한 AES-256-GCM 구현의 예를 살펴보겠습니다. 아래 코드는 전체 사이클을 보여줍니다: MasterKey를 통한 AES-256 키 생성, 추가 인증 데이터(AAD)가 포함된 문자열 암호화 및 복호화.
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+ 반복을 사용하여 사용자 비밀번호로 추가 암호화를 사용하세요.
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-128은 128비트 키를 사용하고 10라운드의 암호화를 수행합니다. AES-256은 256비트 키와 14라운드를 사용하여 해독하기 2^128배 더 어렵습니다. 모바일 애플리케이션의 경우 최소 성능 차이로 인해 AES-256이 권장됩니다.
AES-256-GCM이 가장 안전하고 권장되는 모드입니다. GCM은 인증된 암호화(암호화 + 무결성 검증)를 제공합니다. ECB 모드는 금지되어 있으며, CBC는 별도의 MAC이 필요합니다. GCM은 모바일 애플리케이션의 사실상 표준입니다.
이론적으로 AES는 무차별 대입으로 해독할 수 있지만, AES-256의 경우 2^256번의 시도가 필요합니다 — 관측 가능한 우주의 원자 수보다 많습니다. AES-256에 대한 실질적인 공격은 존재하지 않습니다. 부채널 공격(Spectre, Meltdown)은 AES를 해독하는 것이 아니라 메모리에서 키를 훔치는 것이므로 하드웨어 키 저장소가 중요합니다.
AndroidX Security 라이브러리를 사용하세요: KeyScheme.AES256_GCM을 사용한 MasterKey.Builder는 Android Keystore에서 보호된 키를 생성하고, EncryptedSharedPreferences는 AES-256-GCM을 통해 모든 데이터를 자동으로 암호화합니다. 수동 암호화 불필요 — API는 기본적으로 안전하며 개발자 오류 위험이 없습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.