如何使用 CryptoJS 从 3DES 加密函数中获取 8 字节输出?

How to get a 8byte Output from a 3DES encryption function using CryptoJS?

我需要在 3DES 算法中使用 16 字节密钥加密 8 字节块并获得 8 字节输出,但目前输出更大。

我试过以下功能:

function test3DES(){

    var keyHex = "01010101010101010101010101010101" 
    var block = "041234CFFFFEFDEE";

    var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), {
    mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });

    encrypted = CryptoJS.enc.Hex.parse(encrypted.toString());
    alert(encrypted)

}

键:01010101010101010101010101010101 区块:041234CFFFFEFDEE

使用其他软件我能够计算出所需的输出 241D6DFE12B470D6

但是当尝试 运行 上面的函数时,输出是 000100000c0000000d000000

你能帮我理解为什么会这样吗?

你很接近。在将 DES 加密为字符串后,您正在序列化 encrypted 中的对象。 CryptoJS 将此数据序列化为 base64 字符串。例如。

让我们以您提供的示例为例。

var keyHex = "01010101010101010101010101010101" 
var block = "041234CFFFFEFDEE";

var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });

// encrypted.toString() returns "JB1t/hK0cNZ+QigidzZmwA=="
// What you are interested in is the cipherText

var d = encrypted.ciphertext;
// This size of this ciphertext is 16 bytes. Serializing this
var encryptedHex = d.toString();
// which returns : "241d6dfe12b470d67e422822773666c0"

鉴于此,您可以读取与您的用例等效的前 8 个字节。您的代码的修改版本如下所示:

function test3DES() {

    var keyHex = "01010101010101010101010101010101" 
    var block = "041234CFFFFEFDEE";

    var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), {
         mode: CryptoJS.mode.ECB,
         padding: CryptoJS.pad.Pkcs7
    });

    encrypted = encrypted.ciphertext.toString();
    alert(encrypted.substr(0, 8*2)); // <-- read the first 8 bytes i.e. 16 bytes of hex string.
}

希望这对您有所帮助。