В PBKDF2 INT (i) подписан?
На стр. 11 RFC 2898 говорится, что для U_1 = PRF (P, S || INT (i)) INT (i) представляет собой четырехоктетное кодирование целого числа i, в первую очередь самый старший октет.
Означает ли это, что я значение со знаком, и если так, что происходит при переполнении?
2 ответа
Ничто не говорит о том, что оно будет подписано. Дело в том, что dkLen
ограничен (2^32 - 1) * hLen
предполагает, что это целое число без знака и что оно не может перевернуться с 0xFFFFFFFF
(2^32 - 1) до 0x00000000
,
Конечно, PBKDF2(MD5) не достигнет 2^31, пока вы не попросите 34 359 738 368 байт. Это очень много байтов.
- SHA-1: 42 949 672 960
- SHA-2-256 / SHA-3-256: 68 719 476 736
- SHA-2-384 / SHA-3-384: 103,079,215,104
- SHA-2-512 / SHA-3-512: 137 438 953 472
Поскольку реализация.NET (в Rfc2898DeriveBytes) является итеративным потоком, она может быть опрошена на 32 ГБ с помощью (длинной) серии вызовов. Большинство платформ представляют PBKDF2 как единичный снимок, поэтому вам нужно предоставить им диапазон памяти 32 ГБ (или более), чтобы определить, есть ли у них ошибка, которая так далеко. Так что, даже если большинство платформ неправильно понимают знак... это не имеет значения.
PBKDF2 - это KDF (функция вывода ключей), поэтому она используется для получения ключей. AES-256 - это 32 байта, или 48, если вы используете тот же PBKDF2 для генерации IV (что вам действительно не следует). Генерация закрытого ключа для кривой ECC с простым числом 34,093 - это (если я правильно сделал математику) 14,157 байт. Значительно ниже отметки 32 ГБ.
i
колеблется от 1 до l = CEIL (dkLen / hLen)
, а также dkLen
а также hLen
являются положительными целыми числами. Следовательно, i
строго положительно.
Вы можете, однако, хранить i
в 32-разрядном целочисленном типе со знаком без какой-либо специальной обработки. Если i
переворачивается (увеличивается с 0x7FFFFFFF
в 0xF0000000
), он будет продолжать кодироваться правильно и продолжать корректно увеличиваться. При кодировании с дополнением до двух битовые результаты сложения, вычитания и умножения одинаковы до тех пор, пока все значения обрабатываются как со знаком или без знака.