使用Pycrypto(Pycrypto,Pycrypto)的AES解密不起作用。在加密(Nodejs)中获取正确的解密代码。

2024-06-08 22:53:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在node中,我使用以下代码获取正确的解密消息:

//npm install --save-dev crypto-js
var CryptoJS = require("crypto-js");
var esp8266_msg = 'IqszviDrXw5juapvVrQ2Eh/H3TqBsPkSOYY25hOQzJck+ZWIg2QsgBqYQv6lWHcdOclvVLOSOouk3PmGfIXv//cURM8UBJkKF83fPawwuxg=';
var esp8266_iv  = 'Cqkbb7OxPGoXhk70DjGYjw==';

// The AES encryption/decryption key to be used.
var AESKey = '2B7E151628AED2A6ABF7158809CF4F3C';

var plain_iv =  new Buffer( esp8266_iv , 'base64').toString('hex');
var iv = CryptoJS.enc.Hex.parse( plain_iv );
var key= CryptoJS.enc.Hex.parse( AESKey );

console.log("Let's ");

// Decrypt
var bytes  = CryptoJS.AES.decrypt( esp8266_msg, key , { iv: iv} );
var plaintext = bytes.toString(CryptoJS.enc.Base64);
var decoded_b64msg =  new Buffer(plaintext , 'base64').toString('ascii');
var decoded_msg =     new Buffer( decoded_b64msg , 'base64').toString('ascii');

console.log("Decryptedage: ", decoded_msg);

但当我试图用python解密时,我没有得到正确的解码消息。

^{pr2}$

我收到解码信息:

"ルᄊ+#ÊZûᆪᄃn*ÿÒá×G1ᄄᄋì;$-#f゚ãᄚk-ìØܳã-トȒ~ヌ8ヘヘ_ᄂ ン?ᄂÑ:ÇäYムü'hユô<`

所以我希望有人能展示一下python是如何做到的。在


Tags: key消息newvarbufferjsmsgcrypto
1条回答
网友
1楼 · 发布于 2024-06-08 22:53:55

你忘了decode the key from Hex和{a2}。在

完整代码:

from Crypto.Cipher import AES
import base64

unpad = lambda s : s[:-ord(s[len(s)-1:])]

esp8266_msg = 'IqszviDrXw5juapvVrQ2Eh/H3TqBsPkSOYY25hOQzJck+ZWIg2QsgBqYQv6lWHcdOclvVLOSOouk3PmGfIXv//cURM8UBJkKF83fPawwuxg='
esp8266_iv  = 'Cqkbb7OxPGoXhk70DjGYjw=='
key = '2B7E151628AED2A6ABF7158809CF4F3C'
iv = base64.b64decode(esp8266_iv)
message = base64.b64decode(esp8266_msg)
key = key.decode("hex")
dec = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
value = unpad(dec.decrypt(message))
print(value)
if len(value) % 4 is not 0:
    value += (4 - len(value) % 4) * "="
value = base64.b64decode(value)
print(value)

输出:

^{pr2}$

安全考虑因素

静脉注射一定是不可预测的。不要使用静态IV,因为这会使密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定之前发送相同消息前缀的时间。静脉注射不是秘密的,所以你可以把它和密文一起发送。通常,它只是在密文前面加上一层,然后在解密之前被切掉。在

最好对密文进行身份验证,这样就不会出现padding oracle attack之类的攻击。这可以通过GCM或EAX之类的认证模式来实现,或者使用encrypt-then-MAC方案。在

相关问题 更多 >