我之前问过一个关于这个问题的问题,但它没有得到正确的回答,也没有任何结果。

我已经澄清了这个问题的一些细节,我真的很想听听你的想法,我该如何解决这个问题,或者我应该尝试什么。

我在我的Linux服务器上安装了Java 1.6.0.12,下面的代码可以完美地运行。

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
    Cipher c = Cipher.getInstance("ARCFOUR");

    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
    c.init(Cipher.DECRYPT_MODE, secretKeySpec);

    return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {
    throw new CryptoException(e);
}

今天我在我的服务器用户上安装了Java 1.6.0.26,当我试图运行我的应用程序时,我得到了以下异常。我的猜测是,这与Java安装配置有关,因为它在第一个版本中可以工作,但在后面的版本中不能工作。

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
    ... 5 common frames omitted

第25行是: c.init(密码。DECRYPT_MODE secretKeySpec);

注: * java。服务器的1.6.0.12 Java目录上的安全性与1.6.0.26 Java几乎完全匹配。安全文件。第一个中没有其他提供者。 *前一个问题在这里。


当前回答

在Java中,默认情况下AES支持128位密钥,如果你计划使用192位或256位密钥,Java编译器将抛出非法密钥大小异常,这是你得到的。

解决方案是victor & James建议的,你需要根据你的JRE版本(java6, java7或java8)下载JCE (Java密码扩展)。

JCE压缩包包含以下JAR:

local_policy.jar US_export_policy.jar

您需要从<JAVA_HOME>/jre/lib/security中替换这些jar。 如果您是在Unix系统上,则可能是指/home/urs/usr/lib/jvm/java-<version>-oracle/

有时只是替换安全文件夹中的local_policy.jar, US_export_policy.jar在unix上不起作用,所以我建议先将安全文件夹复制到桌面,替换jar的@Desktop/security文件夹,从/jre/lib/删除安全文件夹,并将桌面安全文件夹移动到/jre/lib/。

例如::sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib

其他回答

JRE/JDK/ java8司法管辖区文件可以在这里找到:

Java加密扩展(JCE)无限强度管辖策略文件8下载

就像James上面说的: 安装在${java.home}/jre/lib/security/目录下。

问题在于default_local文件的内容。如果您安装了jre,请在jre\lib\security文件夹中的local_policy.jar中的policy:

// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.

grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128,
                                     "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128,
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", *;
    permission javax.crypto.CryptoPermission *, 128;
};

如果您不需要全球有效设置,您可以简单地编辑此文件并将内容更改为

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};

这是你从Oracle下载JCE得到的结果。

从Java 9或8u151开始,你可以在文件中使用注释行:

<JAVA_HOME>/jre/lib/security/java.security

和变化:

#crypto.policy=unlimited

to

crypto.policy=unlimited

请使用最新版本的JDK/JRE。

在我的例子中,我已经将JCE放入JRE文件夹中,但这并没有帮助。发生这种情况是因为我直接从IDE(使用JDK)运行我的项目。

然后我将JDK和JRE更新到最新版本(1.8.0_211),问题已经解决了。

详情:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8170157

这里有一个关于这个问题的简短讨论。它所链接的页面似乎消失了,但其中一个响应可能是你需要的:

实际上,将US_export_policy.jar和local_policy.jar从core/lib/jce复制到$JAVA_HOME/jre/lib/security有帮助。谢谢。