为了账号安全,请及时绑定邮箱和手机立即绑定

Java AES加密错误

Java AES加密错误

潇湘沐 2021-04-08 18:19:15
我想使用AES加密技术对邮件进行加密。当我使用此代码时,我遇到了一些错误java.security.InvalidKeyException: Illegal key size or default parameters我的加密代码:public class Encryption {    public static class MessageEncrypt {        public static class AES {            private final static String ALGO = "AES";            private String secretKey;            private String data;            public String encrypt(String secretKey, String data) throws Exception {                SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");                KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), secretKey.getBytes(), 128, 256);                SecretKey tmp = factory.generateSecret(spec);                SecretKey key = new SecretKeySpec(tmp.getEncoded(), ALGO);                Cipher cipher = Cipher.getInstance(ALGO);                cipher.init(Cipher.ENCRYPT_MODE, key);                return toHex(cipher.doFinal(data.getBytes()));            }            public String decrypt(String secretKey, String data) throws Exception {                SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");                KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), secretKey.getBytes(), 128, 256);                SecretKey tmp = factory.generateSecret(spec);                SecretKey key = new SecretKeySpec(tmp.getEncoded(), ALGO);                Cipher cipher = Cipher.getInstance(ALGO);                cipher.init(Cipher.DECRYPT_MODE, key);                return new String(cipher.doFinal(toByte(data)));            }            private static byte[] toByte(String hexString) {                int len = hexString.length() / 2;                byte[] result = new byte[len];                for (int i = 0; i < len; i++)                    result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue();                return result;            }
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您也可以使用没有此限制的OpenJDK。

任何从事密码学工作的人都知道密码的导入/导出涉及复杂的法律问题。OpenJDK中的JCE具有开放的加密接口,这意味着它不限制可以使用的提供程序。

编辑:由于我太菜鸟了,所以我无法回复Jens。


查看完整回答
反对 回复 2021-04-18
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

最简单的解决方案是将jdk升级到jdk1.8.0_161或更高版本。


由于有一个好消息,因为Java打包与从jdk1.8.0_161开始的有限和无限策略jar捆绑在一起,并且默认情况下它使用无限策略设置。因此,我们所需要做的就是使用升级的Java版本(jdk1.8.0_161或更高版本


或者


默认情况下,java安装包装随附128位密钥大小,在这里您使用的似乎是更大大小的密钥。


为了使其正常工作,我们需要从此处安装java密码学扩展无限强度策略jar 。


您需要使用无限强度的策略jar更新Java安全策略jar。


安装

笔记:


•Unix(Solaris / Linux / Mac OS X)和Windows使用不同的路径名分隔符,因此请为您的环境使用适当的分隔符(“ \”,“ /”)。


•(下)是指JRE的安装目录。根据您是在JRE上运行JCE还是在Java Development Kit或JDK™中包含的JRE来确定。JDK包含JRE,但在文件层次结构中处于不同级别。例如,如果JDK安装在Unix上的/home/user1/jdk1.8.0或Windows上的C:\ jdk1.8.0中,则为:


/home/user1/jdk1.8.0/jre [Unix] C:\ jdk1.8.0 \ jre [Windows]


另一方面,如果JRE安装在Unix上的/home/user1/jre1.8.0或Windows上的C:\ jre1.8.0中,但未安装JDK,则为:


/home/user1/jre1.8.0 [Unix] C:\ jre1.8.0 [Windows]


•在Windows上,对于每个JDK安装,可能在“程序文件”目录下安装了其他JRE。请确保为计划使用的所有JRE安装强度不受限制的策略JAR文件。


以下是安装说明:


1. 从此处下载,解压缩并提取无限强度的JCE策略文件。


这将创建一个名为UnlimitedJCEPolicyJDK8的子目录。该目录包含以下文件:


local_policy.jar             Unlimited strength local policy file

US_export_policy.jar         Unlimited strength US export policy file

2. 复制无限强度策略JAR文件。这些文件已经存在,我们需要用附件替换它们。


<java-home>/lib/security           [Unix]

<java-home>\lib\security           [Windows]


查看完整回答
反对 回复 2021-04-18
  • 2 回答
  • 0 关注
  • 215 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信