【问题标题】:using CryptoJS with hex-string使用带有十六进制字符串的 CryptoJS
【发布时间】: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==

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

【问题讨论】:

  • 密文采用Base64编码,解码后长度为16字节:79d8a373d47bb25df3c1956b04106b15,例如here。除了 Base64 编码,您还可以直接使用十六进制编码。为此,您只需将toString() 替换为ciphertext.toString(),例如here.
  • 注意:不同的IV产生不同的密文,如果设备使用的IV与0-IV不同,则连接很可能会失败(但由于根据描述不需要IV,a 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('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


【解决方案1】:

为了完整起见,我想添加对我有用的解决方案。 (感谢@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

【讨论】:

    猜你喜欢
    • 2016-04-22
    • 2019-04-18
    • 2013-08-05
    • 2010-10-04
    • 2019-07-27
    • 2014-03-07
    • 2018-03-05
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多