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

问题描述 投票:0回答:1

我正在尝试遵循参考文档提供的这些说明:

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

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

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

您应使用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字节十六进制值并成功进行身份验证。

javascript encryption cryptography cryptojs
1个回答
1
投票
  • 以下内容适用于decrypt方法here的参数:

      参数:密文为CipherParams(如果在此处传递字符串,则默认情况下是Base64解码的,此处不打算使用)]
  • 参数:作为WordArray的键(如果在此处传递字符串,则将其解释为密码短语,从该密码派生出键和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-向量:]

    var hexMessage = 'e06e3e2ea024bba1185c33d64d2033b6'; var hexKey = '41435231323535552d4a312041757468'; var hexIV = '00000000000000000000000000000000'; var decryptedStep1 = decrypt(hexMessage, hexKey, hexIV); var hexDecryptedStep1 = CryptoJS.enc.Hex.stringify(decryptedStep1) console.log(hexDecryptedStep1);

    具有以下输出:

    93fd6fa1ee388d326535abf7bd66310a

    以及第二部分(假设IV为0-矢量:]:

    var hexMessageStep2 = hexMessage + hexDecryptedStep1; var decryptedStep2 = decrypt(hexMessageStep2, hexKey, hexIV); var hexDecryptedStep2 = CryptoJS.enc.Hex.stringify(decryptedStep2); console.log(hexDecryptedStep2);

    具有以下输出:

    93fd6fa1ee388d326535abf7bd66310ac57db5bd524becba57445a9dbc536d0d

  • © www.soinside.com 2019 - 2024. All rights reserved.