如何使用API​​GEE上的Javascript通过3DES,CBC模式加密文本

时间:2018-01-05 02:09:30

标签: javascript encryption apigee 3des cbc-mode

这是我的信息:

  • 纯文字:-------------------------------------------- -------
    • 不编码
  • Key:------------------------------------
    • 不编码
  • Ecryption算法:3DES,带对称密钥的CBC模式
  • Init Vector:------------------------------
    • 我只知道" iv必须是hexa形式"

期望输出:

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

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

实际输出:

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

问题:如何实现所需的输出?

1 个答案:

答案 0 :(得分:1)

您的输入/输出和代码存在许多奇怪和问题:

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

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

  • 您在加密过程中将密钥作为IV传递,因此无论如何都不会使用您生成的IV。 永远不要将密钥用作IV

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

  • 修改现有代码以实际使用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);