转:https://blog.csdn.net/u014137486/article/details/122628331
    aes各种加密方法 https://www.jianshu.com/p/e8969d8bb6d7

    java.security.InvalidKeyException: Illegal key size or default parameters
    local_policy.jar问题经常发生在AES、DES加密上,当使用JDK的加密工具进行加解密时,可能会因为密钥长度限制,不能使用大于128位的密钥。本文重在理解限制与不限制体现在什么地方,不适合寻找加解密demo的同学。

    1. 当项目中存在与此加解密相关的功能时需要查看当前版本jdk使用什么样的密钥限制策略。

    默认限制密钥长度的jdk情况说明
    并非所有的jdk都有此限制,诸如jdk8u141 有此问题,因为默认情况下jre/lib/security目录下的local_policy.jar中是限制密钥长度的,

    在此状态下进行加解密会报如下异常,

    Exception in thread “main” java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1025)
    at javax.crypto.Cipher.implInit(Cipher.java:800)
    at javax.crypto.Cipher.chooseProvider(Cipher.java:863)
    at javax.crypto.Cipher.init(Cipher.java:1248)
    at javax.crypto.Cipher.init(Cipher.java:1185)
    默认不限制密钥长度的jdk情况说明
    但像jdk8u191中便没有此问题,请看jre/lib/security目录内容,没有local_policy.jar, US_export_policy.jar,多了一个policy目录,其下是两种限制策略:limited, unlimited,

    在默认情况下,jdk8u191 AES加解密密钥长度不限制,使用的是jre/lib/security/unlimited目录中的策略文件。其策略机制为:

    如果java.security文件中配置了crypto.policy,会使用配置的机制,只允许两个值limited | unlimited,如果配置错误,则会报异常;
    如果java.security文件中没有配置crypto.policy,那么会像jdk之前版本一样,加载jre/lib/security目录下的local_policy.jar, US_export_policy.jar,并使用其代表的策略;
    如果java.security文件中没有配置crypto.policy并且jre/lib/security目录下没有local_policy.jar, US_export_policy.jar,那么会启用默认不限制密钥长度机制。
    答疑解惑
    限制与不限制的区别
    区别体现在local_policy.jar的策略文件内容上,见下图,

    US_export_policy.jar作用
    目前作用不明,根据查看limited中的US_export_policy.jar以及unlimited中的US_export_policy.jar,发现内容完全一致。且经过测试,限制与不限制仅体现在local_policy.jar的不同。不过,US_export_policy.jar文件却不可缺失,否则在类加载阶段会报异常。

    是否替换掉文件后能够自动生效
    经过测试,local_policy.jar文件虽然可以在JVM运行时替换,但由于文件内容是在类加载阶段加载的,因此即便替换了local_policy.jar文件也无法生效,必须重启JVM。

    AES算法支持的密钥长度
    虽说可以通过policy文件不限制密钥长度,但密钥长度却也并非真正无限制,AES算法的密钥长度只能是16或24或32个字符(即16或24或32个字节),

    在default_local.policy文件中写的128位指二进制位数,并非字符数,按照AES支持的字节数,在限制策略下,AES密钥只允许16个字符,