如何在APIGEE上使用Javascript通过3DES、CBC模式加密文本
以下是我的信息:如何在APIGEE上使用Javascript通过3DES、CBC模式加密文本,javascript,encryption,apigee,3des,cbc-mode,Javascript,Encryption,Apigee,3des,Cbc Mode,以下是我的信息: 纯文本:------------------------------------------------------------- 不编码 关键:------------------------------------ 不编码 加密算法:3DES,CBC模式,对称密钥 初始向量:------------------------------ 我只知道“iv必须是六边形” 所需输出: -----------------------------------------
- 纯文本:-------------------------------------------------------------
- 不编码
- 关键:------------------------------------
- 不编码
- 加密算法:3DES,CBC模式,对称密钥
- 初始向量:------------------------------
- 我只知道“iv必须是六边形”
----------------------------------------------------------------------------
----------------------------------------------------------------------------
我正在使用这个库:
我的加密函数:
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();
}
实际输出:
----------------------------------------------------------------------------
----------------------------------------------------------------------------
问题:我如何实现所需的输出?您的输入/输出和代码有许多奇怪之处和问题:
- 您有一个Base64纯文本,作为纯UTF8(??)、UTF8编码键和十六进制编码IV传递。理想情况下,您应该对所有三个值使用一种编码。如果不能使用普通二进制进行操作,我建议使用base64
- 您使用的是一个固定的IV,它引入了许多可能导致明文恢复的漏洞。始终为每个加密操作随机生成一个IV
- 在加密过程中,您将密钥作为IV传递,因此无论如何都不会使用您生成的IV切勿将钥匙用作IV
- 修改现有的to代码以实际使用IV
- 使用
将明文和密钥作为二进制数据传递给encrypt函数,以将它们作为二进制字CryptoJS.enc.Utf8.parse
- 将结果输出为十六进制,而不是base64
输出
变量从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);
非常感谢你。但我不理解“修改现有代码以实际使用IV”。这意味着我必须使用IV='0000000000000000'对吗?请查看您发布的代码。您有
iv:key
。非常抱歉。我真的不明白<代码>函数encryptByDES(message,key){var binaryMessage=CryptoJS.enc.Utf8.parse(message);var binaryKey=CryptoJS.enc.Utf8.parse(key);var iv=CryptoJS.lib.WordArray.create(8);var encrypted=CryptoJS.TripleDES.encrypt(binaryMessage,binaryKey,{iv:iv,mode:CryptoJS.mode.CBC});返回encrypted.toString();}我已对此进行了修改。但是我不能得到我想要的输出。我错过了你告诉我的什么?非常接近,做得好。您实际上得到了正确的输出,它只是编码为base64,而不是您想要的十六进制。我编辑了我的答案,加入了我用来得到你结果的代码。非常感谢。我从不做任何关于3DES的事情。这是我的第一课。