6

我尝试了以下方法来生成具有 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放弃了它将支持更大的密钥。所以我们可能需要等到明年。

4

3 回答 3

2

Java 8 解决了这个问题: http: //docs.oracle.com/javase/8/docs/technotes/guides/security/enhancements-8.html “SUN 提供者:支持 2048 位 DSA 密钥对生成和其他签名算法2048 位 DSA 密钥,例如 SHA224withDSA 和 SHA256withDSA。”

于 2014-09-11T10:33:48.787 回答
1

因为允许的最大密钥长度是 1024 位。你得到一个例外“模数大小必须在 512..1024..之间”,这意味着密钥大小。您可以从 oracle 的链接下载适用于您的 Java 版本(7 或 8)的 JCE with Unlimited Jurisdiction Policy 文件: Oracle 的官方站点。但是你应该知道,1024 位对于数字签名算法来说已经足够了。

于 2014-07-15T18:19:40.943 回答
0

我以前也经历过,我只能说这太糟糕了。如果您想要更大的密钥大小,这是您的基本选择。

  1. 转到此处并下载 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

于 2013-09-25T16:16:53.180 回答