当前位置: 首页 > news >正文

解决java.security.InvalidKeyException: Illegal key size

1.1.8.0_151 以上版本的解决方案

1.无需去官网下载local_policy.jarUS_export_policy.jar这个 jar 包,只需要修改Java\jdk1.8.0_151\jre\lib\security这目录下的java.security文件配置即可

crypto.policy=unlimited

2.下载官方jar包替换 替换路径 jdk1.8\jre\lib\security下的 local_policy.jar 和 US_export_policy.jar

https://www.oracle.com/java/technologies/javase-jce8-downloads.html

3.如果上述方法都解决不了的话 可以通过反射修改AES限制

package com.qingfengche.freight.test; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.Security; import java.util.Base64; import java.util.Map; public class AES256Compatible { private static final String AES_ALGORITHM = "AES/CBC/PKCS5Padding"; private static final int AES_256_KEY_SIZE = 256; public static void main(String[] args) throws Exception { // 第一步:通用解锁AES-256限制(兼容多JDK版本) unlockAES256(); // 第二步:生成256位AES密钥(此时不会报长度错误) SecretKey aes256Key = generateAESKey(AES_256_KEY_SIZE); System.out.println("生成的256位密钥(Base64):" + Base64.getEncoder().encodeToString(aes256Key.getEncoded())); // 第三步:生成IV向量 IvParameterSpec iv = generateIV(); // 第四步:加密解密测试 String plainText = "测试AES-256加密(修复NoSuchFieldException)"; String cipherText = encrypt(plainText, aes256Key, iv); String decryptedText = decrypt(cipherText, aes256Key, iv); System.out.println("原文:" + plainText); System.out.println("加密后:" + cipherText); System.out.println("解密后:" + decryptedText); } /** * 通用解锁AES-256限制(适配JDK7/8不同版本) */ private static void unlockAES256() { try { // 方式1:修改Security的密钥长度限制(优先) Class<?> secClass = Class.forName("javax.crypto.JceSecurity"); Field isRestrictedField = secClass.getDeclaredField("isRestricted"); Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL); isRestrictedField.setAccessible(true); isRestrictedField.set(null, false); // 方式2:清空密钥长度限制的map(备用) Field defaultPolicyField = secClass.getDeclaredField("defaultPolicy"); defaultPolicyField.setAccessible(true); Map<?, ?> defaultPolicy = (Map<?, ?>) defaultPolicyField.get(null); defaultPolicy.clear(); } catch (NoSuchFieldException e) { // 若上面的字段不存在,尝试另一种适配方式(JDK8u91+) try { Class<?> cryptoPolicyClass = Class.forName("javax.crypto.CryptoPermissions"); Field permsField = cryptoPolicyClass.getDeclaredField("perms"); permsField.setAccessible(true); Map<?, ?> perms = (Map<?, ?>) permsField.get(null); if (perms != null) { perms.clear(); } } catch (Exception e2) { // 忽略字段不存在的异常(说明JDK已解锁,无需处理) System.out.println("当前JDK无需解锁AES-256,跳过反射:" + e2.getMessage()); } } catch (Exception e) { // 所有反射失败都忽略,说明JDK版本无需解锁 System.out.println("反射解锁失败(无需处理):" + e.getMessage()); } } /** * 生成指定长度的AES密钥 */ private static SecretKey generateAESKey(int keySize) throws NoSuchAlgorithmException { // 强制设置SecureRandom,避免伪随机 SecureRandom secureRandom = SecureRandom.getInstanceStrong(); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); // 核心:设置256位密钥长度 keyGen.init(keySize, secureRandom); return keyGen.generateKey(); } /** * 生成16位IV向量 */ private static IvParameterSpec generateIV() { byte[] iv = new byte[16]; new SecureRandom().nextBytes(iv); return new IvParameterSpec(iv); } /** * AES-256加密 */ private static String encrypt(String plainText, SecretKey key, IvParameterSpec iv) throws Exception { Cipher cipher = Cipher.getInstance(AES_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key, iv); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } /** * AES-256解密 */ private static String decrypt(String cipherText, SecretKey key, IvParameterSpec iv) throws Exception { Cipher cipher = Cipher.getInstance(AES_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key, iv); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText)); return new String(decryptedBytes, StandardCharsets.UTF_8); } }
http://www.rkmt.cn/news/1444164.html

相关文章:

  • 如何让微信聊天记录成为你的数字人生档案馆?WeChatMsg完整使用指南
  • CFnew插件系统:如何开发自定义插件
  • ToDesk Linux客户端配置全解析:手把手教你读懂config.ini,管理连接密码与安全设置
  • Windows和Ubuntu共享键鼠,Barrier连接报错‘failed to connect secure socket’的保姆级修复指南
  • CryptoSRAM:物联网安全加密的内存计算新范式
  • Python模拟詹姆斯韦伯太空望远镜
  • Boss Show Time:打破求职信息壁垒,让招聘时间一目了然的智能插件
  • 别再只盯着Vaihingen数据集刷榜了:一份给遥感新手的实战避坑与数据预处理指南
  • ASM232S电气特性与TIA/EIA-232-F及ITU V.28标准符合性深度分析
  • 零硬件成本学Arduino!Wokwi在线仿真入门指南与避坑宝典
  • 别再用余弦相似度了!用Python手写PMI(点间互信息)从零到一搞定关键词共现分析
  • 基于Rao-Blackwellized粒子滤波与多融合策略全阶 EKF 的双车协同 SLAM 研究(Matlab代码实现)
  • OpencvSharp 算子学习教案之 - Cv2.GetOptimalDFTSize
  • 2026 无锡瓷砖空鼓翘边维修哪家靠谱?七大区优质修缮企业综合盘点 - 吉修匠
  • OmenSuperHub终极指南:5步解锁惠普OMEN游戏本隐藏性能
  • 用Python和NumPy模拟一个健康预测模型:从保险案例到代码实现
  • 2026AI Agent元年:从“会聊天“到“能干活“,万亿市场变革!企业如何抢占先机?
  • 2026年硅胶灯带防水罩价格排名 - mypinpai
  • ThinkPad R61i升级T9300处理器专用BIOS刷写包:含WinPE启动工具、校验脚本与完整操作指引
  • 2026 无锡厨卫瓷砖空鼓翘边维修机构排名 七大区正规服务商精选 - 吉修匠
  • 与AI同行,答案在人手中:普通人如何逆袭,稳稳向前冲?
  • 做录播,只改画面,没改声音是不行的!
  • 2026年金平装修设计技术解析:汕头设计/潮阳装修设计/澄海装修设计/金平装修设计/龙湖旧房翻新/龙湖装修设计/选择指南 - 优质品牌商家
  • 智慧职教自动刷课脚本终极指南:3步实现全平台自动化学习解决方案
  • 发泡混凝土设备技术全解析:水泥发泡机械设备、水泥发泡机设备、泡沫混凝土水泥发泡机、泡沫混凝土设备机器、泡沫轻质土机械选择指南 - 优质品牌商家
  • 滑轨电视价格如何 - mypinpai
  • 2026年6月新发布观察:温州极窄门锁实力厂商的性价比突围之路 - 2026年企业资讯
  • 带外生变量的时间序列预测Python实战包(ARIMAX模型+数据+可视化)
  • 基于ESP-01与WS2812B的智能灯带控制器:从硬件设计到网页控制
  • 基于 VSCode + Icarus 的 Verilog 编译和仿真