2015-09-11 62 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不必是保密的,因此您可以将它放在密文前,并在解密前将其切断。