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

Jos*_*Jos 2 python encryption cryptography pycrypto node.js

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

//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);
Run Code Online (Sandbox Code Playgroud)

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

esp8266_msg = 'IqszviDrXw5juapvVrQ2Eh/H3TqBsPkSOYY25hOQzJck+ZWIg2QsgBqYQv6lWHcdOclvVLOSOouk3PmGfIXv//cURM8UBJkKF83fPawwuxg='
esp8266_iv  = 'Cqkbb7OxPGoXhk70DjGYjw=='
key = '2B7E151628AED2A6ABF7158809CF4F3C'
iv = base64.b64decode(esp8266_iv)
message = base64.b64decode(esp8266_msg)
dec = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
value = dec.decrypt(message)
print(value)
Run Code Online (Sandbox Code Playgroud)

我收到解码后的消息:

"??+#ÊZû??n*ÿÒá×G1??ì;$-#f?ã?k-ìØ?ã-??~?8??_? ???Ñ:ÇäY?ü'h?ô<`
Run Code Online (Sandbox Code Playgroud)

因此,我希望有人可以展示它是如何在python中完成的。

Art*_* B. 5

您忘记了从十六进制解码密钥删除了填充

完整代码:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

eyJkYXRhIjp7InZhbHVlIjozMDB9LCAiU0VRTiI6NzAwICwgIm1zZyI6IklUIFdPUktTISEiIH0
'{“ data”:{“ value”:300},“ SEQN”:700,“ msg”:“ IT WORKS !!” }'

安全注意事项

IV必须是不可预测的(读取:随机)。不要使用静态IV,因为这会使密码具有确定性,因此在语义上也不安全。观察密文的攻击者可以确定以前何时发送相同的消息前缀。IV不是秘密的,因此您可以将其与密文一起发送。通常,它只是简单地加在密文之前,并在解密之前将其切开。

最好对您的密文进行身份验证,这样就不可能进行像填充oracle攻击之类的攻击。这可以通过GCM或EAX之类的经过身份验证的模式来完成,也可以通过“ 加密-然后-MAC”方案来完成。