如何在 APIGEE 上使用 Javascript 通过 3DES、CBC 模式加密文本
How to encrypt text by 3DES, CBC mode using Javascript on APIGEE
这是我的信息:
- 纯文本:---------------------------------------- ----------
- 不编码
- 键:--------------------------------
- 不编码
- 加密算法:3DES,带对称密钥的 CBC 模式
- 初始向量:----------------------------
- 我只知道"iv must be hexa form"
期望输出:
----------------------------------------------------------------------------
我正在使用这个库: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);
这是我的信息:
- 纯文本:---------------------------------------- ----------
- 不编码
- 键:--------------------------------
- 不编码
- 加密算法:3DES,带对称密钥的 CBC 模式
- 初始向量:----------------------------
- 我只知道"iv must be hexa form"
期望输出:
----------------------------------------------------------------------------
我正在使用这个库: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);