我尝试了以下方法来生成密钥长度为2048位的DSA私有(和公共)密钥:
通过keytool
keytool -genkeypair -alias MyKeyPair -keyalg DSA -keysize 2048 -validity 365 -keystore MyKeyStore.ks
导致:
keytool error: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赠送它将支持更大的键。所以我们可能需要等到明年。
答案 0 :(得分:2)
Java 8修复了这个问题:http://docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html“SUN提供商:支持2048位DSA密钥对生成以及针对2048位DSA密钥的其他签名算法,例如SHA224withDSA和SHA256withDSA。”
答案 1 :(得分:0)
因为允许的最大密钥长度是1024位。你得到一个例外“模数大小必须在512..1024 ..之间”,这意味着密钥大小。您可以从oracle的链接下载适用于Java版本(7或8)的JCE with Unlimited Iurisdiction Policy文件: Oracle's official site。但是你应该知道1024位足以用于数字签名算法。
答案 2 :(得分:-1)
我以前经历过这一切,所有我要说的是这个糟糕的人。如果您想要更高的密钥大小,这是您的基本选择。
Go here and download the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File - 您必须在使用该代码的每台计算机上安装它。
从头开始编写您自己的实现。
放弃&吃饼干: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