Что такое WordArray? - PullRequest
       36

Что такое WordArray?

4 голосов
/ 23 октября 2019

Я смотрел на crypto-js и его кодировщик преобразует в WordArray и обратно. Я посмотрел документацию и не смог найти объяснения того, что может быть WordArray.

Насколько мне известно, даже не напечатаномассив в JavaScript с именем WordArray, и нет ни одного DataView ни в одном из типизированных массивов с таким именем.

Я знаю, что такое WORD на языке Visual C ++ , но я не уверен, что это значит здесь.

Странно, все потоки ( здесь , здесь и здесь ) Я обнаружил, что crypto-js используют слово WordArray, и никто не спрашивает, что это такое.

Может ли кто-нибудь мне сказать? Это Uint16Array? Или просто другое причудливое слово для обычного байтового массива (Uint8Array или нетипизированный Array значений целых чисел)?

1 Ответ

2 голосов
/ 23 октября 2019

Класс определен в core.js в библиотеке CryptoJS:

/**
 * 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-битной работы.

...