2011-02-22 90 views
3

這裏的理論不僅適用於PHP,也適用於更多語言。加密:測試字符串是否被正確解密?

假設我使用mcrypt庫和AES-256密碼加密字符串。加密的字符串現在看起來類似於þøÆ{」ò(ü´îÚÜÇW¹ËŸK­¯L‘rø?ª¶!JF£­º+Œ’Ú'‚

如果加密密鑰在解密和加密事件之間改變,解密的結果顯然是毫無價值的。
由於加密的字符串至少包含我自己的隨機字符,所以對其進行某種測試並不容易,以確保它處於加密/解密狀態。

我花了一些時間思考。 我如何測試一個字符串已被正確解密?
如果我在首先對原始字符串進行加密之前附加了一個小前綴,然後在解密時刪除此前綴,該怎麼辦?如果未找到該前綴,則說解密失敗是安全的。

這是處理這個問題的適當方法嗎?

+9

你可以包括你的明文的散列(如sha-1)而不是簡單的前綴。這樣你就可以把完整性檢查作爲獎勵。 – CodesInChaos 2011-02-22 19:03:32

+0

@Code這是一個好主意。散列必須後跟一個定義的字符來標記邊界 – 2011-02-22 19:09:09

+0

關於你的方法,如果你能找到一個字符串$ a,那麼對於每個可能的字符串$ b,$ a的編碼都是安全的。 $ b永遠不會以$ a開始。 – greg0ire 2011-02-22 19:09:56

回答

2

要測試數據完整性,您需要一個Message Authentication Code(MAC)。

有幾個獨立的MAC算法,看起來像一個密鑰的散列函數。非常標準的MAC算法是HMAC(它使用散列函數)。

由於您還對數據進行了加密,您將需要使用內置MAC的加密模式;有幾種這樣的模式,例如GCMEAX。這些模式適用於分組密碼,通常爲AES

加密前爲數據添加一個已知的前綴或後綴是自制的MAC。 MAC很微妙且容易出錯。例如,如果您添加一個CRC32,然後使用流密碼(或CTR模式下的分組密碼)進行加密,則您正在複製the seven capital sins of WEP中的一個(有關CRC32-as-MAC問題,請參見第4節)。基本上你的完整性檢查不再能抵抗主動攻擊;你只是在偵測無辜的錯誤,比如使用錯誤的鍵。

(不幸的是,似乎在與--with-mhash選項編譯mcrypt的不支持任何混合加密/ MAC模式。PHP本身,提供了mhash()功能,同時實現了原始散列和HMAC)

1

我怎樣才能測試一個字符串已被正確解密?

「小前綴」的想法應該沒問題;也@CodeInChaos的優秀創意。除此之外,以某種定義的格式存儲字符串(如serialize()json_encode())並且無法恢復它(unserialize(),json_decode())也可能表示解密破壞。