如何格式化数据以正确解密 CryptoJS 中的十六进制字符串

我有一个通过直接 IP 接收信息的 TCP 服务器。我收到以 AES-128-CBC 加密的此信息。(十六进制字节缓冲区)然后我将缓冲区转换为一串没有空格的十六进制字节。“原始消息”


我通过了 IV,即加密消息,并且我对密钥进行了硬编码。我仍然无法正确解密消息。我通常会得到一个完全不同的解密或一个空字符串。我假设我的一个或多个变量格式错误?


本周之前我对密码学的经验为零,但这是我的任务。因此,如果问题很小,我深表歉意。


我正在从 C 语言的同事那里接收数据。我担心 CryptoJS 与我传递的数据不兼容?任何帮助深表感谢。


代码.js


const CryptoJS = require("crypto-js");


var originalMsg = "5303F15FB8317A010300000000000001F3E0C003E24340E4E4"


var encrypted = "00000003C4302B119E7BB9C36655F6BCDF251808C6748A11949A89309AD17600F6164FF45CDC"

var key = "242E389B1672B4ECEA92FE7466DF3A52"

var iv = "0000E34500FF0000000000FF00000000"



var decryptData2 = function(encryptedData) {

    var C = CryptoJS;                          

    var Key = CryptoJS.enc.Hex.parse("242E389B1672B4ECEA92FE7466DF3A52")

    var IV = CryptoJS.enc.Hex.parse("0000E34500FF0000000000FF00000000")


// I have tried 

    var decryptedText = C.AES.decrypt(encryptedData, Key, {               

        iv: IV,

        mode: C.mode.CBC,

        padding: C.pad.Pkcs7

    });

   

    return decryptedText.toString(CryptoJS.enc.Utf8);

}


var result = decryptData2(CryptoJS.enc.Hex.parse("00000003C4302B119E7BB9C36655F6BCDF251808C6748A11949A89309AD17600F6164FF45CDC"))

console.log(result); 

编辑:更新 iv 和加密变量


//old vars

encrypted ="00000003C4302B119E7BB9C36655F6BCDF251808C6748A11949A89309AD17600F6164FF45CDC"


iv = "02C4100000E34500FF0000000000FF00"


临摹微笑
浏览 303回答 1
1回答

吃鸡游戏

依赖样本数据总是好的,因为这对找到可行的解决方案有很大帮助。您可以在下面找到一个能够解密消息的示例程序。一些评论它是如何工作的:a) 我将所有给定数据转换为 Crypto-JS 字数组以与加密方法兼容:var key = CryptoJS.enc.Hex.parse("242E389B1672B4ECEA92FE7466DF3A52");b) 要查看我应该使用哪些加密数据进行解密,我首先对originalMsg进行加密并获得以下输出:ciphertext:             2b119e7bb9c36655f6bcdf251808c6748a11949a89309ad17600f6164ff45cdcc.txt exp:  00000003c4302b119e7bb9c36655f6bcdf251808c6748a11949a89309ad17600f6164ff45cdc第一行是加密的“originalMsg”,第二行是您识别为“加密”的数据——看到区别了吗?正如我之前评论的那样,加密值太长了 6 个字节(它必须是 16 的倍数,你的“加密”是 38 个字节长)。c) 尝试解密需要 base64 编码的输入(还有其他方法,这种方法是我在这里使用它的最方便的方法)所以首先我将单词数组“加密”编码为(Base64 编码)“encryptedBase64 " 并将字符串呈现给 aesCbcDecrypt 函数。由于数据太长,没有输出。var encryptedBase64 = CryptoJS.enc.Base64.stringify(encrypted);var decrypted = aesCbcDecrypt(key, iv, encryptedBase64);console.log("decrypted: " + decrypted);result:decrypted:d) 现在我从加密中删除前 6 个字节(12 个十六进制“字符”),并将剩余数据用于相同的解密功能:var encrypted2 = CryptoJS.enc.Hex.parse("2B119E7BB9C36655F6BCDF251808C6748A11949A89309AD17600F6164FF45CDC");console.log("encrypted2 length: " + encrypted2.sigBytes);var encrypted2Base64 = CryptoJS.enc.Base64.stringify(encrypted2);var decrypted2 = aesCbcDecrypt(key, iv, encrypted2Base64);console.log("decrypted2: " + decrypted2);console.log("orig.Msg  : " + originalMsgHex);result:decrypted2: 5303f15fb8317a010300000000000001f3e0c003e24340e4e4orig.Msg  : 5303F15FB8317A010300000000000001F3E0C003E24340E4E4decrypted2 值现在等于 originalMsg。如果您想查看在在线编译器中运行的代码 - 这里是链接: https: //repl.it/@javacrypto/SoCryptoJsDecrypt#index.js我让您将这些信息放在一起以获得编程解决方案,因为这应该只解释如何获取解密数据。完整输出:key length: 16iv length: 16ciphertext:             2b119e7bb9c36655f6bcdf251808c6748a11949a89309ad17600f6164ff45cdcc.txt exp:  00000003c4302b119e7bb9c36655f6bcdf251808c6748a11949a89309ad17600f6164ff45cdcencrypted length: 38decrypted:encrypted2 length: 32decrypted2: 5303f15fb8317a010300000000000001f3e0c003e24340e4e4orig.Msg  : 5303F15FB8317A010300000000000001F3E0C003E24340E4E4安全警告:该代码没有异常处理,仅用于教育目的。完整代码:const CryptoJS = require("crypto-js");var originalMsgHex = "5303F15FB8317A010300000000000001F3E0C003E24340E4E4";var originalMsg = CryptoJS.enc.Hex.parse(originalMsgHex);//("5303F15FB8317A010300000000000001F3E0C003E24340E4E4");var encrypted = CryptoJS.enc.Hex.parse("00000003C4302B119E7BB9C36655F6BCDF251808C6748A11949A89309AD17600F6164FF45CDC");var key = CryptoJS.enc.Hex.parse("242E389B1672B4ECEA92FE7466DF3A52");var iv = CryptoJS.enc.Hex.parse("0000E34500FF0000000000FF00000000");console.log("key length: " + key.sigBytes);console.log("iv length: " + iv.sigBytes);// encryption of originalMsgvar ciphertext = aesCbcEncrypt(key, iv, originalMsg);console.log("ciphertext:             " + ciphertext);console.log("c.txt exp:  " + encrypted);// decryption of encryption fails due to wrong length (not multiple of 16)console.log("encrypted length: " + encrypted.sigBytes); // result: 38// prepare encrypted for decryption by base64encodingvar encryptedBase64 = CryptoJS.enc.Base64.stringify(encrypted);var decrypted = aesCbcDecrypt(key, iv, encryptedBase64);console.log("decrypted: " + decrypted);// cutting off the first 6 bytes from encryptedvar encrypted2 = CryptoJS.enc.Hex.parse("2B119E7BB9C36655F6BCDF251808C6748A11949A89309AD17600F6164FF45CDC");console.log("encrypted2 length: " + encrypted2.sigBytes);var encrypted2Base64 = CryptoJS.enc.Base64.stringify(encrypted2);var decrypted2 = aesCbcDecrypt(key, iv, encrypted2Base64);console.log("decrypted2: " + decrypted2);console.log("orig.Msg  : " + originalMsgHex);function aesCbcEncrypt(keyF, ivF, data) {  const cipher = CryptoJS.AES.encrypt(data, keyF,  {    iv: ivF,    padding: CryptoJS.pad.Pkcs7,    mode: CryptoJS.mode.CBC  });  return cipher.ciphertext;}function aesCbcDecrypt(keyF, ivF, ciphertext) {  const cipher = CryptoJS.AES.decrypt(ciphertext, keyF,  {    iv: ivF,    padding: CryptoJS.pad.Pkcs7,    mode: CryptoJS.mode.CBC  });  return cipher;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript