当前位置: 首页 > 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.jsqmd.com/news/932831/

相关文章:

  • Ubuntu 20.04上从零复现A-Loam:我踩过的那些坑和最终解决方案
  • Windows Server 2016评估版总自动关机?别慌,用DISM命令换个正式版序列号就搞定
  • 字典Dictionary
  • 如何让微信聊天记录成为你的数字人生档案馆?WeChatMsg完整使用指南
  • 如何快速获取完美歌词同步:163MusicLyrics开源工具完全指南
  • Sora 2体育视频生成正在淘汰传统转播车?:2024东京奥运会预演数据显示——单场赛事成本下降68%,但需在48小时内完成这6项合规改造
  • Sora 2商业广告落地指南(企业级合规+ROI可量化版)
  • 从零开始:如何在电脑上完美运行Switch游戏的5步指南
  • CFnew插件系统:如何开发自定义插件
  • JSCPC现场赛生存手册:从Ubuntu命令行编译到看气球颜色‘抄作业’
  • ToDesk Linux客户端配置全解析:手把手教你读懂config.ini,管理连接密码与安全设置
  • 从鸡尾酒会到脑电波:用Python和ICA算法实战盲信号分离(保姆级教程)
  • 第一次打JSCPC(江苏省赛)是种什么体验?给新手小白的5点避坑指南
  • Odysseus AI工作空间10大核心功能详解:从聊天到深度研究的完整套件
  • CryptoSRAM:物联网安全加密的内存计算新范式
  • EhViewer开源漫画应用完整指南:从入门到精通的四步进阶
  • Python模拟詹姆斯韦伯太空望远镜
  • 2026年6月业内推荐:探访温州专业高端笔记本定制制造厂臻冠文具 - 2026年企业资讯
  • Windows和Ubuntu共享键鼠,Barrier连接报错‘failed to connect secure socket’的保姆级修复指南
  • 终极高效音乐歌单迁移攻略:3分钟实现多平台数据无缝流转
  • Boss Show Time:打破求职信息壁垒,让招聘时间一目了然的智能插件
  • 用Python给朋友一个惊喜:自动化生成个性化生日贺卡(附完整源码)
  • Guava RateLimiter 深度解析
  • LinkSwift:九大网盘直链下载助手的终极免费解决方案
  • 医疗知识图谱实战包:百度百科爬取+三元组抽取+Neo4j建模+网页可视化
  • SpringCloud Alibaba微服务搭建
  • DeepAssert:基于LLM的模块级细粒度断言生成技术
  • HoYo.Gacha:米哈游玩家必备的本地抽卡记录分析工具
  • 从ICU监护到出院账单:用Python+SQL拆解MIMIC-IV里的真实医疗数据闭环
  • JoyCon-Driver:终极开源跨平台适配工具,释放Switch手柄的PC游戏潜能