如何安全地加密/解密具有最大塊大小的數據?
我知道不同的模式,因此可以使用諸如 AES (ECB) 之類的“原始”分組密碼來加密多個數據塊(CBC、OFB、CTR 等)和諸如 AES-GCM 之類的模式提供完整的 AEAD 實施。
查看 Amazon AWS CloudHSM 的已知限制時,AES-GCM 存在最大數據大小限制 ( https://docs.aws.amazon.com/cloudhsm/latest/userguide/ki-pkcs11-sdk.html#ki -pkcs11-8):
問題:使用 CKM_AES_GCM 機制時,C_Encrypt 和 C_Decrypt API 操作的緩衝區不能超過 16 KB
您不能使用該
CKM_AES_GCM
機制來加密大於 16 KB 的數據您可以使用另一種機制,例如 CKM_AES_CBC,或者您可以將數據分成幾部分並單獨加密每一部分。您必須管理數據的劃分和後續加密。AWS CloudHSM 不會為您執行多部分 AES-GCM 加密。請注意,FIPS 要求在 HSM 上生成 AES-GCM 的初始化向量 (IV)。因此,每條 AES-GCM 加密數據的 IV 都會不同。
這個問題是關於如何安全地“管理數據的劃分和後續加密”。
是否有任何眾所周知的記錄標準來處理這種“大塊”,從一次只能加密/解密 16KB 的 AES-GCM 的“單元”創建 AEAD 模式?它顯然需要防止數據被截斷(如果密文是 N 個“大塊”並且只有前 M 個塊被給予解密操作,這應該會失敗)並且用相同密鑰加密的不同密文替換塊也應該失敗. 還有其他潛在的擔憂嗎?
它“感覺就像”從 ECB → CBC/OFB 出現的同一類問題,但顯然,我們想要經過身份驗證的加密。
可調整的塊密碼用於磁碟加密,但塊的替換(相同的塊號/回滾)並沒有真正受到保護。
清楚地將第一個“大塊”的密文的最後 128 位附加到進入第二個“大塊”加密的相關數據中,可以防止從另一個密文中替換塊,但是如何防止截斷攻擊呢?將總數據長度附加到第一個“大塊”的關聯數據就足夠了嗎?
理想情況下,我寧願不切換到 CBC + HMAC(尤其是 > 16KB 數據的 CloudHSM 雜湊最終在本地完成!)
但是:這已經是一個已解決的問題了嗎?(理想情況下使用 IND-CCA2 證明!)
我有一個可以讓你滿意的解決方案
將文件拆分為多個部分(塊)並將它們連結起來是您的解決方案。為了防止截斷,我們將使用關聯數據,這對於第一部分和最後一部分是相同的。
假設您將文件分為 $ n $ 每個大約 16KB 的部分(需要調整)。用 $ \operatorname{AES-GCM} $ 有以下補充。加密前各部分前綴如下;
tag_0 = '' borderFlag = random for i from 1 to n if i == 1 or i == n #Fourth parameter is the Associated Data (C_i, tag_i) = AES-GCM(IVx, key, i:n || tag_i-1 || P_i, borderFlag) else (C_i, tag_i) = AES-GCM(IVx, key, i:n || tag_i-1 || P_i)
在每個零件前面加上零件編號作為
i:n
除了第一個部分之外的每個部分都使用前一部分的身份驗證標記作為前綴。
什麼是 $ \text{IVx} $ ?
- 它的總大小為 12 字節,因此沒有額外的 GHASH 計算。
- 它必須是每個加密隨機的,或者,
- 使用基於計數器的方法,給出下一個 $ \text{IVx} $ 作為上一個計數器的 +1。
- 這很重要,這樣我們就不會對正在使用的 CTR 模式進行禁止攻擊 $ (key,IV) $ -再次配對。
有了這些,你現在就有了一個可以在解密後控制的鏈。您可以檢測、添加、刪除,並在最後部分進行截斷。訂單在您的控制之下,即使沒有訂單您也可以發送。但是,您需要檢查前綴。
你也可以
- 添加零件尺寸,以及
- 如果您擔心重放攻擊,請添加加密時間。這是一般建議,需要指定係統知識。