Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在APIGEE上使用Javascript通过3DES、CBC模式加密文本_Javascript_Encryption_Apigee_3des_Cbc Mode - Fatal编程技术网

如何在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
  • 使用
    CryptoJS.enc.Utf8.parse
    将明文和密钥作为二进制数据传递给encrypt函数,以将它们作为二进制字
  • 将结果输出为十六进制,而不是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的事情。这是我的第一课。