javascript - 如何使用aes-128-cbc算法实现CryptoJS解密?

标签 javascript node.js encryption aes cryptojs

我得到一个使用 Java 生成的加密 key 。我需要使用 CryptoJS 在 AngularJS 应用程序中解密它。我曾使用 Node 做过类似的事情,但现在在 Angular 中我被卡住了。这把 fiddle http://jsfiddle.net/s5g82rqh/是我到目前为止尝试过的方法,但它返回的是空的。

下面是我目前的尝试

 function decrypt_core_AES_CBC(password, ciphertext) {
   var iv  = CryptoJS.lib.WordArray.random(128/8);
   var message = CryptoJS.AES.decrypt(ciphertext, password, { mode:    CryptoJS.mode.CBC, iv: password });

  console.log("The current iv is: " + iv.toString() );
  return CryptoJS.enc.Utf8.stringify(message);
 }


var data = '6615702f2dd672f643fd57623d6362a510a98faf4b1c068fd468b525a5fa5471809852a0f9cb7936ce3d3892c233b8c48ce2608f16ce6fa66005b2d97689fbb4';
var key = '3426D38AB846B62B9C236D288778D997';
var dec = decrypt_core_AES_CBC(key, data);

console.log(dec);

下面是适合我的 node.js 代码。我在 CryptoJS 中没有成功实现类似的。根据我的理解,加密是作为内置库出现的,哪个 Node 在其之上有自己的包装器。

var crypto = require('crypto');
var defaultAlgorithm= 'aes-128-cbc';
var defaultFormat= 'hex';
var ivLength= 16;
function decode (data, key, algorithm, format) {

    // Make sure the data is a buffer object
    if (data instanceof Buffer) {
        data = data.toString();
    }

    // Get defaults if needed
    algorithm = algorithm || defaultAlgorithm;
    format = format || defaultFormat;

    ivLength = ivLength * 2;

    // Get the initialization vector
    var iv = new Buffer(data.substring(0, ivLength), 'hex');

    // Remove the iv from the data
    data = data.substring(ivLength);
    var decipher = crypto.createDecipheriv(algorithm, new Buffer(key, 'hex'), iv);
    var decrypted = decipher.update(data, format, 'utf8') + decipher.final('utf8');

    return decrypted;
}

var data ='6615702f2dd672f643fd57623d6362a510a98faf4b1c068fd468b525a5fa5471809852a0f9cb7936ce3d3892c233b8c48ce2608f16ce6fa66005b2d97689fbb4';
var key = '3426D38AB846B62B9C236D288778D997';
var dec = decode(data, key, defaultAlgorithm, defaultFormat);

console.log(dec);

最佳答案

你有三个问题:

  • CryptoJS 支持两种类型的加密/解密:从密码派生的 key 和直接传递的 key 。您想从 key 执行此操作,因此您需要将十六进制编码的 key 字符串解析为 CryptoJS 的 native 格式,然后再将其传递给 decrypt() 函数:

    key = CryptoJS.enc.Hex.parse(key);
    

    另外,不要混淆 key 和密码。

  • 你忘记在解密前从密文中切掉 IV。

    var iv = CryptoJS.enc.Hex.parse(ciphertext.slice(0, 32));
    ciphertext = CryptoJS.enc.Hex.parse(ciphertext.slice(32));
    
  • CryptoJS' 需要一个 CipherParams 对象或一个 OpenSSL 格式的字符串来解密。由于你只有一个十六进制字符串,你必须在使用前解析它并像这样使用它:

    var message = CryptoJS.AES.decrypt({
        ciphertext: ciphertext
    }, key, {
        iv: iv
    });
    

关于javascript - 如何使用aes-128-cbc算法实现CryptoJS解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31680986/

相关文章:

encryption - Chef解密数据包并找回 key

javascript - 在 JavaScript 中传递数据的最简单方法

node.js - 如何使用 Feathers 和 Sequelize 定义多对多,并在连接表中添加附加字段?

javascript - oauth2Client.getToken 缺少 refresh_token

java - 3DES (DESede) - 在 C# 中解密加密文本(由 JAVA 完成)

javax.crypto.IllegalBlockSizeException : last block incomplete in decryption

javascript - 如何在该类的另一个函数中使用在 Typescript 类中声明的函数?

javascript - 只能将 ""指定为输入类型文件的值

javascript - Sails js 文件上传错误

node.js - Mongoose $lookup 对象返回空数组