SwiftでのECB暗号モードの使用

SwiftでのECB暗号モードの使用

説明

ECBは同じ鍵で同じ平文ブロックを暗号化すると、同じ暗号文ブロックを生成するため、データのパターンが露出します。機密データに使うと、ブロックの再利用、パターン解析、事前計算による攻撃のリスクが高まります。

想定される影響

  • 暗号文のパターンの露出
  • 繰り返されるデータの特定
  • 機密情報を復元される可能性の増加

対処方法

  1. ECBではなく、AES-GCMなどの認証付き暗号を使用してください。
  2. 既存のCBCを維持する場合は、毎回新しい予測できないIVを使い、別の鍵によるencrypt-then-MACを適用してください。CTRには、同じ鍵でメッセージごとに一意なNonceと、別途完全性保護が必要です。
  3. 旧方式との互換性のために残すECBを、セキュリティ上重要な処理から分離してください。

例

変更前

CryptoSwiftの抜粋で、鍵とパディングが用意されていることを前提とします。変更後は別のAPIであるCryptoKitと、その SymmetricKey 型を使います。

swift
let blockMode = ECB()
let aes = try AES(key: key, blockMode: blockMode, padding: padding)

変更後

swift
import Foundation
import CryptoKit

func encryptAuthenticated(
    data: Data,
    key: SymmetricKey
) throws -> AES.GCM.SealedBox {
    return try AES.GCM.seal(data, using: key)
}

解説:

  • 変更前: 同じ鍵を使うECBでは、同じ平文ブロックが同じ暗号文ブロックになり、パターンが露出します。
  • 変更後: CryptoKitのAES-GCMで機密性と完全性を保護し、Nonceの生成も暗号APIに任せます。

参考資料