我尝试了以下方法来生成具有2048位密钥长度的DSA私有(和公共)密钥:
通过keytool
keytool -genkeypair -alias MyKeyPair -keyalg DSA -keysize 2048 -validity 365 -keystore MyKeyStore.ks
Run Code Online (Sandbox Code Playgroud)
导致:
keytool错误:java.lang.IllegalArgumentException:模数大小必须介于512到1024之间,并且是64的倍数
通过代码
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(keyAlgorithm,"BC");
keyGen.initialize(numBits);
Run Code Online (Sandbox Code Playgroud)
导致:
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)
Run Code Online (Sandbox Code Playgroud)
上面的例子使用了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
Run Code Online (Sandbox Code Playgroud)
但是,如果您在JCE Providers文档中选择了Keysize限制,则1024位是最大值.
谁可以判断Java 7中是否支持2048位私钥?或者,如果有另一种方法来创建此大小的密钥并将其导入Java密钥库?
在Java的API 8赠送它将支持更大的按键.所以我们可能需要等到明年.
我以前经历过这种事,我只想说这真是太糟糕了。如果您想要更大的密钥大小,以下是您的基本选择。
转到此处并下载 Java 加密扩展 (JCE) 无限强度管辖权策略文件- 您必须将其安装在使用该代码的每台计算机上。
从头开始编写您自己的实现。
放弃并吃一块饼干: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);
Run Code Online (Sandbox Code Playgroud)
您可能会发现这很有帮助:http://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppD
归档时间: |
|
查看次数: |
10287 次 |
最近记录: |