这是我的信息:
期望输出:
----------------------------------------------------------------------------
我正在使用此库:https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/tripledes.js
我的加密功能:
function encryptByDES(message, key){
var iv = CryptoJS.lib.WordArray.create(8);
var encrypted = CryptoJS.TripleDES.encrypt(message, key, {
iv: key,
mode: CryptoJS.mode.CBC
});
return encrypted.toString();
}
实际输出:
----------------------------------------------------------------------------
问题:如何实现所需的输出?
答案 0 :(得分:1)
您的输入/输出和代码存在许多奇怪和问题:
您有一个Base64明文,您可以将其作为普通的UTF8(???),UTF8编码密钥和十六进制编码的IV传递。理想情况下,您应该在一个编码下对所有三个值进行操作。如果你不能使用普通二进制文件操作,我推荐使用base64。
您正在使用固定的IV,它会引入许多可能导致明文恢复的漏洞。始终为每个加密操作随机生成IV。
您在加密过程中将密钥作为IV传递,因此无论如何都不会使用您生成的IV。 永远不要将密钥用作IV 。
我已经解决了你的问题并产生了所需的输出,但我不会发布代码,因为你不会学到任何东西。相反,我会告诉你需要做些什么来修复你拥有的东西:
CryptoJS.enc.Utf8.parse
将明文和密钥作为二进制数据传递给加密函数,将每个数据作为二进制字。编辑:用于产生所需结果的代码。请注意output
变量从base64到十六进制的转换:
let iv = CryptoJS.enc.Hex.parse("0000000000000000");
let pt = CryptoJS.enc.Utf8.parse("MjAxODAxMDQwOTM5MzgxMjM0NTY3ODkwMTIzNA==");
let key = CryptoJS.enc.Utf8.parse("20180104093938xSpUoDU3Z0");
let result = CryptoJS.TripleDES.encrypt(pt, key, {
iv: iv,
mode: CryptoJS.mode.CBC
});
let output = CryptoJS.enc.Hex.stringify(CryptoJS.enc.Base64.parse(result.toString()));
console.log(output);