使用CryptoJS解密openssl AES

Tag*_*ada 1 encryption openssl node.js cryptojs

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

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

使用以下命令创建文件:

openssl enc -aes-256-cbc -in file.txt -out file.enc -k password
Run Code Online (Sandbox Code Playgroud)

我试着像这样解密:

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
Run Code Online (Sandbox Code Playgroud)

而在另一方面,我做:

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

  fs.writeFile('file.enc', encrypted);
});
Run Code Online (Sandbox Code Playgroud)

然后在壳牌:

openssl enc -d -aes-256-cbc -in file.enc -out file2.txt -k password
// Give me this err: bad magic number
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗

Tag*_*ada 7

为了记录,这是我解密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
});
Run Code Online (Sandbox Code Playgroud)

这就是我加密以使其与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
Run Code Online (Sandbox Code Playgroud)

希望它能帮到某人:)