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

AES-使用加密(node-js)进行加密/使用Pycrypto(python)进行解密

谭骏
2023-03-14
问题内容

我之所以写这个问题+答案,是因为我挣扎了很多(也许是因为缺乏经验),并迷失了使用node或python进行加密/解密的许多不同方式。

我以为我的案子将来可以帮助人们。

我需要做的是:

  • 从表单获取数据,使用Crypto(node-js)对其进行加密
  • 在Python中传递加密的数据,然后使用PyCrypto将其解密。

我选择使用AES加密。

这是我的开始方式(我不会尝试的所有事情):

  • 我遵循了本页结尾处的示例

在我的情况下:

(这可能是javascript和coffeescript之间的非常糟糕的组合)

    crypto = require "crypto"
[...]
key = "mykeywhatever"
cipher = crypto.createCipher('aes192', key)
cipher.update('string i want to encode', 'binary', 'hex')
encoded_string = cipher.final('hex')
[...]

这可以很好地编码我的字符串。

  • 然后我使用PyCrypto的github页面上的自述文件编写了python脚本来解密此字符串:
    from Crypto.Cipher import AES
    

    […]
    my_string = data_coming_from_rabbitmq
    obj = AES.new(‘mykeywhatever’, AES.MODE_CBC)
    obj.decrypt(ciphertext)
    […]

这显然行不通:在自述文件中有一个IV,但是由于我没有在节点脚本中给出一个,所以为什么要在python中给出一个?

经过更多的搜索之后,我了解到节点的Crypto使用OpenSSL,而PyCrypto显然没有。因此,我调查了一下并找到了以下页面:

  • 如何使用PyCrypto解密使用OpenSSL加密的内容?
  • AES在库PyCrypto和Node.JS Crypto中是否相同
  • 还有更多…

事情变得如此复杂,没有人在做同样的事情来解密数据,我迷路了,寻求帮助。

答案是我和我的同事想到的(嗯,主要是我的同事)。


问题答案:

因此,我们从“如何解密… OpenSSL”开始。

  • 我们需要修改加密脚本,该脚本提供了:
    crypto = require "crypto"
    

    […]
    var iv = new Buffer(‘asdfasdfasdfasdf’)
    var key = new Buffer(‘asdfasdfasdfasdfasdfasdfasdfasdf’)
    var cipher = crypto.createCipheriv(‘aes-256-cbc’, key, iv);
    cipher.update(new Buffer(“mystring”));
    var enc = cipher.final(‘base64’);
    […]

iv 需要16字节长, 密钥 是32字节。然后我们更改createCiphercreateCipheriv

  • 返回python解密脚本:

流程只是阅读PyCrypto的文档,然后与我们从开始的代码进行比较。

然后,我们决定坚持使用API并从头开始。它给了:

    from base64 import b64decode
from Crypto.Cipher import AES
[...]
iv = 'asdfasdfasdfasdf'
key = 'asdfasdfasdfasdfasdfasdfasdfasdf'
encoded = b64decode('my_encrypted_string')

dec = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
value = dec.decrypt(encoded)

就这么简单…希望对您有所帮助!

更新:

正如英仙座人在其回答的评论中所写,IV必须是随机的,并且对于每条消息都不同



 类似资料:
  • 问题内容: 我今天刚找到pycrypto,并且一直在研究AES加密课程。不幸的是,它只能成功一半。self.h.md5以十六进制格式输出md5哈希,并且为32byte。这是输出。似乎是对消息进行了解密,但是它在解密后放置了随机字符,在这种情况下,是\ n \ n \ n …我认为self.data的块大小有问题,有人知道如何解决此问题吗? Jans-MacBook-Pro:test2 jan $

  • 问题内容: 有没有一个很好的示例,说明如何在Android上使用AES 加密和解密图像及其他文件? 问题答案: 并像这样调用它们: 这应该可行,我现在在项目中使用类似的代码。

  • 我正在尝试创建一个多平台的加密-解密机制,到目前为止,我已经能够用python进行加密,用C进行解密,反之亦然,现在我正在尝试使用python脚本和node js脚本进行同样的操作。我能够在node js中加密字符串,并在python中解密,但在node中使用python的加密消息进行解密是不可能的。这里是python代码: 以下是Nodejs代码: 我的节点部分来自:AES-加密加密(node

  • 问题内容: 这是我正在做的事情,可能看起来有些笨拙,但是可以帮助您解决该问题。我得到一个。阅读几乎所有相关主题,但找不到合适的解决方案。我是加密解密程序设计的新手,需要在我的Java应用程序之一中实现它。 谢谢..这就是代码的样子.... 问题答案: 在这里,您需要了解的是密文可能包含不可打印的字符。因此,当您使用readLine()时,它可能不会为您提供文件中的所有字节。 同样,它并没有给您您认

  • 以下是我的加密/解密方法: 所以现在当我尝试加密时,我得到了这个异常: 我已经尝试在encrypt和Decrpt中使用密码实例。它只用于加密而不用于解密。我认为需要填充,因为数据大小不是16字节的倍数。“data”字节长度打印为,因此尝试将字符附加到数据中,然后进行加密,但也不起作用。

  • 问题内容: 我必须使用openssl命令行或C api加密xml文件。输出应为Base64。 一个Java程序将用于解密。该程序由客户提供,不能更改(他们正在将这些代码用于旧版应用程序)。正如您在下面的代码中看到的那样,客户提供了一个密码短语,因此将使用SecretKeySpec方法生成密钥。 Java代码: 我已经测试了几个命令,例如: 但是,使用Java无法成功解密给定的输出。为了进行测试,我