AES-256 암호화 가이드: 군사급 파일 보호
AES-256 암호화와 왜 파일 보호의 골드 스탠다드인지 이해하세요. 이 군사급 암호가 전송을 안전하게 지키는 방법.
AES-256은 미국 NSA가 CNSSP-15 규정에 따라 최고 기밀(TOP SECRET) 데이터에 승인한 대칭 블록 암호입니다. 256비트 키로 128비트 블록을 14라운드의 치환, 순열, 혼합 연산을 통해 암호화합니다. AES-256 키를 무차별 대입 공격으로 뚫으려면 평균 약 2^255번의 연산이 필요한데, 지구상의 모든 컴퓨터를 우주의 나이만큼 동원해도 불가능한 수치입니다. SwissTransfer부터 Tresorit까지 모든 진지한 파일 전송 서비스가 AES-256을 대용량 암호화의 기본으로 사용하는 이유가 여기에 있습니다.
"256"이 의미하는 것
AES는 세 가지 키 크기로 제공됩니다: 128, 192, 256비트. 이 숫자는 키 길이만을 나타내며, 블록 크기는 항상 128비트로 고정입니다. 키 크기에 따라 암호가 실행하는 라운드 수가 달라집니다: AES-128은 10라운드, AES-192는 12라운드, AES-256은 14라운드입니다. 라운드가 많을수록 확산(diffusion)이 강해져 각 출력 비트가 더 많은 입력 비트에 의존하게 됩니다. 연방 정보 처리 표준 FIPS 197이 AES를 정의하고, NIST SP 800-38A~G가 운영 모드를 정의합니다.
운영 모드: GCM vs CBC vs ECB
AES는 블록 암호이므로 128비트 블록 하나만 암호화할 줄 압니다. 임의 크기의 파일을 암호화하려면 운영 모드가 필요하며, 선택이 매우 중요합니다.
- ECB(전자 코드북): 동일한 평문 블록이 동일한 암호문을 생성합니다. 절대 사용하면 안 됩니다. 유명한 "ECB 펭귄" 이미지처럼 패턴이 그대로 드러납니다.
- CBC(암호 블록 체이닝): 각 블록을 이전 암호문과 XOR 처리합니다. HMAC와 함께 사용하면 안전하지만, CBC 단독으로는 패딩 오라클 공격에 취약합니다.
- GCM(갈루아/카운터 모드): 카운터로 암호화하면서 128비트 인증 태그를 동시에 생성합니다. 암호문 변조 시 복호화가 명확하게 실패합니다.
AES-256-GCM은 TLS 1.3, Signal, WireGuard, 모든 신뢰할 수 있는 파일 전송 서비스의 기본값입니다.
절대 재사용해선 안 되는 IV(nonce)
GCM은 특정 키로 암호화할 때 고유한 96비트 초기화 벡터(IV)가 필요합니다. 같은 키로 IV를 한 번이라도 재사용하면 공격자가 두 암호문을 XOR하여 평문을 복원할 수 있습니다. 이는 WEP Wi-Fi에서 실제로 악용된 치명적 취약점입니다. 모범 사례: 암호학적으로 안전한 난수 생성기(브라우저의 crypto.getRandomValues(), Linux의 /dev/urandom)로 IV를 생성하고 암호문 앞에 붙입니다.
키 파생: 패스워드를 키로 변환
사용자는 mydog2024 같은 패스워드를 원하지만, AES는 256비트의 균일한 무작위성을 요구합니다. 이를 연결하는 것이 키 파생 함수(KDF)입니다. 현재 주로 사용하는 세 가지는 다음과 같습니다.
- PBKDF2: HMAC-SHA-256과 600,000회 반복(OWASP 2023 권장). Web Crypto API에서 지원됩니다.
- scrypt: 메모리 집약성을 추가해 GPU 공격 비용을 높입니다. Bitcoin과 LastPass가 사용합니다.
- Argon2id: 2015 패스워드 해싱 대회 우승자로 현재 최선의 방법입니다. 파라미터:
memory=64 MB, iterations=3, parallelism=4.
12자 무작위 패스워드를 Argon2id로 처리하면 현대 GPU로 무차별 대입하는 데 약 10억 년이 걸립니다.
브라우저에서의 AES: Web Crypto API
브라우저는 window.crypto.subtle을 통해 AES-256-GCM을 기본 제공합니다.
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
const iv = crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key,
fileBytes
);
현대 CPU의 AES-NI 명령어는 이를 코어당 약 3~5 GB/s 속도로 가속합니다. 중급 노트북에서 1 GB 파일을 1초 이내에 암호화할 수 있습니다.
AES-256이 보호하는 것과 그렇지 않은 것
AES-256은 한 가지 문제를 해결합니다: 키가 비밀로 유지된다는 전제 하에 저장 또는 전송 중 데이터의 기밀성. 다음은 해결하지 않습니다.
- 키 관리: 파일 옆에 패스워드를 이메일로 보내면 AES-256은 아무 의미가 없습니다.
- 엔드포인트 침해: 암호화 전에 평문을 읽는 악성코드는 암호를 완전히 우회합니다.
- 구현 버그: 2018년 BEAST, CRIME, Lucky13 공격은 모두 TLS 구현을 표적으로 했지, AES 자체가 아니었습니다.
- 발신자 인증: 누가 파일을 보냈는지 증명하려면 Ed25519 또는 ECDSA 디지털 서명이 필요합니다.
"군사급"이 주로 마케팅인 이유
NSA가 2003년 CNSSP-15에서 AES-256을 최고 기밀 데이터에 승인한 것은 사실입니다. 그러나 AES-128도 비밀(SECRET) 분류에 승인되어 있으며, 대부분의 민간 용도에는 동일하게 적합합니다. 128에서 256으로의 전환은 양자 컴퓨팅의 미래 발전에 대한 대비책입니다. Grover 알고리즘이 이론적으로 대칭 키 보안을 절반으로 줄이므로, AES-256의 실효 강도가 128비트로 감소해도 여전히 안전합니다.
서비스가 실제로 AES-256-GCM을 사용하는지 확인하는 방법
세 가지 방법으로 확인할 수 있습니다.
- 보안 백서를 읽으십시오. Tresorit, Proton Drive, SwissTransfer, HexaTransfer 같은 신뢰할 수 있는 서비스는 정확한 모드와 IV 처리 방식을 공개합니다.
- 클라이언트 코드를 검사하십시오. DevTools를 열고 JavaScript 번들에서
AES-GCM또는aes-256-gcm을 검색합니다. - 제3자 감사를 확인하십시오. Cure53, NCC Group, Trail of Bits가 검토한 알고리즘을 명시한 감사 보고서를 게시합니다.
주의 신호: 모드를 지정하지 않은 "은행급 암호화", 어떤 종류의 "독점 알고리즘", AES-128-ECB 참조.
hexatransfer.com에서 사용해 보세요 — 무료, 계정 불필요, 최대 10GB.
엔드투엔드 암호화로 대용량 파일을 안전하게 전송
엔드투엔드 암호화로 최대 10GB의 파일을 무료로 전송하세요. 계정이 필요하지 않습니다. 업로드 전에 브라우저에서 파일이 암호화되어 다른 사람은 읽을 수 없습니다.
파일 보내기