我有两个小程序。一个人做:
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时,为什么加密会抛出相同的异常,而解密却没有?
答案 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密钥。