- XAES-256-GCM은 고수준 암호화 API에서 논스 관리를 덜 위험하게 만들기 위해 256비트 키와 192비트 논스를 쓰는 새 AEAD 명세임
- 큰 논스는 메시지마다 운영체제 CSPRNG에서 새 값을 자동 생성하는 방식을 가능하게 하며, 2⁸⁰개 메시지에서 충돌 위험 2⁻³² 수준을 목표로 함
- 내부적으로는 입력 키와 큰 논스에서 파생 키와 96비트 논스를 만든 뒤, 표준 AES-256-GCM을 그대로 사용하는 확장 논스 구성임
- Go 참조 구현은
crypto/cipher와crypto/aes만으로 100줄 미만에 들어가며, 메시지당 AES-256 호출 3회 중 일부는 사전 계산 가능함 - FIPS 140 준수와 라이브러리 호환성을 중시해, XChaCha20Poly1305·AES-GCM-SIV와 함께 논스 없는 AEAD API 후보로 쓰일 수 있음
고수준 API를 위한 큰 논스 AEAD
- XAES-256-GCM은 추가 인증 데이터가 있는 인증 암호화(AEAD) 알고리듬으로, 256비트 키와 192비트 논스를 사용함
- 설계 목표는 세 가지로 압축됨
- 사실상 무제한에 가까운 메시지 수에서도 무작위 생성이 안전한 큰 논스 지원
- 완전하고 직접적인 FIPS 140 준수
- 일반적인 암호화 라이브러리 위에서 쉬운 구현
- 큰 논스 덕분에 사용자가 birthday bound 계산을 직접 하지 않아도, 메시지마다 운영체제 CSPRNG에서 새 논스를 읽는 API를 만들 수 있음
- 준수성과 호환성을 우선해, 다른 큰 논스 AEAD를 쓰기 어려운 환경에서도 AEAD가 필요한 곳에 적용 가능함
AES-256-GCM을 그대로 활용하는 확장 논스 구성
- XAES-256-GCM은 XChaCha20Poly1305처럼 기존 AEAD 위에 올리는 확장 논스 구성임
- 입력 키와 192비트 논스에서 내부 AES-256-GCM용 파생 키와 파생 논스를 계산함
- 입력 키와 논스는 각각
K,N - 파생 AES-256-GCM 키와 논스는
Kₓ,Nₓ
- 입력 키와 논스는 각각
AES-256ₖ호출과 논스 앞부분으로Kₓ를 만들고, 입력 논스의 뒤 96비트를Nₓ로 사용함- 메시지당
AES-256ₖ호출은 3회 필요함- 이 중 하나는 주어진 키에 대해 사전 계산 가능함
- 나머지 두 호출은 같은 키 스케줄을 재사용할 수 있음
구현은 짧고 표준 구성 요소로 기술 가능
- Go 참조 구현은 사전 계산 최적화와 대부분의 보일러플레이트를 포함해 100줄 미만임
- Go 구현은 표준 라이브러리의
crypto/cipher와crypto/aes만 사용함 - XAES-256-GCM은 표준 NIST SP 800-108r1 KDF와 표준 NIST AES-256-GCM AEAD로도 기술 가능함
- KDF는 counter-based KDF
- PRF는 CMAC-AES256
- 입력 키는
Kin - 라벨은 ASCII 문자
X, 즉0x58 - 컨텍스트는 입력 논스의 첫 96비트
- 카운터 크기는 16비트
- 선택적
L필드는 생략 - 출력은 256비트 파생 키
- 파생 키와 입력 논스의 마지막 96비트가 AES-256-GCM에 들어감
- 매개변수 선택 덕분에 KDF와 CMAC 추상화를 걷어내면, 단순히 카운터에 AES-256을 호출하는 방식보다 약간만 느리고 복잡함
- 같은 매개변수는 고수준 OpenSSL API에서도 지원됨
서드파티 구현과 테스트 벡터
- 2024-06-29 편집 기준으로 서드파티 구현이 추가됨
- Web Cryptography API 구현은 256비트 AES-CBC
CryptoKey를 사용함 - 명세에는 두 주요 코드 경로에 대한 테스트 벡터가 포함됨
MSB₁(L) = 0MSB₁(L) = 1
- 10,000회 또는 1,000,000회 무작위 반복을 압축한 누적 테스트 벡터도 제공됨
/11 포기와 대안
- 이전 구상에는
XAES-256-GCM/11이라는 이름이 있었지만, 최종 명세에서는/11을 포기함 /11은 성능 최적화였으며, AES-GCM을 쓰는 이유 중 하나가 FIPS 140 준수이기 때문에 라운드 수를 바꾸면 준수성이 사라짐- FIPS 140 준수가 목표가 아니라면 대안은 여러 가지임
- AES-GCM-SIV
- AES 코어 기반의 현대적 AEAD 구성
- 명세의 Alternatives 섹션은 각 대안을 XAES-256-GCM과 비교함
Go와 논스 없는 AEAD API에서의 위치
- XAES-256-GCM은 안전하고, 지루하며, 준수 가능하고, 상호운용 가능한 AEAD를 목표로 함
- 주요 사용처는 Go에 추가하고 싶은 종류의 고수준 API임
- XAES-256-GCM은 XChaCha20Poly1305와 AES-GCM-SIV를 보완하며, 가상의 논스 없는 AEAD API 구현 후보로 설계됨
- Go 표준 라이브러리에 Go 전용 구성을 추가하는 것을 선호하지 않기 때문에, 다른 암호화 라이브러리 유지관리자의 의견이 필요함