我一直在看 crypto-js its encoderWordArray相互转换。我查了一下the documentation,找不到关于WordArray可能是什么的任何解释。

据我所知,JavaScript中甚至没有一个名为WordArraytyped array,并且在该名称的任何类型的数组上也没有一个 DataView

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

奇怪的是,我在 crypto-js 上发现的所有线程(hereherehere)都使用WordArray这个词,而没有人真正问过它是什么。

有人真的可以告诉我吗?是Uint16Array吗?还是普通字节数组(Uint8Array或整数类型的无类型Array)的另一个花哨词?

最佳答案

该类在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位字数组,这无疑是针对诸如SHA-512之类的针对64位操作进行了优化的算法。

09-25 19:22