Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解密AES十六进制消息以完成与服务器的相互身份验证_Javascript_Encryption_Cryptography_Cryptojs - Fatal编程技术网

Javascript 解密AES十六进制消息以完成与服务器的相互身份验证

Javascript 解密AES十六进制消息以完成与服务器的相互身份验证,javascript,encryption,cryptography,cryptojs,Javascript,Encryption,Cryptography,Cryptojs,我试图遵循参考文件提供的以下说明: 变量A包含使用变量B加密的16字节随机数序列 您应该使用变量B对其进行解密,并将其填充到变量A的末尾 整个32字节的变量将使用变量B解密,并发送回服务器,以便进行成功的身份验证 您应该使用AES128 CBC密码模式进行解密 变量A(16字节):e06e3e2ea024bba1185c33d64d2033b6 变量B(16字节):41435231323535552d4a312041757468 我在CryptoJS中的尝试 const message = 'e

我试图遵循参考文件提供的以下说明:

变量A包含使用变量B加密的16字节随机数序列

您应该使用变量B对其进行解密,并将其填充到变量A的末尾

整个32字节的变量将使用变量B解密,并发送回服务器,以便进行成功的身份验证

您应该使用AES128 CBC密码模式进行解密

变量A(16字节):
e06e3e2ea024bba1185c33d64d2033b6

变量B(16字节):
41435231323535552d4a312041757468

我在CryptoJS中的尝试

const message = 'e06e3e2ea024bba1185c33d64d2033b6';
const key = '41435231323535552d4a312041757468';

const decryptedMsg = CryptoJS.AES.decrypt(
  message,
  key,
  {
    mode: CryptoJS.mode.CBC,
  }
);

console.log(decryptedMsg.toString());
所有这些产生的都是一个空字符串。我在加密方面没有太多的经验,如果有人能帮助我找到解决方案,我将不胜感激,这样我就可以构建完成的32字节十六进制值并成功进行身份验证。

  • 以下适用于
    decrypt
    -方法的参数:

  • 参数:ciphertext as
    CipherParams
    (如果在此处传递字符串,则默认情况下,它是Base64解码的,此处不需要此参数)
  • 参数:key as
    WordArray
    (如果在此处传递字符串,则将其解释为密码短语,key和IV从该密码短语派生而来,但此处不适用)
  • 参数:模式、初始化向量(IV)和填充
  • 然后您可以按如下方式解密:

    var CryptoJS = require("crypto-js"); 
    
    function decrypt(hexCiphertext, hexKey, hexIV){    
        var cipherParams = CryptoJS.lib.CipherParams.create(
            {ciphertext: CryptoJS.enc.Hex.parse(hexCiphertext)}
        );
        var key = CryptoJS.enc.Hex.parse(hexKey);
        var iv = CryptoJS.enc.Hex.parse(hexIV);
        var decrypted = CryptoJS.AES.decrypt(
            cipherParams,
            key,
            {iv: iv, padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC}
        );
        return decrypted;
    }
    
  • CBC模式使用IV,应取自规范。结果取决于该IV,即如果使用错误的IV,解密将给出错误的结果。如果规范中没有IV,您只能猜测和尝试,例如,幸运的
    0
    -向量。填充物也必须取自规范。由于根据解密的第一部分的描述,加密和解密的消息具有相同的长度(即16字节),因此显然没有使用填充(
    CryptoJS.pad.NoPadding

  • 以下内容适用于解密的第一部分(假设IV为
    0
    -向量):

    具有以下输出:

    93fd6fa1ee388d326535abf7bd66310a
    
    93fd6fa1ee388d326535abf7bd66310ac57db5bd524becba57445a9dbc536d0d 
    
    对于第二部分(假设IV为
    0
    -向量):

    具有以下输出:

    93fd6fa1ee388d326535abf7bd66310a
    
    93fd6fa1ee388d326535abf7bd66310ac57db5bd524becba57445a9dbc536d0d 
    

decryptedMsg.toString('hex')产生什么?@MaartenBodewes
decryptedMsg.toString(CryptoJS.enc.hex)
产生一个空字符串。我发现,如果我将
padding:CryptoJS.pad.NoPadding
padding:CryptoJS.pad.ZeroPadding
添加到decrypt options对象,我确实会得到一个响应,但它是24字节,而不是所需的16字节。参考文档没有提到任何关于填充的内容,因此不确定这是否有帮助。通常,由于输入已经是16字节的倍数,这些协议不使用填充。然而,非常奇怪的是,您不会收到错误消息,因为您只希望256个字符中有1个正确的填充。非常感谢您花时间提供如此详细的答案。不能告诉你我有多感激你。今天我将关注您的实现,并告诉您我是否成功。您好,不幸的是,在进一步挖掘之后,解密过程似乎没有成功。为了清楚起见,我在这里发布了另一个问题:我不是在这里,而是在评论新的帖子。