Почему ключи, сгенерированные из Java DES KeyGenerator, имеют неправильный размер? - PullRequest
0 голосов
/ 28 сентября 2018

Я использую Java-провайдер SunJCE для генерации 7-битного ключа:

    KeyGenerator v = KeyGenerator.getInstance("DES")
    Provider p = v.getProvider
    assert(p.getClass().getSimpleName() == "SunJCE")
    v.init(56)
    Key k = v.generateKey()
    assert(k.getEncoded().getLength == 7)

Когда я запускаю вышеуказанную программу, я получаю сообщение об ошибке, которое указывает, что длина k на самом деле равна 8 (64 бит) вместо 56 бит странно то, что KeyGenerator инициализируется для генерации только 56 битного ключа, так почему же фактическая длина k неверна?

1 Ответ

0 голосов
/ 29 сентября 2018

Ключи DES кодируются с использованием 8 битов для каждых 7 битов, где младший значащий бит каждого байта используется для того, чтобы сделать количество битов нечетным.Таким образом, если первые 7 битов имеют 6, 4 или 2 бита, равные единице, то младший значащий бит устанавливается равным единице.В противном случае он сбрасывается / сбрасывается / остается на нуле.Таким образом, 56-битный ключ DES кодируется как 64 бит / 8 байт, 112-битный ключ 2, используемый для тройного DES, кодируется как 128-битный, а 168-битный ключ DES кодируется с использованием 192 бит.

Биты четности могутиспользоваться как своего рода проверка, чтобы видеть, не был ли ключ DES изменен (хотя это также не очень хорошо для этого).Большинство реализаций DES в настоящее время просто полностью игнорируют биты четности, но Java KeyGenerator все равно будет правильно их устанавливать.Вы можете проверить это, проверяя Integer.bitCount(b & 0xFF) % 2 == 1 для каждого байта b в полученном ключе: он всегда должен возвращать true.


Более современные симметричные шифры пытаются использовать полностью (псевдо-) случайныеключи;256-битные ключи AES или HMAC состоят просто из случайных байтов.

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


Примечания:

  • DES имеет только размер ключа (и прочность), равный 56 битам, и считается полностью поврежденным: используйте ключ длиной 128 бит или более (которыйтакже исключает использование двухключевых 112-битных ключей DES (если вы обращали на это внимание) и современного шифра, такого как AES.
  • Ваши утверждения проверяют вещи, которые всегда должны быть правдивыми, и не имеют для меня никакого смысла.Если что-то должно быть проверено, это генератор случайных чисел, который используется для генерации ключей (и, к сожалению, их сложно проверить, к сожалению).
  • При проверке имени поставщика - опасная и непереносимая практикаесли вы спросите меня - тогда вы должны по крайней мере использовать Provider#getName() (и, возможно, другие методы получения, которые возвращают полезную информацию о провайдере), а не имя класса.Имя класса является деталью реализации и может фактически измениться, даже если имя провайдера этого не делает.
...