Ключи 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()
(и, возможно, другие методы получения, которые возвращают полезную информацию о провайдере), а не имя класса.Имя класса является деталью реализации и может фактически измениться, даже если имя провайдера этого не делает.