文档章节

java.security.InvalidKeyException Illegal key size

s
 sg4567
发布于 2017/05/17 15:19
字数 499
阅读 39
收藏 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使用AES加密解密时需要的Jar

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

Kxvz
2016/07/15
50
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

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
32分钟前
2
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
57分钟前
6
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
6
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
5
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部