【发布时间】:2020-05-16 13:42:14
【问题描述】:
我想连接蓝牙设备。通信仅通过十六进制字符串。我需要编码一个 16 字节的值。因此,我也期望一个 16 字节的值。在我的实现中,CryptoJS 总是返回更长的结果。根据文档,不需要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==
当然,结果只是一个字符串,但无论如何它太长了。
【问题讨论】:
-
注意:不同的IV产生不同的密文,如果设备使用的IV与
0-IV不同,则连接很可能会失败(但由于根据描述不需要IV,a0-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('41435231323535552d4a312041757458'); const decryptedStringHex = CryptoJS.AES.decrypt(value, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding});decryptedStringHex 为空,看来我们输入错误。感谢您的帮助。 -
在
decrypt中,value必须替换为{ciphertext: value}。然后将十六进制编码的明文包含在decryptedStringHex.toString()中。 -
太棒了,也可以。非常感谢。
标签: typescript authentication hex aes cryptojs