2009-10-30 78 views
1

如何驗證使用pyCrypto AES解密AES加密數據的正確密鑰?使用pyCrypto AES解密驗證密鑰是否正確

cipher = AES.new(key, AES.MODE_CFB) 
cipher.decrypt(s) 

如果使用不正確的密鑰,它仍會嘗試解密數據,使其更加模糊。是否有任何測試可以證明數據正在被解密到原始狀態?

回答

2

我不相信你可以 [告訴密鑰是否正確],單獨使用AES上下文
也就是說,除了在解碼之後驗證明文的格式和/或某些消息摘要值之外,您不能這樣做,這意味着您知道這樣的結構或消息摘要。

儘管這只是算法/協議建立方式的結果,但其中一個好處是,這使得對這種密碼的強力攻擊更加困難,因爲需要花時間並至少解碼部分消息並通過明文檢測器傳遞。明文檢測器是一些先驗/猜測理解明文本質的邏輯,它可以判斷數據是否符合這種期望;例如簡單的檢測器可以檢查前20個字節是否是美國ASCII碼)。這對多重編碼方案尤其有用,例如三重DES,其中沒有線索(好的密碼分析天才可能有一個溫和的想法......)中間「明文」的樣子。

編輯:回答OP的問題在筆記
是的,如果你不確定的關鍵,你需要試圖得到它解碼之前作出密文的副本。如果使用錯誤的密鑰進行解碼,它將作爲真正的亂碼返回(並且如果有的話,不會輕易可逆)。
介紹的檢測解碼消息的有效性方式,對於二進制和ASCII /文本消息,則可以在下面的「envellope」的概念使用的變化。
注意:這可能會[稍微]削弱加密設置的強度。
這假定您也擁有編碼過程的控制或協作。這適用於ASCII和二進制內容
這個想法只是爲消息添加一個前綴(「標題」)和一個後綴(「後綴」)。爲了加密更安全,這樣的前綴應該足夠長(比如500字節?),並且其大部分內容本質上是隨機的。然後你需要在這個「enveloppe」中插入實際的信息,並在描述後聲明信封的有效性/完整性。暫定例如:

 
17 random bytes 
2 bytes length of this header (allows to have a variable length header) 
1 byte offset to "fingerprint" 
x random bytes 
fingerprint = a short binary (preferably) or ascii constant text "MyDataIsOk" 
[optionally: length of the payload and/or a CRC/MD5/digest-of-sort for it] 
y random bytes 
followed by the actual message 

甲簡單化(但有點「危險」的加密)是簡單地添加,比方說,「MyDataIsGood123ABC」中的數據的前面。在解密時,您可以驗證解密後的流是以這16個字節爲單位開始的,並且您將刪除它們以獲取實際的消息。

+0

THX,一個ASCII測試可能會做的,任何想法如何我想測試一個二進制文件被加密?如果沒有,我需要在處理整個文件之前寫入某種測試用例。 – zyrus001 2009-10-30 21:01:40

+0

在我的代碼中構建一個測試用例會使得加密毫無意義?即,如果cipher.decrypt(s)=='Flag':'Correct Key': - 如果密鑰錯誤,我需要避免破壞數據。 – zyrus001 2009-10-30 21:10:48

+0

@ zyrus001請參閱編輯和主意來確定消息的有效性/完整性。另外,是的,如果您不確定密鑰,則需要複製密文。 – mjv 2009-10-30 22:59:06

0

看看這個博客帖子,它包括示例代碼,做什麼,你需要(即CRC)
Python symmetric encryption with CRC

+0

請問,爲什麼你提出了一個早就知道弱項的計劃?例如,Stubblebine和Gligor在他們的論文「關於密碼協議中的消息完整性」,安全和隱私研究研討會上發表了許多其他論文。 1992. – Accipitridae 2010-03-17 22:11:11

+0

感謝您發佈您的答案!請務必仔細閱讀[自助推廣常見問題](http://stackoverflow.com/faq#promotion)。另請注意,每次鏈接到您自己的網站/產品時,您都必須*發佈免責聲明。 – 2012-06-01 20:01:35

+0

使用CRC已知加密不安全。不要使用這個答案提出的。 – 2016-03-04 07:11:54