将 CryptoJS 与十六进制字符串一起使用
using CryptoJS with hex-string
我想连接到蓝牙设备。通信仅通过十六进制字符串。我需要编码一个 16 字节的值。因此,我还期望有一个 16 字节的值。在我的实现中,CryptoJS 总是 returns 更长的结果。根据文档,不需要 IV。 (“所有 16 字节数据必须使用当前存储在设备中的客户主密钥加密,使用 AES128 CBC
密码模式”)因此我将 IV 设置为 00000000000000000000000000000000 因为 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();
// 当前结果为 edijc9R7sl3zwZVrBBBrFQ==
当然,结果只是一个字符串,但它太长了。
为了完整起见,我想添加适合我的解决方案。 (感谢@Topaco)
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
我想连接到蓝牙设备。通信仅通过十六进制字符串。我需要编码一个 16 字节的值。因此,我还期望有一个 16 字节的值。在我的实现中,CryptoJS 总是 returns 更长的结果。根据文档,不需要 IV。 (“所有 16 字节数据必须使用当前存储在设备中的客户主密钥加密,使用 AES128 CBC 密码模式”)因此我将 IV 设置为 00000000000000000000000000000000 因为 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();
// 当前结果为 edijc9R7sl3zwZVrBBBrFQ==
当然,结果只是一个字符串,但它太长了。
为了完整起见,我想添加适合我的解决方案。 (感谢@Topaco)
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