Как сгенерировать 2048-битную пару ключей DSA для Java?

Я попробовал следующие методы для создания закрытого (и открытого) ключа DSA с длиной ключа 2048 бит:

С помощью keytool

keytool -genkeypair -alias MyKeyPair -keyalg DSA -keysize 2048 -validity 365 -keystore MyKeyStore.ks

В результате чего:

ошибка keytool: java.lang.IllegalArgumentException: размер модуля должен варьироваться от 512 до 1024 и быть кратным 64

С помощью кода

KeyPairGenerator keyGen = KeyPairGenerator.getInstance(keyAlgorithm,"BC");
keyGen.initialize(numBits);

В результате чего:

Exception in thread "main" java.security.InvalidParameterException: strength must be from 512 - 1024 and a multiple of 64
    at org.bouncycastle.jcajce.provider.asymmetric.dsa.KeyPairGeneratorSpi.initialize(Unknown Source)
    at java.security.KeyPairGenerator.initialize(KeyPairGenerator.java:340)

В приведенном выше примере используется реализация Bouncy Castle, потому что где-то я читал, что она должна поддерживать 2048-битные ключи DSA. Я также попробовал стандартную версию с той же ошибкой.

Я установил файлы политики юрисдикции неограниченной силы (JCE). В соответствии с этим выводом вы ожидаете, что большие ключи должны быть возможны:

System.out.println("DSA Max key length: " + Cipher.getMaxAllowedKeyLength("DSA"));
DSA Max key length: 2147483647

Но если вы установите флажок Ограничения по размеру ключа в Документы JCE Providers, 1024 бит – макс.

Кто может сказать, что 2048-битный закрытый ключ просто не поддерживается в Java 7? Или есть другой способ создать ключ такого размера и импортировать его в хранилище ключей Java?

Java 8 API сообщает, что он будет поддерживать большие клавиши. Так что, возможно, нам придется подождать до следующего года.


person Clouren    schedule 19.09.2013    source источник


Ответы (3)


В Java 8 это исправлено: http://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html "Поставщик SUN: поддержка генерации 2048-битных пар ключей DSA и дополнительных алгоритмов подписи для 2048-битных ключей DSA, таких как SHA224 с DSA и SHA256 с DSA».

person Paul Crowley    schedule 11.09.2014
comment
Я только что попробовал keytool -genkeypair -alias MyKeyPair -keyalg DSA -keysize 2048 -validity 365 -keystore MyKeyStore.ks с использованием jdk1.8.0_31 и получил: java.security.InvalidKeyException: ключ слишком длинный для этого алгоритма - person Ya.; 23.05.2015

Поскольку максимальная разрешенная длина ключа составляет 1024 бита. вы получаете исключение. Размер модуля должен быть между 512..1024.., что означает размер ключа. Вы можете скачать JCE с файлами политики неограниченной юрисдикции для вашей версии Java (7 или 8) по ссылке Oracle: официальный сайт Oracle. Но вы должны знать, что для алгоритмов цифровой подписи достаточно 1024 бит.

person M.Veli    schedule 15.07.2014
comment
1024 бит недостаточно для алгоритмов цифровой подписи. Брюс Шнайер говорил людям, использующим этот короткий ключ, проснуться в 2007 году — давно пора перейти к более сильным ключам. schneier.com/blog/archives/2007/05/307digit_number.html (Обратите внимание, это относится только к RSA, DSA DH и т.п., которые уязвимы для NFS — другие алгоритмы, такие как ECDSA, могут использовать гораздо более короткие ключи.) - person Paul Crowley; 11.09.2014
comment
@PaulCrowley, разве Брюс не говорит о RSA, в частности, когда речь идет о 1024 битах, то есть не о DSA? - person Pimin Konstantin Kefaloukos; 16.09.2014
comment
RSA и DSA практически одинаково сильны для одной и той же длины ключа, поскольку NFS работает с ними обоими, как я сказал выше. - person Paul Crowley; 10.07.2016

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

  1. Перейдите сюда и загрузите неограниченную политику юрисдикции Java Cryptography Extension (JCE) Файл. Вы должны установить его на каждую машину, использующую код.

  2. Напишите свою реализацию с нуля.

  3. Откажись и съешь печенье :P (я выбираю это)


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

Надеюсь, это поможет. Также не забывайте, что вы можете проверить, есть ли у кого-то файл в своей системе. Все, что вы делаете, это что-то вроде этого:

boolean isUnlimitedSupported = false;
try {
    KeyGenerator kgen = KeyGenerator.getInstance("AES", "SunJCE");
    kgen.init(256);
    isUnlimitedSupported = true;
} catch (NoSuchAlgorithmException e) {
    isUnlimitedSupported = false;
} catch (NoSuchProviderException e) {
    isUnlimitedSupported = false;
}
System.out.println("isUnlimitedSupported = " + isUnlimitedSupported);

Это может оказаться полезным: http://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppD

person Zeveso    schedule 25.09.2013
comment
Спасибо за вашу реакцию. Мне известно о Политике неограниченной юрисдикции JCE. Как я уже объяснил, я уже установил его. Однако это не сняло ограничение KeyPairGenerator в 1024 бита. Кажется, что сам KeyPairGenerator имеет жесткое ограничение в 1024 вместо того, чтобы оставить это ограничение для конкретной реализации, такой как Bounty Castle. Так что пункт 1 не полное решение. Я думаю, что пункт 2 - это не тот путь, по которому хотелось бы или следует идти. Это может быть единственный выбор, но я ожидаю, что есть и другие обходные пути (например, вокруг JCE). Пока я выбираю пункт 3 и придерживаюсь 1024-бит. - person Clouren; 01.10.2013
comment
@Clouren Не могли бы вы взять исходный код из Bounty Castle и вручную изменить его, чтобы он работал? Источник здесь: bouncycastle.org/latest_releases.html — я только что просмотрел его. Это возможно. Я бы начал с области «bcprov-jdk15on-149\src.zip\org\bouncycastle\crypto\engines», как только вы получите исходный код. - person Zeveso; 03.10.2013