node.js - 使用 CryptoJS 解密 openssl AES

标签 node.js encryption openssl cryptojs

我正在尝试使用 CryptoJS 3.1.5 解密使用 openssl 加密的文件.

如果我使用 CryptoJS 加密和解密,一切都会正常,shell 中的 OpenSSL 也是如此,但是当我尝试将 CryptoJS 与 OpenSSL 混合时,一切都会出错。

该文件是使用以下命令创建的:

openssl enc -aes-256-cbc -in file.txt -out file.enc -k password

我尝试像这样解密:

fs.readFile('file.enc', function(err, data) {
  var decrypted = CryptoJS.AES.decrypt(
                    data.toString(),
                    "password",
                    { mode : CryptoJS.mode.CBC }
                  );

  console.log(decrypted.toString(CryptoJS.enc.Utf8));
});

// Give me this err: Uncaught Error: Malformed UTF-8 data

从另一方面来说,我也这样做:

fs.readFile('file.txt', function(err, data) {
  var encrypted = CryptoJS.AES.encrypt(
                    data.toString(),
                    "password",
                    { mode : CryptoJS.mode.CBC });

  fs.writeFile('file.enc', encrypted);
});

然后在 Shell 中:

openssl enc -d -aes-256-cbc -in file.enc -out file2.txt -k password
// Give me this err: bad magic number

我是否遗漏了一些明显的东西?

最佳答案

郑重声明,这就是我解密 openssl 文件的方法。

//openssl enc -aes-256-cbc -in file.txt -out file.enc -k password

fs.readFile('file.enc', function(err, data) {
  var salt          = data.toString("hex", 8, 16),
      enc           = data.toString("hex", 16, data.length),
      derivedParams = CryptoJS.kdf.OpenSSL.execute(
                        password,
                        256/32,
                        128/32,
                        CryptoJS.enc.Hex.parse(salt)
                      ),
      cipherParams  = CryptoJS.lib.CipherParams.create({
                       ciphertext : CryptoJS.enc.Hex.parse(enc)
                     }),
      decrypted     = CryptoJS.AES.decrypt(
                        cipherParams,
                        derivedParams.key,
                        { iv : derivedParams.iv }
                      );

  console.log(hex2a(decrypted.toString())); // result is in hexa
});

这就是我如何加密以使其与 OpenSSL 一起使用

fs.readFile('file.txt', function(err, data) {
  var encrypted = CryptoJS.AES.encrypt(data.toString(), password);
      buff      = new Buffer(encrypted.toString(), "base64");

  fs.writeFile('file.enc', buff);
});

// openssl enc -d -aes-256-cbc -in file.enc -out file2.txt -k password

希望它能帮助别人:)

关于node.js - 使用 CryptoJS 解密 openssl AES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32654749/

相关文章:

mysql - Sequelize 4 - eagger 加载时属于多对多插入问题

c++ - 防止破解——特别是使程序更难反编译的方法

delphi - 加密组件

jar - 在没有 JRE 但使用 OpenSSL 的情况下签署 JAR?

Node.js typescript Azure 函数 : Cannot import with absolute path ( minimal reproducible example attached)

node.js - Node PDFKit 管道到多个目标

apache - 来自浏览器的过时加密警告

ssl - 如何在 OpenSSL 中设置 SSL 协议(protocol)优先级

javascript - For 循环在 Jade 中的 Node.js 中声明的变量在 Javascript 中不起作用

java - RSA 中 1024 位 key 长度的实数