什么是字数组?

What is a WordArray?

我一直在查看 crypto-js and its encoder converts to and from a WordArray. I looked up the documentation,但找不到任何关于 WordArray 可能是什么的解释。

据我所知,在任何具有该名称的类型化数组中甚至都没有 typed array in JavaScript named WordArray, and neither is there a DataView

我知道WORD is in the Visual C++ parlance是什么意思,但我不确定这里是什么意思。

奇怪,我在 crypto-js 上找到的所有线程 (here, and here) 都在使用 WordArray 这个词,但没有人真正问它是什么。

有人真的可以告诉我吗?是 Uint16Array 吗?或者只是常规字节数组的另一个花哨的词(Uint8Array 或整数值的 untyped Array)?

class 在 CryptoJS 库的 core.js 中定义:

/**
 * An array of 32-bit words.
 *
 * @property {Array} words The array of 32-bit words.
 * @property {number} sigBytes The number of significant bytes in this word array.
 */
var WordArray = C_lib.WordArray = Base.extend({

放在那里的(字节)值放在单词的最高有效位(我已经对照源代码检查过)。

例如,如果您将值 "he" 作为 UTF-8(或 Latin1 或 ASCII)放入其中,那么您将得到一个包含值 68_65_00_00 的单元素数组,并且 words 设置为值 2。这是因为 UTF-8 编码为 8 位字节,并且这些字节分组在最上面的 16 位中。


通常(对称)加密算法被指定为对位进行操作。但是,它们通常经过优化以在 32 位或 64 位字上工作,因为它们在 32 位或 64 位机器(例如 i86 或 x64)中是最佳的。因此,任何语言的任何库都会在执行操作之前在内部转换为单词。

通常库将它们的操作定义为使用字节而不是单词。 CryptoJS 有点特殊,因为它在单词缓冲区上运行。这是合乎逻辑的,因为 JavaScript 没有定义字节数组。它还会跳过一个步骤,否则您将不得不从 UTF-8 转换为字节,然后在算法实现中再次转换为单词。

CryptoJS 也有一个 64 位字数组,这无疑适用于针对 64 位操作优化的算法,例如 SHA-512。