首页 > 解决方案 > 使用 AES128-ECB 加密十六进制并在 javascript/node 中维护大端

问题描述

我正在尝试使用 Big Endian 协议使用 AES128-ECB 加密十六进制。

我知道 ECB 不安全,但我需要用它来连接蓝牙应用程序。

我正在构建一个将连接到蓝牙外围设备的 React-Native 应用程序。

我正在使用 aes-js npm 模块。

到目前为止,我的代码是:

    const key = Buffer.from("20572F52364B3F473050415811632D2B", "hex")
    const text = '0x060x010x010x01'
    const textBytes = aesjs.utils.utf8.toBytes(text);
    console.log('textBytes: ', textBytes)

    const aesEcb = new aesjs.ModeOfOperation.ecb(key);
    console.log('aesEcb: ', aesEcb)
    const encryptedBytes = aesEcb.encrypt(textBytes);
    console.log('encryptedBytes: ', encryptedBytes)

    const encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes);
    console.log('encryptedHex: ', encryptedHex);

我不认为这是在维护大端。

我很想请一些帮助。

标签: react-nativeencryptionaesendiannessecb

解决方案


我正在尝试使用 Big Endian 协议使用 AES128-ECB 加密十六进制。

Big endian 是一种将数字映射到位/字节的方法。使用大端序时,最重要的部分在左侧(低索引),而使用小端序时,最重要的部分在右侧(高索引)。字节一般被看成是原子的,没有明确的顺序(一般最高位显示在左边,但是索引是从高到低而不是从低到高,所以是小端序,只是为了做事有趣的)。如果字符被编码为多字节数字,则它们仅具有分配给 的字节序。

但是 UTF-8 和 AES 有一个明确的字节顺序,不包括任何数字编码。因此,大端或小端不会发挥作用。AES 在内部可以对 32 位值进行操作,但是当输出定义明确时,这并不重要;AES 作为 AES 运行,这就是它的结束。仅当低级例程返回 32 或 16 位字而不是字节时才会出现问题。

CryptoJS 中的utf16编解码器似乎使用 UTF-16BE(大端),并且 AES 在加密/解密后不会更改该顺序。请注意,我没有专门阅读此内容,但由于还有一个utf16le我认为没有那么多其他选项。


推荐阅读