CryptoJS DES(ECB)加密-Base64编码-无法产生正确的结果

时间:2019-06-03 13:08:25

标签: javascript encryption cryptography cryptojs des

我们有一个第三方供应商,已向我们指出https://www.tools4noobs.com/online_tools/encrypt/为其API生成身份验证令牌。

这可以正常工作,但是我们现在处于需要以编程方式生成这些令牌的阶段。它必须是DES格式,ECB模式,并以Base64编码。

我们尝试了CryptoJS javascript库,但结果与https://www.tools4noobs.com/online_tools/encrypt/的输出不匹配

var encrypted = CryptoJS.DES.encrypt(text, key, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7

        });

        var finalEncrypted = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
        console.log(finalEncrypted); 

我要去哪里错了?

1 个答案:

答案 0 :(得分:1)

Tools4noobs使用PHP方法 function scramble(my_string, my_array) { let returnable_array = []; for(let [string_index, array_index] of my_array.entries()) { returnable_array[array_index] = my_string[string_index]; } returnable_string = returnable_array.join(""); return returnable_string } console.log(scramble("abcd", [0,3,1,2]));,该方法可用于零字节填充。发布的代码使用PKCS7-Padding。要使用零字节填充,必须将代码中的填充更改为mcyrpt_encrypt

但是,如果应使用Pkcs7-Padding,则Tools4noobs不是一个好的选择,因为无法设置填充。在这种情况下,另一个选项是TxtWizard

另一个错误源是密钥的格式。但是,由于在生成的代码中未显示密钥生成,因此在这里还不能说这是否也是一个问题。重要的是,密钥必须以CryptoJS.pad.ZeroPadding而不是字符串的形式传递。如果将其作为字符串传递,则将其解释为用于生成实际密钥的密码短语,请参见The Cipher Input

以下代码

WordArray

有输出

var key = CryptoJS.enc.Latin1.parse("12345678"); // key as WordArray
var text = "The quick brown fox jumps over the lazy dog";

var encrypted = CryptoJS.DES.encrypt(text, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.ZeroPadding // Zero-Byte-Padding
});

var finalEncrypted = CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
console.log(finalEncrypted); 

Tools4noobs输出一致。