如何在 APIGEE 上使用 Javascript 通过 3DES、CBC 模式加密文本

How to encrypt text by 3DES, CBC mode using Javascript on APIGEE

这是我的信息:

期望输出:

----------------------------------------------------------------------------

我正在使用这个库: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();
}

实际输出:

----------------------------------------------------------------------------

问题:如何实现我想要的输出?

您的 inputs/outputs 和代码存在一些奇怪和问题:

  • 您有一个 Base64 明文,您将其作为普通 UTF8 (???)、UTF8 编码密钥和十六进制编码 IV 传递。理想情况下,您应该在所有三个值的一种编码下操作。如果你不能使用纯二进制操作,我推荐 base64。

  • 您使用的是固定 IV,这会引入许多可能导致明文恢复的漏洞。始终为每个加密操作随机生成一个 IV。

  • 您在加密期间将密钥作为 IV 传递,因此无论如何都不会使用您生成的 IV。 切勿将密钥用作 IV

我已经解决了您的问题并产生了所需的输出,但我不会 post 代码,因为您不会学到任何东西。相反,我会告诉你需要做什么来修复你所拥有的:

  • 修改您现有的代码以实际使用 IV。
  • 将明文和密钥作为二进制数据传递给加密函数,方法是使用 CryptoJS.enc.Utf8.parse 获取每个二进制字。
  • 将结果输出为十六进制而不是 base64。

编辑:用于产生所需结果的代码。注意 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);