使用加密从Node.js到python进行加密和解密

时间:2018-06-18 17:22:48

标签: python node.js encryption

我使用 Node.js 来加密和解密一些数据并将它们存储在数据库中,一切正常,直到我的cpu使用量增加,更多请求解密,现在我决定将这两个函数移动到 python

const key = '' // unfortunately 39 bytes string (by mistake)
module.exports.encrypt = function (text) {
let cipher = crypto.createCipher('aes-256-ctr', key)
  let crypted = cipher.update(text, 'utf8', 'hex');
  crypted += cipher.final('hex');
  return crypted;
};

module.exports.decrypt = function (text) {
  let decipher = crypto.createDecipher('aes-256-ctr', key)
  let dec = decipher.update(text, 'hex', 'utf8');
  dec += decipher.final('utf8');
  return dec;
};

现在我在数据库中有很多加密数据,用错误的密钥加密(但在带有crypto模块的node.js中,它工作正常) 我尝试了几个python代码用该密钥解密我的加密数据,但没有一个工作(他们只接受 32字节键),有没有办法将这两个方法移动到python? (不更改

1 个答案:

答案 0 :(得分:1)

你不仅仅是1,但可能是2个问题:

  1. 使用aes-256-ctr模式时,需要256位加密密钥,但是,您使用的是长度较长的密钥。

  2. 使用此模式时,标准是生成IV并将其用于加密(您可以在更高版本的node-js中查看文档,其中crypto是nodejs的默认部分,无需导入明确)。

  3. 我不确定python,但是在Java中,你需要提供一个IV才能在使用这个模式时解密,因为这是标准。 crypto使用它自己的一些算法来生成加密和解密时,但你没有办法知道这一点。当标准使用32字节字符串时,它如何处理38字节的字符串键也是如此。

    可以有一种解决方法可以帮助您在将来再次避免任何此类数据问题。您可以执行以下步骤:运行迁移脚本,该脚本会转换您的数据,以便为每条记录执行以下操作:

    1. 使用旧密钥(39字节密钥)解密数据。

    2. 使用32位密钥再次加密数据,并将数据与IV一起存储。使用以下功能:

      function encrypt(text, secret) {
         var iv = crypto.randomBytes(16);
         var cipher = crypto.createCipheriv(algorithm, new Buffer(secret), iv);
         var encrypted = cipher.update(text);
         encrypted = Buffer.concat([encrypted, cipher.final()]);
         return iv.toString('hex') + ':' + encrypted.toString('hex');
      }
      
    3. 存储新的加密数据以代替旧的加密数据。

    4. 现在在解密时,您可以分离IV和加密数据,并使用IV解密数据。
    5. 此数据可以在任何平台上使用,使用任何语言,因为它将独立于加密模块为适应其功能而进行的操作。

      希望有所帮助。