我正在尝试使用 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/