Как мне создать ключ DES? Почему 7-символьная строка не достаточно? - PullRequest
4 голосов
/ 08 июня 2009

У меня возникли трудности с пониманием требований к длине ключа в криптографии. В настоящее время я использую DES, который, я считаю, составляет 56 бит ... теперь, преобразовав 8-символьный пароль в byte[], моя криптография работает. Если я использую 7-значный пароль, это не так.

Теперь, прости меня, если я ошибаюсь, но разве это из-за того, что символы ASCII 7 бит, поэтому 8 * 7 = 56 бит?

Это просто не кажется мне правильным. Если я хочу использовать ключ, почему я не могу просто передать соленый хеш моего секретного ключа, то есть хеш MD5?

Я уверен, что это очень просто, но я не могу понять, что происходит.

Ответы [ 7 ]

12 голосов
/ 08 июня 2009

DES использует 56-битный ключ: 8 байтов, где один бит в каждом байте является битом четности.

В целом, однако, рекомендуется использовать общепринятый, хорошо известный алгоритм получения ключа для преобразования текстового пароля в симметричный ключ шифрования, независимо от алгоритма.

Алгоритм PBKDF2, описанный в PKCS # 5 ( RFC 2898 ), является широко используемой функцией вывода ключа, которая может генерировать ключ любой длины. По своей сути PBKDF2 объединяет соль и пароль с помощью хеш-функции для получения фактического ключа. Хэш повторяется много раз, так что злоумышленнику будет дорого и медленно пробовать каждую запись в своем «словаре» наиболее распространенных паролей.

Более старая версия, PBKDF1, может генерировать ключи для шифрования DES, но DES и PBKDF1 не рекомендуются для новых приложений.

Большинство платформ с криптографической поддержкой включают алгоритмы получения ключей PKCS # 5 в своих API.

7 голосов
/ 08 июня 2009

Каждый алгоритм рассчитан на определенную длину ключа. Ключ используется как часть алгоритма, и поэтому не может быть тем, что душе угодно.

Общие размеры ключей:

  • DES: 56-битный ключ
  • AES: 128-256-битный ключ (обычно используются значения 128, 192 и 256)
  • RSA (асимметричная криптография): 1024, 2048, 4096-битный ключ

Число, такое как 1234567, является только 4-байтовой переменной. Предполагается, что ключом будет байтовый массив, например "1234567" (неявно преобразуемый в единицу в C) или `{'1', '2', '3', '4', '5', '6' '7'}.

Если вы хотите передать хэш MD5 вашего соленого ключа в DES, вам следует использовать некоторую технику сжатия ключей. Например, вы можете взять верхние 7 байтов (что несколько нежелательно) или выполнить шифрование DES для хэша MD5 (с известным постоянным ключом) и взять все ключи, кроме последнего, в качестве ключа для операции DES.

edit: DES, о котором я говорю, - это реализация в соответствии со стандартом, выпущенным NIST. Может быть так (как отмечено выше), что ваш конкретный API ожидает различных требований к длине ключа и получит из него окончательный 7-байтовый ключ.

6 голосов
/ 08 июня 2009

Ключ должен иметь размер 64 бита, но из ключа используются только 56 бит. Другие 8 битов являются битами четности (внутреннее использование).

ASCII-символы имеют 8-битный размер.

2 голосов
/ 08 июня 2009

Вы не должны передавать свои пароли прямо в алгоритм. Например, используйте класс Rfc2898DeriveBytes , который также будет защищать ваши пароли. Он будет работать с любой длиной.

Посмотрите здесь для примера.

РЕДАКТИРОВАТЬ: D'Oh - ваш вопрос не C # или .Net с тегами: /

0 голосов
/ 15 января 2019

Большинство реализаций DES принимают аргумент 64-битного ключа. Каждый байт этого ключа содержит один бит четности, который отбрасывается перед выполнением кодирования / декодирования, оставляя длину ключа в 56 битах. Эти байты четности служат для метода обнаружения ошибок.

Нечетное соотношение: https://en.m.wikipedia.org/wiki/Parity_bit

Ключи DES содержат нечетный бит четности в 8-м индексе (последнем бите) каждого байта. Этот последний бит гарантирует, что количество битов «1» в байте является нечетным. Это будет «1», если предыдущие 7 битов содержат четное количество «1» битов. Будет 0, если предыдущие 7 бит содержат нечетное количество бит 1.

Метод преобразования 7-байтового символьного ключа в 8-байтовый двоичный ключ (поскольку преобразование может сделать некоторые байты непечатаемыми символами) заключается в преобразовании 7-байтового символьного ключа в двоичный и вставке в общей сложности 8 байты четности в индексе 8,16,24,32,40,48,56,64.

Это обеспечит вас 8-байтовым (64-битным) ключом, который получен из 7-байтового (56-битного) ключа для целей кодирования / декодирования с помощью DES.

Источники: Википедия: https://en.m.wikipedia.org/wiki/Data_Encryption_Standard

«Ключ якобы состоит из 64 битов; однако только 56 из них фактически используются алгоритмом. Восемь битов используются исключительно для проверки четности и после этого отбрасываются. Следовательно, эффективная длина ключа составляет 56 битов ».

«Ключ номинально хранится или передается в виде 8 байтов, каждый с нечетной четностью. Согласно ANSI X3.92-1981 (в настоящее время известный как ANSI INCITS 92-1981), раздел 3.5:

Один бит в каждом 8-битном байте KEY может использоваться для обнаружения ошибок при генерации, распространении и хранении ключей. Биты 8, 16, ..., 64 предназначены для обеспечения того, чтобы каждый байт имел нечетную четность. ”

0 голосов
/ 08 июня 2009

Чтобы избежать этой проблемы и повысить общую безопасность своей реализации, обычно мы передаем некоторый хешированный вариант ключа для крипто-функций, а не сам ключ.

Кроме того, рекомендуется "засолить" хэш значением, которое является специфическим для выполняемой вами операции и не изменится (например, внутренний идентификатор пользователя). Это гарантирует, что для любых двух экземпляров ключа результат будет разным.

Получив свой производный ключ, вы можете выполнить первые n-биты его, как того требует ваша криптографическая функция.

0 голосов
/ 08 июня 2009

Согласно MSDN DES поддерживает длину ключа 64 бита.

...