如何使用 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.
}
希望这对您有所帮助。
我需要在 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.
}
希望这对您有所帮助。