解密AES hex报文完成与服务器的相互认证
Decrypting AES hex message to complete mutual authentication with server
我正在尝试按照参考文档提供的这些说明进行操作:
变量 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
-方法的参数,here:
- 参数:密文为
CipherParams
(如果这里传递的是字符串,默认情况下是Base64解码的,这里不打算这样做)
- 参数:key as
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
我正在尝试按照参考文档提供的这些说明进行操作:
变量 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
-方法的参数,here:- 参数:密文为
CipherParams
(如果这里传递的是字符串,默认情况下是Base64解码的,这里不打算这样做) - 参数:key as
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