【问题标题】:AES Decryption using Pycrypto(python) not working. Getting correct decrypted code in crypto(Nodejs).使用 Pycrypto(python) 的 AES 解密不起作用。在加密(Nodejs)中获取正确的解密代码。
【发布时间】:2017-04-08 07:54:58
【问题描述】:

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

//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 中解密它时,我没有得到正确的解码消息。

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)

我收到了解码后的消息:

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

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

【问题讨论】:

    标签: python node.js encryption cryptography pycrypto


    【解决方案1】:

    你忘了decode the key from Hexremove the padding

    完整代码:

    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)

    输出:

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

    安全注意事项

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

    最好对您的密文进行身份验证,这样就不会像padding oracle attack 这样的攻击。这可以通过 GCM 或 EAX 等经过身份验证的模式或encrypt-then-MAC 方案来完成。

    【讨论】:

    • 但这不是编码的内容,并且在节点中我得到了正确解码的消息。
    • 通过base64编码解决,然后2倍标准base64解码两次
    • 我已将第二个 Base64 解码添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2014-01-18
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多