Я попробовал следующие методы для создания закрытого (и открытого) ключа 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 сообщает, что он будет поддерживать большие клавиши. Так что, возможно, нам придется подождать до следующего года.