【问题标题】:How to encrypt text by 3DES, CBC mode using Javascript on APIGEE如何在 APIGEE 上使用 Javascript 通过 3DES、CBC 模式加密文本
【发布时间】:2018-06-14 20:00:26
【问题描述】:

这是我的信息:

  • 纯文本:-------------------------------------------- --------
    • 不编码
  • 键:------------------------------------
    • 不编码
  • 加密算法:3DES,具有对称密钥的 CBC 模式
  • 初始化向量:------------------------------
    • 我只知道“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();
}

实际输出:

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

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

【问题讨论】:

    标签: javascript encryption apigee 3des cbc-mode


    【解决方案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);
    

    【讨论】:

    • 非常感谢。但我不明白这个“修改你现有的代码以实际使用 IV”。这意味着我必须使用 iv = '0000000000000000' 对吗?
    • 查看您发布的代码。你有iv: key
    • 我很抱歉。我真的不明白。 function 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 }); return encrypted.toString(); }我已对此进行了修改。但我无法得到我想要的输出。我错过了什么你告诉我的?
    • 非常接近,干得好。您实际上得到了正确的输出,它只是根据需要编码为 base64 而不是十六进制。我已经编辑了我的答案以包含我用来获取结果的代码。
    • 非常感谢。我从不对 3DES 做任何事情。这是我的第一课。
    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2011-06-07
    • 2015-11-02
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多