首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用加密js AES欧洲央行算法加密JavaScript中的字节数组

用加密js AES欧洲央行算法加密JavaScript中的字节数组
EN

Stack Overflow用户
提问于 2019-10-01 18:26:15
回答 1查看 4.5K关注 0票数 2

我正在使用一个react本机应用程序与我的miband 3通信,其认证过程的一部分是使用AES/ECB/NoPadding算法加密一个字节数组。我目前正在使用此代码作为参考

由于我对物联网和加密是新手,我认为认证的最后一步是不正确的,因为在将加密的字节数组写入miband 3之后,我没有得到正确的身份验证。

目前,最后一步如下:

代码语言:javascript
运行
复制
const base_key = [0x01,0x23,0x45,0x67,0x89,0x01,0x22,0x23,0x34,0x45,0x56,0x67,0x78,0x89,0x90,0x02]
console.warn('Getting random number...')
const random_number = bytesToString(notification.filter((byte, index) => index > 3))

// Encrypting the key
const key = bytesToString(base_key)
const cipher = CryptoJS.AES.encrypt(random_number,key).toString()

// Step 5) Sending encrypted random number
console.warn('sending encrypted random number...')
const request_send_encrypted_key = [0x03,0x00, ...stringToBytes(cipher)]
await BleManager.writeWithoutResponse(miband3, service_uuid, characteristic_uuid, request_send_encrypted_key)

通知被过滤了,因为前三个字节被用来判断正在发生的通知,所以我不需要它们。

为了正确地验证身份,我必须将以下内容发送给miband 3:

代码语言:javascript
运行
复制
const byteArrayToSend = [0x03,0x00, ...encryptedByteArray]

encryptedByteArray是我从miband通知返回的随机数(没有前3个字节),并正确加密。

我在代码中使用了‘crypto’和“反应-本地人-经理”

如何正确地使用AES算法对字节数组进行加密以发送?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-02 13:49:09

在使用CryptoJS进行加密时,必须考虑以下因素

  • 在发布的代码中,密钥和要加密的数据(random_number)显然被指定为数组。CryptoJS使用WordArray-objects,因此必须进行转换。WordArray-objects可以轻松地在十六进制字符串上转换为数组,反之亦然,使用这些函数和CryptoJS-编码器。另一种可能是直接使用这些函数进行转换(未经测试)。
  • 由于数组包含任意字节序列(通常不对应于任何可读的字符),所以这里只能使用合适的编码(Base64或十六进制)。bytesToStringstringToBytes的方法没有发布,所以还不清楚是否存在问题。CryptoJS允许以字符串或WordArray的形式传递数据,后者用于以下操作。
  • 如果CryptoJS.AES.encrypt中的第二个参数作为字符串传递,则它被解释为一个密码短语,根据定义的算法这里生成实际的密钥。如果要将第二个参数解释为键(在参考码中似乎是这样),则必须将其作为WordArray传递。
  • AES/ECB/NoPadding用于根据链接的中篇进行加密。禁用填充是可能的,因为要加密的数据(根据本文长度为16字节的random_number)对应于AES块大小的整数倍数(16字节)(如果不是这样,则必须强制填充)。
  • 加密的结果是CipherParams-object,其ciphertext-property以WordArray这里的形式包含加密数据。

考虑到这些要点,可以按以下方式执行加密:

代码语言:javascript
运行
复制
var CryptoJS = require("crypto-js");

// Key and random number as arrays, e.g.:
var random_numberBA = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f];
var keyBA = [0x01, 0x23, 0x45, 0x67, 0x89, 0x01, 0x22, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x90, 0x02];

// Conversion to WordArrays
var random_numberWA = CryptoJS.enc.Hex.parse(bytesToHex(random_numberBA));
var keyWA = CryptoJS.enc.Hex.parse(bytesToHex(keyBA));

// Encryption
// - random_number as WordArray
// - Key as WordArray
// - ECB-Mode (default: CBC), No-Padding (default: Pkcs7-Padding)
var encryptedCP = CryptoJS.AES.encrypt(random_numberWA, keyWA, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });

// Encrypted data as WordArray
var encryptedWA = encryptedCP.ciphertext;

// Conversion to array
var encryptedBA = hexToBytes(CryptoJS.enc.Hex.stringify(encryptedWA));

// Consume encryptedBA 
// ...

// Helper: from https://stackoverflow.com/a/34356351/9014097
function hexToBytes(hex) {
    for (var bytes = [], c = 0; c < hex.length; c += 2)
        bytes.push(parseInt(hex.substr(c, 2), 16));
    return bytes;
}

function bytesToHex(bytes) {
    for (var hex = [], i = 0; i < bytes.length; i++) {
        var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];
        hex.push((current >>> 4).toString(16));
        hex.push((current & 0xF).toString(16));
    }
    return hex.join("");
}

这个结果可以被验证,例如这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58190380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档