什么是WordArray?

14
我一直在研究crypto-js它的编码器可以转换成和转换出一个WordArray。我查阅了文档但没有找到任何关于WordArray是什么的解释。
据我所知,JavaScript中甚至没有一个名为WordArray类型数组,也没有任何一个名为该名称的DataView
我知道在Visual C++中WORD是什么意思,但我不确定这里的含义。
奇怪的是,我在这里这里这里找到的所有与crypto-js相关的线程都使用了WordArray一词,而没有人真正询问它是什么。请问有人可以告诉我吗?它是一个Uint16Array吗?还是只是另一个对于常规字节数组(Uint8Array或整数值的未类型化Array)的花哨说法?

2
在您链接的“文档”中,字符串WordArray的第一次出现如下所述:“(哈希算法接受字符串或CryptoJS.lib.WordArray的实例。)* WordArray对象表示32位字的数组。* ”。在您下面链接的gist中也有相同的内容。看起来很简单明了。 - mbojko
@mbojko 谢谢。我错过了这个。不过问题仍然存在。所以,如果我的字符串是“he”,在UTF-8中它会变成两个相邻的16位无符号整数。如果我将它们转换成一个WordArray,那么结果会是一个由32位组成的单个元素数组,其中字母“h”的16位作为HIWORD,字母“e”的16位作为LOWORD,对吗? - Water Cooler v2
我刚刚发布了一个单独的问题。https://stackoverflow.com/q/58525372/303685 - Water Cooler v2
1
顺便提一下,在您之前的问题中所指定的是UTF-16,更准确地说是没有字节顺序标记的UTF-16BE。 - Maarten Bodewes
1
不知道,可能曾经不小心碰到了BOM :) - Maarten Bodewes
显示剩余3条评论
1个回答

12

该类在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({

放入其中的(字节)值被放在单词的最高有效位中(我已经对照了源代码)。

例如,如果您将UTF-8(或Latin1或ASCII)格式的"he"值放入其中,则会得到一个元素为68_65_00_00的数组,并将words设置为2。这是因为UTF-8编码为8位字节,这些字节分组在最高的16位中。


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

通常,库定义其操作使用字节而不是单词。 CryptoJS在某种意义上有点特殊,因为它在单词缓冲区上运行。这在某种程度上是逻辑的,因为JavaScript未定义字节数组。 它还跳过了一步,因为否则你需要在算法实现中从UTF-8转换为字节,然后再转换为单词。

CryptoJS还具有64位单词数组,无疑是为了针对64位操作进行优化的算法,例如SHA-512。


是的,缺少对字节和字类型等面向位的直接支持将使本地JavaScript加密库比任何其他语言都要慢得多,更不用说C或汇编语言了。即使使用JIT的解释器在这里也几乎没有用处。您必须使用更低级别的机器代码来加速处理速度。 - Maarten Bodewes
还有一件事。我注意到我从字节数组转换的“WordArray”中的某些值是带符号的。我没有考虑到二进制补码。我只是将每个四个字节左移成一个“WordArray”的元素。所以问题是:一个“WordArray”的元素可以是带符号的,对吗?我的意思是,它们不应该是无符号类型,对吗? - Water Cooler v2
好的,我已经尝试过了,它非常完美地工作。在客户端和ASP.NET服务器上使用相同的密钥(作为字节数组而不是WordArray)都可以。因此,WordArray的元素可以是任何东西。也就是说,它具有带符号的32位整数。 - Water Cooler v2
没问题,例如Java的所有基本类型(除了“char”,它仅用于字符)都是有符号的。32位字等效的“int”中的位也是有符号的。但最终,对于像AES这样的操作,这并不重要。这确实使一些计算更加困难,特别是对于类型而言,因为您必须考虑例如符号扩展。但这更多是对程序员而非计算机的问题。因此,其他语言也可以在没有问题的情况下使用有符号整数。 - Maarten Bodewes
请注意,在二进制补码值中,不仅位运算保持不变。例如,在模2^32下,减法和加法也是相同的。您可能需要在比较时将结果解释为整数而无符号,但只是这样而已。AES不需要比较,所有操作都是在不查看实际内容(如果您将其基于内容,则可能会出现侧信道)的情况下执行的。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接