Swift 고정 초기화 벡터 사용

고정 초기화 벡터(IV) 사용

설명

같은 키에서 IV나 nonce를 재사용하면 CBC는 반복되는 평문 접두사를 드러낼 수 있고, CTR과 GCM은 서로 다른 메시지의 기밀성을 손상시킬 수 있습니다. GCM에서는 인증 태그의 보호도 약해집니다.

잠재적 영향

  • 반복 평문 패턴 노출
  • 암호문 분석 가능성 증가
  • 같은 키 사용 시 데이터 복구 위험 증가 및 GCM 인증 보호 약화

해결 방법

  1. 매 암호화마다 암호학적으로 안전한 난수 IV/nonce를 생성합니다.
  2. IV/nonce는 비밀일 필요는 없지만 같은 키에서 재사용하지 않습니다.
  3. 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를 생성하도록 합니다.

참조