InvalidKeyException用于加密但不用于解密

时间:2014-05-15 16:31:27

标签: java encryption jce

我有两个小程序。一个人做:

RSAPrivateKey sKey = getPrivateKey(keyFile);
Cipher cipher = Cipher.getInstance("RSA/None/OAEPWithSHA512AndMGF1Padding");
cipher.init(Cipher.DECRYPT_MODE, sKey);

sKey长度为2048位。

另一个:

byte[] kSession= fileToBytes(kSessionFile);
SecretKeySpec skeySpec = new SecretKeySpec(kSession, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

kSession长度为32个字节

我知道需要为某些加密操作安装扩展的JCE无限强度管辖权政策文件,如here所述。

我的问题是,当没有安装这些jar时,为什么加密会抛出相同的异常,而解密却没有?

1 个答案:

答案 0 :(得分:1)

密钥类型,大小平台(JRE或JDK版本)都是必需的知识,以查看是否需要无限制的加密文件。这些文件取决于Oracle为遵守特定导入法规而设置的策略。某些密码+密钥大小可免费使用,而其他密码大小则不可用。哪些是允许的,哪些不是取决于政治而不是技术推理。

如果您使用加密或解密,则无关紧要。解密可用于某些加密模式下的加密,例如CTR模式加密。


在您的特定情况下an RSA key of 2048 bits has a lot less strenght than an AES key of 256 bits。因此,代码的一部分抛出异常而另一部分则不会抛出异常并不奇怪。除非您拥有Java(TM)SE运行时环境(版本1.7.0_45-b18)的无限强度文件,否则将禁止使用192或256位的AES密钥。