博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java AES 加密解密工具(Advanced Encryption Standard)发现明文相同但每次重启服务后密文就会不同于是有了改进...
阅读量:6043 次
发布时间:2019-06-20

本文共 8218 字,大约阅读时间需要 27 分钟。

1、通用方法  

package com.qlkj.hzd.commom.utils;import javax.crypto.*;import java.io.UnsupportedEncodingException;import java.security.*;/** * RSA相关工具类 * * @author vampire * @date 2018/10/12 下午5:33 */public class EncrypAES {    //KeyGenerator                提供对称密钥生成器的功能,支持各种算法    private static KeyGenerator keygen;    //SecretKey                负责保存对称密钥    private static SecretKey deskey;    //Cipher负责完成加密或解密工作    private static Cipher c;    //该字节数组负责保存加密的结果    private static byte[] cipherByte;    static {        try {            Security.addProvider(new com.sun.crypto.provider.SunJCE());            //实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)            keygen = KeyGenerator.getInstance("AES");            //生成密钥            deskey = keygen.generateKey();            //生成Cipher对象,指定其支持的DES算法            c = Cipher.getInstance("AES");        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        }    }    /**     * 对字符串加密     *     * @param str     * @return     * @throws InvalidKeyException     * @throws IllegalBlockSizeException     * @throws BadPaddingException     */    public static String Encrytor(String str) throws InvalidKeyException,            IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {        //                根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式        c.init(Cipher.ENCRYPT_MODE, deskey);        byte[] src = str.getBytes("utf-8");        //                加密,结果保存进cipherByte        cipherByte = c.doFinal(src);        return parseByte2HexStr(cipherByte);    }    /**     * 对字符串解密     *     * @param str     * @return     * @throws InvalidKeyException     * @throws IllegalBlockSizeException     * @throws BadPaddingException     */    public static String Decryptor(String str) throws InvalidKeyException,            IllegalBlockSizeException, BadPaddingException {        //                根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式        c.init(Cipher.DECRYPT_MODE, deskey);        cipherByte = c.doFinal(parseHexStr2Byte(str));        return new String(cipherByte);    }    /**     * 将16进制转换为二进制     * *  @param  hexStr     * *  @return     */    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;    }    /**     * 将二进制转换成16进制     *     * @param buf     * @return     */    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();    }}

2、添加密码加解密

public static byte[] decrypt(byte[] content, String password) {        try {                 KeyGenerator kgen = KeyGenerator.getInstance("AES");                 kgen.init(128, new SecureRandom(password.getBytes()));                 SecretKey secretKey = kgen.generateKey();                 byte[] enCodeFormat = secretKey.getEncoded();                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");                            Cipher cipher = Cipher.getInstance("AES");// 创建密码器                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化                byte[] result = cipher.doFinal(content);                return result; // 加密        } catch (NoSuchAlgorithmException e) {                e.printStackTrace();        } catch (NoSuchPaddingException e) {                e.printStackTrace();        } catch (InvalidKeyException e) {                e.printStackTrace();        } catch (IllegalBlockSizeException e) {                e.printStackTrace();        } catch (BadPaddingException e) {                e.printStackTrace();        }        return null;}

 3、由于每次启动服务生产的

SecretKey secretKey = kgen.generateKey(); 会变 所以在 下边初始化时就将key写死。
package com.qlkj.hzd.commom.utils;import com.alibaba.fastjson.JSONObject;import javax.crypto.*;import java.io.UnsupportedEncodingException;import java.security.*;/** * RSA相关工具类 * * @author vampire * @date 2018/10/12 下午5:33 */public class EncrypAES {    //KeyGenerator 提供对称密钥生成器的功能,支持各种算法    private static KeyGenerator keygen;    //SecretKey   负责保存对称密钥    private static SecretKey deskey = new SecretKey() {        @Override        public String getAlgorithm() {            return "AES";        }        @Override        public String getFormat() {            return "RAW";        }        @Override        public byte[] getEncoded() {            MessageDigest md = null;            byte[] thedigest = null;            try {                md = MessageDigest.getInstance("MD5");                thedigest = md.digest("pe1mUKtDZWxX2O41ea5+Tg==".getBytes("utf-8"));            } catch (NoSuchAlgorithmException e) {                e.printStackTrace();            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }            return thedigest;        }    };    //Cipher负责完成加密或解密工作    private static Cipher c;    //该字节数组负责保存加密的结果    private static byte[] cipherByte;    static {        try {            Security.addProvider(new com.sun.crypto.provider.SunJCE());            //实例化支持DES算法的密钥生成器(算法名称命名需按规定,否则抛出异常)            keygen = KeyGenerator.getInstance("AES");            //生成密钥            //  deskey = keygen.generateKey();            System.out.println(JSONObject.toJSONString(deskey));            //生成Cipher对象,指定其支持的DES算法            c = Cipher.getInstance("AES");        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (NoSuchPaddingException e) {            e.printStackTrace();        }    }    /**     * 对字符串加密     *     * @param str     * @return     * @throws InvalidKeyException     * @throws IllegalBlockSizeException     * @throws BadPaddingException     */    public static String encrytor(String str) throws InvalidKeyException,            IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {        //  根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式        c.init(Cipher.ENCRYPT_MODE, deskey);        byte[] src = str.getBytes("utf-8");        //                加密,结果保存进cipherByte        cipherByte = c.doFinal(src);        return parseByte2HexStr(cipherByte);    }    /**     * 对字符串解密     *     * @param str     * @return     * @throws InvalidKeyException     * @throws IllegalBlockSizeException     * @throws BadPaddingException     */    public static String decryptor(String str) throws InvalidKeyException,            IllegalBlockSizeException, BadPaddingException {        //                根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式        c.init(Cipher.DECRYPT_MODE, deskey);        cipherByte = c.doFinal(parseHexStr2Byte(str));        return new String(cipherByte);    }    /**     * 将16进制转换为二进制     * *  @param  hexStr     * *  @return     */    private 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;    }    /**     * 将二进制转换成16进制     *     * @param buf     * @return     */    private 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();    }}

 

转载于:https://www.cnblogs.com/likun10579/p/9783259.html

你可能感兴趣的文章
SVN 版本服务器搭配全过程详解(含服务端、客户端)
查看>>
linux下jenkins安装
查看>>
Unique Paths I,II
查看>>
Sparql语言模型(一)
查看>>
Mac之安装zsh
查看>>
Node.js 8有哪些重要功能和修复?
查看>>
Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐)...
查看>>
各类软件注冊码
查看>>
Looking deeper into SQL Server using Minidumps
查看>>
Hexo+Github搭建博客
查看>>
HDU 4667 Building Fence(求凸包的周长)
查看>>
Linux LVM(逻辑卷管理)
查看>>
我们终将死去,这难道不够美好吗?
查看>>
画删除线的方法,如何找替代方法,Deprecated注释
查看>>
最新最全的iOS手机支付总结
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
查看>>
[程序猿面试题精选100题]11.求二叉查找树的镜像
查看>>
hdu 5269 ZYB loves Xor I &amp;&amp; BestCoder Round #44
查看>>
最快的方式清除Chrome浏览器DNS缓存
查看>>