文档章节

java.security.InvalidKeyException Illegal key size

s
 sg4567
发布于 2017/05/17 15:19
字数 499
阅读 26
收藏 0
点赞 0
评论 1

项目中使用aes加密算法,密钥只有16位可以通过,32位报错java.security.InvalidKeyException Illegal key size。

解决方案:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html 下载两个jar包,替换D:\Java\jre7\lib\security下同名的文件即可。

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AesEncodeUtil {

    private final static Logger logger = LoggerFactory.getLogger(AesEncodeUtil.class.getName());
    public final String VIPARA = "0200010700020204"; // 偏移量
    public final String bm = "UTF-8";
    public String ASE_PASSWORD = "";

    public AesEncodeUtil(String key) {
        ASE_PASSWORD = key;
    }

    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }

    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1)
            return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }

    /**
     * 加密
     *
     * @param cleartext
     * @return
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException
     * @throws InvalidAlgorithmParameterException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    public String encrypt(String cleartext) throws Exception {

        /**
         * 实例化 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现
         * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
         */
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        // 防止linux下 随机生成key
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(ASE_PASSWORD.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        // SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        SecretKeySpec key = new SecretKeySpec(ASE_PASSWORD.getBytes("utf-8"), "AES");
        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());
        // SecretKeySpec key = new SecretKeySpec(
        // ASE_PASSWORD.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(cleartext.getBytes(bm));

        return parseByte2HexStr(Base64.encodeBase64(encryptedData));
    }

    /**
     * 解密
     *
     * @param encrypted
     * @return
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException
     * @throws NoSuchPaddingException
     * @throws InvalidAlgorithmParameterException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    public String decrypt(String encrypted) throws Exception {

        /**
         * 实例化 使用 PKCS7PADDING 填充方式,按如下方式实现,就是调用bouncycastle组件实现
         * Cipher.getInstance(CIPHER_ALGORITHM,"BC")
         */
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        // 防止linux下 随机生成key
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(ASE_PASSWORD.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        encrypted = URLDecoder.decode(encrypted, "utf-8");
        byte[] byteMi = Base64.decodeBase64(parseHexStr2Byte(encrypted));
        logger.debug("aes decrypt base64:{}", new String(byteMi));
        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes("utf-8"));
        // SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        SecretKeySpec key = new SecretKeySpec(ASE_PASSWORD.getBytes("utf-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
        byte[] decryptedData = cipher.doFinal(byteMi);
        return new String(decryptedData, bm);
    }
}

 

© 著作权归作者所有

共有 人打赏支持
s
粉丝 1
博文 17
码字总数 1802
作品 0
沈阳
加载中

评论(1)

s
sg4567
properties-〉libraries->jre system library->更新后的jre
微信企业号回调模式配置讲解 Java Servlet+Struts2版本 echostr校验失败解决

异常java.security.InvalidKeyException:illegal Key Size 也就是 echostr校验失败,请您检查是否正确解密并输出明文echostr 这个错误 企业微信登陆地址http://qy.weixin.qq.com/ 配置成功以后...

小帅帅丶 ⋅ 2014/11/26 ⋅ 0

java.security.InvalidKeyException 异常错误

今天做接口的时候 遇见这个问题,装载cem,pfx等证书的时候: final char[] kp = HttpClientUtil.str2CharArray(keyPasswd);KeyManagerFactory kmf = KeyManagerFactory.getInstance(X509);Ke......

晴天太轻 ⋅ 2014/12/05 ⋅ 0

微信加解密的异常处理办法

java开发对接微信公众平台接口时,在加解密的过程中出现java.security.InvalidKeyException: Illegal key size,则需要下载一个东西: JRE/JDK 6:http://www.oracle.com/technetwork/java/...

liuzhenlife ⋅ 2017/03/03 ⋅ 0

错误:java.security.InvalidKeyException: Illegal key size or default parameters解决方法

错误:java.security.InvalidKeyException: Illegal key size or default parameters解决方法 原文地址:http://www.wxdl.cn/java/security-invalidkey-exception.html 作者:我心动了 Java......

Magnosaus ⋅ 2016/09/18 ⋅ 0

Java使用AES加密解密时需要的Jar

当使用Java进行AES加密或者解密的时候出现如下错误: java.security.InvalidKeyException: Illegal key size or default parameters 可尝试使用官方的JCE解决: 下载地址: http://www.oracle.c...

Kxvz ⋅ 2016/07/15 ⋅ 0

微信公众号开发加密解密异常java.security.InvalidKeyException:illegal Key Size

Java要求jdk 1.6及1.6以上 异常java.security.InvalidKeyException:illegal Key Size的解决方案:在官方网站下载JCE无限制权限策略文件(请到官网下载对应的版本, 例如JDK7的下载地址:htt...

被钓的小鱼 ⋅ 2016/12/09 ⋅ 0

Java默认不支持AES256

默认Java的AES最大支持128bit的密钥,如果使用256bit的密钥,会抛出一个异常: 其实Java官网上提供了解决方案,需要下载“Java Cryptography Extension (JCE) Unlimited Strength Jurisdicti...

BoyTNT ⋅ 2016/10/10 ⋅ 0

java.security.InvalidKeyException:illegal Key Size

现象使用了weixin-java-tools包对接微信企业号,在激活回调URL时就发生异常,AES加密失败,报java.security.InvalidKeyException:illegal Key Size,当密钥大于128位时报此错误。 解决方案到...

空心大白菜 ⋅ 2015/08/13 ⋅ 0

InvalidKeyException AES加密异常

前言:微信接受加密消息或者自己写AES加密解密时会报错:java.security.InvalidKeyException:illegal Key Size,这是美国出口限制....... 下载地址: jdk6 :http://download.csdn.net/detail...

王念博客 ⋅ 2016/11/21 ⋅ 0

部署java项目出现base 64解析问题

部署tomcat之前,需要部署jdk环境,那么jdk和tomcat之间也是有一定得兼容性的,抛开版本问题不谈(jdk和tomcat版本,不能相差太大,jdk向下兼容),jdk与tomcat中还是有很多的兼容性 问题的,...

壹休哥 ⋅ 2016/12/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部