我得到一个使用 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/