文档章节

java.security.InvalidKeyException Illegal key size

s
 sg4567
发布于 2017/05/17 15:19
字数 499
阅读 33
收藏 0

项目中使用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
博文 19
码字总数 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
0
java.security.InvalidKeyException 异常错误

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

dev_zh
2014/12/05
0
0
InvalidKeyException: Illegal key size

java.security.InvalidKeyException: Illegal key size。 SecretKeySpec secretKeySpec = new SecretKeySpec(aesKey, "AES"); 感到一脸懵逼,还好网络是万能的,百度一下,简单对比一下,就找...

时光流转
07/03
0
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
0
Java使用AES加密解密时需要的Jar

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

Kxvz
2016/07/15
50
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash重定向详解

Bash重定向详解 Bash的重定向指的是将命令的输入和输出导向不同地方,而不是默认的标准输入、标准输出和标准错误。Bash的重定向实际上是对标准输入、标准输出和标准错误的重置,进而将所需输...

小陶小陶
今天
3
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
12
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
4
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部