2013-09-19 3 views
5

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

Via Keytool

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

Итоговое в:

keytool error: java.lang.IllegalArgumentException: Modulus size must range from 512 to 1024 and be a multiple of 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) 

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

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

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

Но если вы Echeck KeySize ОГРАНИЧЕНИИ в JCE Providers Docs, 1024-бит равен максимальному.

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

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

ответ

-1

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

  1. Go here and download the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File - Вы должны установить это на каждой машине, которая использует код.

  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

+0

спасибо за вашу реакцию я в курсе. как я объяснил, я уже установил его, но он не удалил 1024-битный предел KeyPairGenerator. Кажется, что у самого KeyPairGenerator есть жесткий предел 1024 inst чтобы оставить этот предел для конкретной реализации, например, Bounty Castle. Итак, точка 1 не является полным решением. Пункт 2 - это не тот путь, который хотелось бы или должен принять, я думаю. Это может быть единственный выбор, но я ожидаю, что есть другие способы обхода (например, вокруг JCE). На данный момент я выбираю точку 3 и придерживаюсь 1024-бит. – Clouren

+0

@Clouren Вы бы хотели взять исходный код из Bounty Castle и вручную изменить его, чтобы работать? Источник находится здесь: http://www.bouncycastle.org/latest_releases.html - Я просто просмотрел его. Возможно. Я начну в области «bcprov-jdk15on-149 \ src.zip \ org \ bouncycastle \ crypto \ engines», как только вы получите исходный код. – Zeveso

0

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

+1

1024 бита * недостаточно * для алгоритмов цифровой подписи.Bruce Schneier рассказывал людям, использующим этот короткий ключ для «проснуться» в 2007 году - давно пора переходить к более сильным клавишам. https://www.schneier.com/blog/archives/2007/05/307digit_number.html (это относится только к RSA, DSA DH и тому подобное, которые уязвимы для NFS - другие алгоритмы, такие как ECDSA, могут использовать гораздо более короткие ключи.) –

+0

@PaulCrowley не Брюс говорит о RSA, в частности, когда речь идет о 1024 бит, то есть не DSA? –

+0

RSA и DSA - почти такая же сила для одной и той же длины ключа, поскольку NFS работает над обоими из них, как я уже говорил выше. –

1

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

+1

Я только что попробовал keytool -genkeypair -alias MyKeyPair -keyalg DSA -keysize 2048 -validity 365 -keystore MyKeyStore.ks используя jdk1.8.0_31, и я получил: «java.security.InvalidKeyException: Ключ слишком длинный для этого алгоритма» –

Смежные вопросы