我一直在看 crypto-js 和its encoder与WordArray
相互转换。我查了一下the documentation,找不到关于WordArray
可能是什么的任何解释。
据我所知,JavaScript中甚至没有一个名为WordArray
的typed array,并且在该名称的任何类型的数组上也没有一个 DataView
。
我知道 WORD
is in the Visual C++ parlance是什么,但是我不确定这是什么意思。
奇怪的是,我在 crypto-js 上发现的所有线程(here,here和here)都使用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位操作进行了优化的算法。