如何为Java生成2048位DSA密钥对?

时间:2013-09-19 08:13:12

标签: java security dsa

我尝试了以下方法来生成密钥长度为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赠送它将支持更大的键。所以我们可能需要等到明年。

3 个答案:

答案 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)

我以前经历过这一切,所有我要说的是这个糟糕的人。如果您想要更高的密钥大小,这是您的基本选择。

  1. Go here and download the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File - 您必须在使用该代码的每台计算机上安装它。

  2. 从头开始编写您自己的实现。

  3. 放弃&吃饼干:P(我选择这个)


  4. 现在让我解释一下你的问题。 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

相关问题