Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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
Typescript 将CryptoJS与十六进制字符串一起使用_Typescript_Authentication_Hex_Aes_Cryptojs - Fatal编程技术网

Typescript 将CryptoJS与十六进制字符串一起使用

Typescript 将CryptoJS与十六进制字符串一起使用,typescript,authentication,hex,aes,cryptojs,Typescript,Authentication,Hex,Aes,Cryptojs,我想连接到蓝牙设备。通信仅通过十六进制字符串进行。我需要对一个16字节的值进行编码。因此,我还期望一个16字节的值。在我的实现中,CryptoJS总是返回更长的结果。根据文件,不需要IV。(“必须使用设备中当前存储的客户主密钥,使用AES128 CBC对所有16字节数据进行加密 因此我将IV设置为00000000000000000000,因为CryptoJS似乎需要它。我做错了什么 const CryptoJS = require('crypto-js'); const value = Cry

我想连接到蓝牙设备。通信仅通过十六进制字符串进行。我需要对一个16字节的值进行编码。因此,我还期望一个16字节的值。在我的实现中,CryptoJS总是返回更长的结果。根据文件,不需要IV。(“必须使用设备中当前存储的客户主密钥,使用AES128 CBC对所有16字节数据进行加密 因此我将IV设置为00000000000000000000,因为CryptoJS似乎需要它。我做错了什么

const CryptoJS = require('crypto-js');
const value =  CryptoJS.enc.Hex.parse('5ff58680541c5a5903f4833dfaa4281f');
const key  = CryptoJS.enc.Hex.parse('41435231323535552d4a312041757458'); // known master key
const ivvar   = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
const encryptedString = CryptoJS.AES.encrypt(value, key, {iv: ivvar, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding}).toString();
//当前结果是EDIJC9R7SL3ZWZVRBBRFQ==


当然,结果只是一个字符串,但无论如何它太长了

为了完整起见,我想添加一个对我有效的解决方案。(感谢@Topaco)


密文采用Base64编码,解码后长度为16字节:
79d8a373d47bb25df3c1956b04106b15
,例如。也可以直接使用十六进制编码,而不是Base64编码。为此,您只需将
toString()
替换为
ciphertext.toString()
,例如。注意:不同的IV产生不同的密文,如果设备使用的IV不同于
0
-IV,则连接可能会失败(但根据描述,不需要IV,因此
0
-IV是合理的)。顺便说一下,对于1块(AES为16字节)明文,带有
0
-IV的CBC与ECB相同,因此也可以实现不带IV的实现:
CryptoJS.AES.encrypt(value,key,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.NoPadding}).ciphertext.toString()
@Topaco:非常感谢,这已经对加密有所帮助并起到了作用。但现在我被解密困住了
const value=CryptoJS.enc.Hex.parse('79d8a373d47bb25df3c1956b04106b15');const key=CryptoJS.enc.Hex.parse('414352323535552D4A312041757458');const decryptedStringHex=CryptoJS.AES.decrypt(值、密钥,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.NoPadding})
decryptedStringHex为空,似乎输入错误。感谢帮助。在
解密
中,
必须替换为
{ciphertext:value}
。然后,十六进制编码的明文被包含在
decryptedStringHex.toString()中。
也可以。非常感谢你。
encrypt(valueStringHex, keyStringHex) {
    const CryptoJS = require('crypto-js');
    const value =  CryptoJS.enc.Hex.parse(valueStringHex);
    const key  = CryptoJS.enc.Hex.parse(keyStringHex);
    const ivvar   = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
    const encryptedStringHex = CryptoJS.AES.encrypt(value, key, {iv: ivvar, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding}).ciphertext.toString();
    return encryptedStringHex;
    }

// encrypt('5ff58680541c5a5903f4833dfaa4281f', '41435231323535552d4a312041757458')
// returns 79d8a373d47bb25df3c1956b04106b15
decrypt(valueStringHex, keyStringHex) {
    const CryptoJS = require('crypto-js');
    const value = CryptoJS.enc.Hex.parse(valueStringHex);
    const key = CryptoJS.enc.Hex.parse(keyStringHex);
    const ivvar   = CryptoJS.enc.Hex.parse('00000000000000000000000000000000');
    const decryptedStringHex = CryptoJS.AES.decrypt({ciphertext: value}, key, {iv: ivvar, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding});
    return decryptedStringHex.toString();
    }

// decrypt('79d8a373d47bb25df3c1956b04106b15', '41435231323535552d4a312041757458')
// returns 5ff58680541c5a5903f4833dfaa4281f