我尝试了以下方法来生成具有 2048 位密钥长度的 DSA 私有(和公共)密钥:
通过 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) Unlimited Strength Jurisdiction Policy Files。根据这个输出,你会期望大键应该是可能的:
System.out.println("DSA Max key length: " + Cipher.getMaxAllowedKeyLength("DSA"));
DSA Max key length: 2147483647
但是,如果您在JCE Providers Docs中检查 Keysize Restrictions ,则最大为 1024 位。
谁能判断 Java 7 是否根本不支持 2048 位私钥?或者是否有另一种方法可以创建这种大小的密钥并将其导入 Java 密钥库?
Java 8 API放弃了它将支持更大的密钥。所以我们可能需要等到明年。