【问题标题】:AES encryption in Node.js to match expected decryption in PythonNode.js 中的 AES 加密以匹配 Python 中的预期解密
【发布时间】:2016-06-17 23:03:07
【问题描述】:

我有以下用于解密的 Python 脚本:

from Crypto.Cipher import AES

shared_secret = raw_input('Enter crypted_shared_secret: ').strip()
cipher = AES.new(shared_secret.decode('base64'), AES.MODE_ECB)

blob = raw_input('Enter crypted_blob: ').strip()
plain = cipher.decrypt(blob.decode('base64'))

print(plain)

我正在尝试使用 Node.js 使用该脚本生成将生成原始 blob 的值。这是我的尝试:

const Crypto = require('crypto');

var shared_secret = Crypto.randomBytes(32);
var cipher = Crypto.createCipher('aes-256-ecb', shared_secret);
crypted_blob = cipher.update(blob, 'utf8', 'base64') + cipher.final('base64');

我只能修改 Node.js 脚本,但我不确定它哪里出错了。

【问题讨论】:

    标签: python node.js encryption aes


    【解决方案1】:

    您需要将共享密钥编码为 Base64, 在您使用它进行加密之后:

    var shared_secret = Crypto.randomBytes(32);
    var cipher = Crypto.createCipheriv('aes-256-ecb', shared_secret, "");
    crypted_blob = cipher.update(blob, 'utf8', 'base64') + cipher.final('base64');
    // send `shared_secret.toString('base64')`
    

    其他问题:

    • crypto.createCipher 假定共享密钥是密码而不是密钥,这就是为什么它会使用错误的密钥派生(与 OpenSSL 兼容)。
    • Node.js 的加密模块自动应用 PKCS#7 填充(与 PKCS#5 填充相同),但 PyCrypto 自身不应用任何填充。因此,您要么需要在 Python 中使用相同的取消填充,要么可以在 node.js 中使用 Cipher.setAutoPadding(false); 禁用填充,但是您必须提供块大小的倍数(AES 为 16 字节)的明文。李>

    安全注意事项:

    • 切勿使用ECB mode。它是确定性的,因此在语义上不安全。您至少应该使用像CBCCTR 这样的随机模式。最好对您的密文进行身份验证,以免像padding oracle attack 这样的攻击是不可能的。这可以通过 GCM 或 EAX 等经过身份验证的模式或encrypt-then-MAC 方案来完成。

    【讨论】:

    • 我仍然无法让它工作。我已经削减了正在工作的 RSA 代码,AES 是似乎不起作用的部分。如果我打开节点并以 blob = 'Hello world' 开头,然后运行 ​​4 行代码,我会得到例如FH1hDHh49uGiWZhNCtg5Dw==crypted_blob。然后我可以运行shared_secret.toString('base64') 并获取例如bUQXpYLhZnR+9vKTU8txkRo7O6j7nrks1MJnxI/YIGo=。然后我打开Python,后者输入shared_secret,前者输入blob,但还是得到一个乱码(解密错误)。
    • 是的,我错过了您在 node.js 中使用了错误的方法。查看我的编辑。
    • 成功了!将考虑用 CBC 替换 ECB,谢谢您的提示!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2013-07-20
    • 2011-08-27
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多