Какой размер ключа для PBEWithMD5AndTripleDES? - PullRequest
7 голосов
/ 24 февраля 2012

Я пытаюсь заменить PBEWithMD5AndDES на PBEWithMD5AndTripleDES в существующем коде. До сих пор я использую ту же фразу-пароль, что и раньше, и получаю следующее исключение:

java.security.InvalidKeyException: недопустимый размер ключа

Я посмотрел онлайн и увидел, что DES использует 64-битный ключ, а TripleDES использует 128-битный ключ. Я не уверен в деталях того, как моя ключевая фраза используется для генерации ключа, и не уверен, где искать, чтобы понять это полностью. Мой пароль длиной 260 символов. Я попытался удвоить длину, но получаю то же исключение.

Я генерирую PBEKeySpec из моей парольной фразы, с 8-байтовой солью и счетчиком итераций 12. Я вижу, что есть другой конструктор, который принимает аргумент keyLength, но документация описывает его как «подлежащий выводу», и я не понимаю этого У меня есть идея, что мне нужно изменить количество итераций и / или указать аргумент keyLength, но я не хочу делать это вслепую, не понимая полностью, что я делаю.

Вот основная схема кода, который я сейчас использую:

String passphrase = ...
byte[] salt = ...
int iterationCount = 12;
String algorithm = "PBEWithMD5AndTripleDES";
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec);
Cipher cipher = Cipher.getInstance(key.getAlgorithm());
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
byte[] encoded = cipher.doFinal(data);

Ответы [ 2 ]

12 голосов
/ 24 февраля 2012

PBEWith AndTripleDES Требуется политика «Неограниченная сила»

Этот алгоритм использует 168-битный ключ (хотя из-за уязвимостей он имеет эффективную силу 112 бит).Чтобы использовать симметричный ключ этой длины, вам нужно «Политика неограниченной юрисдикции» , установленная в вашей среде выполнения Java.

Сообщение « Недопустимый размер ключа» указываетдлина ключа не разрешена политикой;если длина ключа неверна для алгоритма, поставщик SunJCE использует сообщение « Неверный размер ключа».

Не использовать PBEW с AndTripleDES

Обратите внимание, что «PBEWithMD5AndTripleDES» является неправильным алгоритмом для использования.

Шифрование на основе пароля обычно следует PKCS # 5. Он определяет схему шифрования для DES (или RC2), называемую PBES1.Поскольку PBES1 был разработан для генерации 64-битных (или менее) ключей, Oracle создал собственное расширение для генерации более длинных ключей.Он не подвергался той же проверке, что и PKCS # 5, и если вам нужно взаимодействовать с любой другой платформой, вам придется копаться в исходном коде , чтобы узнать, какключ и вектор инициализации являются производными.

Также странно, что вектор инициализации является производным от пароля.Целью IV является создание разных зашифрованных текстов каждый раз, когда данный простой текст шифруется одним и тем же ключом.Если IV генерируется из ключа, эта цель побеждена.Алгоритм получения ключа, используемый PBES1, позволяет избежать этого, добавляя «соль», которая должна отличаться при каждом использовании пароля.Но это может быть легко облажаться;Предоставление IV непосредственно для инициализации шифра является более обычным и делает более очевидным, что происходит.

Использование PBKDF2 Вместо

PKCS # 5 также определяется алгоритм вывода ключа, называемый PBKDF2, которыйтеперь поддерживается Java.Он обеспечивает превосходную безопасность для PBES1, поскольку вектор инициализации и любые другие параметры, требуемые шифром, не получены из пароля, но выбраны независимо.

Вот пример с PBKDF2 с использованием AES.Если вы не можете выполнить рекомендацию по обновлению до AES, пример можно применить к DESede, используя длину ключа 192 и изменив вхождения «AES» на «DESede».

Параметры ключей TDEA

Существует три варианта клавиш, которые можно использовать с TDEA («Triple DES» или «DESede»).Они берут 64-, 128- или 192-битные ключи (включая биты четности), в зависимости от опции.

Размеры ключей, принятые реализацией TDEA, зависят от поставщика;некоторые требуют, чтобы вы сформировали 192-битный ключ, даже если вы используете опцию 56-битного ключа, которая фактически является DES вместо TDEA.В большинстве реализаций в качестве ключа используется 16 или 24 байта.

Только вариант с тремя ключами (168 бит или 192 бита с проверкой четности) можно считать "надежным шифрованием".Он имеет 112 бит эффективной силы.

2 голосов
/ 29 февраля 2012

Как говорит Эриксон, «правильный» ответ на этот вопрос заключается в установке файлов политики юрисдикции неограниченной силы в JRE.

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

Я также обнаружил PBEWithSHA1AndTripleDES и попробовал его, но получил ту же ошибку заполнения при расшифровке.

Мне удалось изменить наши требования с PBEWithMD5AndTripleDES на TripleDES (DESede), и это полностью исключилопроблема для меня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...