2015-09-11 102 views
0

這裏是一個與解碼AES加密的字符串移植AES解密PyCrypto

var p = 'some large string' 
var s = 'Q05WTmhPSjlXM1BmeFd0UEtiOGg=' 
var y = CryptoJS.AES.decrypt({ 
    ciphertext: CryptoJS.enc.Base64.parse(p) 
}, CryptoJS.enc.Base64.parse(s), { 
    iv CryptoJS.enc.Hex.parse("random") 
}); 
var v = y.toString(CryptoJS.enc.Utf8) 

我試圖與進口AES編寫Python中的類似的解碼功能一個JavaScript部分。

任何人都可以幫助我這個。我無法找出js到python的所有等效代碼。

我擡頭一看這個頁面 Python AES Decryption Routine (Code Help)

AES - Encryption with Crypto (node-js)/decryption with Pycrypto (python)

不知道他們是否有類似的js代碼我這裏

"y.toString(CryptoJS.enc.Utf8)" 

這蟒蛇是什麼意思

我已經嘗試了這樣從另一個來源

from base64 import b64decode 
from Crypto.Cipher import AES 

iv = 'random' 
key = 'Q05WTmhPSjlXM1BmeFd0UEtiOGg=' 
encoded = b64decode('some large string') 

dec = AES.new(key=key, mode=AES.MODE_CBC, IV=iv) 
value = dec.decrypt(encoded) 
+0

請說明你已經嘗試了什麼,以及你如何解決問題。它將有助於解決你的問題,而不是從頭開始爲你寫一些東西。 –

回答

2

CryptoJS代碼和Python代碼存在多個問題。

錯誤密鑰大小

您的鍵s僅包含20個字節(160位),這並不構成任何有效密鑰大小爲AES其是128(10)的,192(12)和256位( 14輪)。 CryptoJS將默默運行一個160位密鑰的密鑰計劃,並進行11輪處理,其中PyCrypto不支持(請參閱AES.c)。

可以縮小鍵128位像這樣CryptoJS:

var key = CryptoJS.enc.Base64.parse('Q05WTmhPSjlXM1BmeFd0UEtiOGg='); 
key.sigBytes = 16; 
key.clamp(); 

或在Python:

key = b64decode('Q05WTmhPSjlXM1BmeFd0UEtiOGg=')[:16] 

錯誤的字符編碼

你忘了解碼從關鍵Python中的Base64字符串,你忘了從十六進制解碼IV。字符'0'和字節0x00完全不同。有定義一個更簡單的方法全零IV:

iv = "\0"*16 

沒有去填充

CryptoJS使用PKCS#7填充默認,但PyCrypto沒有實現任何填充和只處理數據的多塊大小。之後您解密的東西,你需要刪除自己填充在Python:

value = value[:value[-1]] 

(最後一個字節決定多少字節填充字節)。更多關於那here


其他注意事項:

你真的不應該設置四靜態值。應該使用相同的密鑰爲每次加密隨機生成IV。否則,你將失去語義安全性。由於IV不必是保密的,因此您可以將它放在密文前,並在解密前將其切斷。