当前位置: 首页 > 面试题库 >

Node.js中的AES加密以匹配Python中预期的解密

刘骏祥
2023-03-14
问题内容

我有以下用于解密的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)

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

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脚本,但是我不确定它出了什么问题。


问题答案:

将共享密钥用于加密 ,才需要将其编码为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模式。它是确定性的,因此在语义上不安全。您至少应使用CBC或CTR之类的随机模式。最好对您的密文进行身份验证,这样就不可能进行像填充预言攻击之类的攻击。这可以通过GCM或EAX之类的经过身份验证的模式来完成,也可以通过“ 加密-然后-MAC”方案来完成。


 类似资料:
  • 就像我说的,一切都很好,除了这个小的decypt...我搜索了谷歌和所有的东西,尝试了示例代码,但似乎我的代码有些东西不对。

  • 问题内容: 我已经获得了用于加密的Java实现,但是很遗憾,我们是.net商店,并且无法将Java集成到我们的解决方案中。不幸的是,我也不是Java专家,所以我已经为此奋斗了几天,以为我最终会在这里寻求帮助。 我一直在寻找一种与Java加密工作方式相匹配的方法,并且已经找到了在c#中使用RijndaelManaged所需的分辨率。我真的很近。我在c#中返回的字符串与前半部分匹配,但后半部分不同。

  • 我已经看过了AES-Encryption with Crypto(node js)/decryption with Pycrypto(python)的文章,因为我正试图做完全相反的事情,但我似乎做得不对。这是我到目前为止试过的。。。 Python加密 节点。js解密 每次我尝试运行节点时。js解密,我最终得到错误消息:

  • 问题内容: 我一直在寻找一个解决方案,并在Node.js服务器和Objective-C客户端上进行加密,反之亦然,使用AES(或其他合适的方法)进行搜索 我对密码学还比较陌生,因此我无法理解为什么每种语言的加密文本都不同。 这是我到目前为止的内容: 使用此CryptoJS库的 Node.js加密方法 -node-cryptojs-aes 使用AESCrypt库的 Objective-C加密方法 多

  • 我使用AES方法对从txt文件调用的sentance进行加密。我使用了GCM模式并创建了一个特定的密钥。一切都在工作(代码如下)。 我尝试实现解密过程,也就是说,我只有密钥(HexMyKeyvalue)和加密消息(HexEncryptedOriginalMessage value)并且我想对其进行解密。但问题是我错过了一些东西... 我写了下面的代码,但我有错误消息。 TypeError:decr

  • 我需要用python解密在OpenSSL上加密的文件,但我不了解pycrypto的选项。 下面是我在OpenSSL中所做的 > openssl enc-aes-256-cbc-a-盐-pbkdf2-iter 100000-在"clear.txt"-在"crypt.txt"-传递:"my密码" openssl enc-d-aes-256-cbc-a-pbkdf2-iter 100000-输入“cry