설명
같은 키에서 IV나 nonce를 재사용하면 CBC는 반복되는 평문 접두사를 드러낼 수 있고, CTR과 GCM은 서로 다른 메시지의 기밀성을 손상시킬 수 있습니다. GCM에서는 인증 태그의 보호도 약해집니다.
잠재적 영향
- 반복 평문 패턴 노출
- 암호문 분석 가능성 증가
- 같은 키 사용 시 데이터 복구 위험 증가 및 GCM 인증 보호 약화
해결 방법
- 매 암호화마다 암호학적으로 안전한 난수 IV/nonce를 생성합니다.
- IV/nonce는 비밀일 필요는 없지만 같은 키에서 재사용하지 않습니다.
- CryptoKit의 AES-GCM처럼 nonce 생성을 안전하게 처리하는 API를 우선 사용합니다.
예시
변경 전
swift
let aes = try AES(
key: key,
blockMode: CBC(iv: Array<UInt8>(repeating: 0, count: AES.blockSize)))
변경 후
swift
import Foundation
import CryptoKit
func encryptWithFreshNonce(
data: Data,
key: SymmetricKey
) throws -> AES.GCM.SealedBox {
return try AES.GCM.seal(data, using: key)
}
설명:
- 변경 전: 고정 IV는 같은 입력이 반복될 때 암호문 관계를 드러낼 수 있습니다.
- 변경 후:
AES.GCM.seal에 nonce를 지정하지 않아 API가 새로운 무작위 nonce를 생성하도록 합니다.