説明
ECBは同じ鍵で同じ平文ブロックを暗号化すると、同じ暗号文ブロックを生成するため、データのパターンが露出します。機密データに使うと、ブロックの再利用、パターン解析、事前計算による攻撃のリスクが高まります。
想定される影響
- 暗号文のパターンの露出
- 繰り返されるデータの特定
- 機密情報を復元される可能性の増加
対処方法
- ECBではなく、AES-GCMなどの認証付き暗号を使用してください。
- 既存のCBCを維持する場合は、毎回新しい予測できないIVを使い、別の鍵によるencrypt-then-MACを適用してください。CTRには、同じ鍵でメッセージごとに一意なNonceと、別途完全性保護が必要です。
- 旧方式との互換性のために残す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に任せます。