zoukankan      html  css  js  c++  java
  • Java加解密工具类

    今天coding的时候需要大数据大佬对接接口,接口用的DES加密 ECB的PKCS5Padding填充方式。从 XXX 看到的都是收费的,我就搞不明白了一个工具类至于收费不,我就有点不开心了。为什么就不能有一个分享的精神,程序员何必为难程序员呢。

    今天我给大家分享三个我自己常用的三个加密工具类吧 。AES、DES、MD5

    AES加密解密工具类返回Base64

    package cn.builder.util;
    import org.apache.commons.codec.binary.Base64;
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    
    public class AESUtil {
        private static final String defaultCharset = "UTF-8";
        private static final String KEY_AES = "AES";
        private static final String KEY_MD5 = "MD5";
        private static MessageDigest md5Digest;
        static {
            try {
                md5Digest = MessageDigest.getInstance(KEY_MD5);
            } catch (NoSuchAlgorithmException e) {
    
            }
        }
    
    
        //加密方法使用示例:
        public static void main(String[] args) throws Exception {
            String key = "KingYiFan";
            String data = "{
    	"name": "",
    	"valid": "",
    	"audioNum": "",
    	"buyNum": "",
    	"usedNum": "",
    	"startDate": "",
    	"endDate": "",
    	"mid": "1",
    	"rid": "1",
    	"code": "1"
    }";
            String encrypted = AESUtil.encrypt(data, key);
            String decrypted = AESUtil.decrypt(encrypted, key);
            System.out.println("加密后的密文
    " + encrypted);
            System.out.println("解密后的报文:
    " + decrypted);
        }
        /**
         * 加密
         *
         * @param data 需要加密的内容
         * @param key 加密密码
         * @return
         */
        public static String encrypt(String data, String key) {
            return doAES(data, key, Cipher.ENCRYPT_MODE);
        }
        /**
         * 解密
         *
         * @param data 待解密内容
         * @param key 解密密钥
         * @return
         */
        public static String decrypt(String data, String key) {
            return doAES(data, key, Cipher.DECRYPT_MODE);
        }
    
    
        /**
         * 加解密
         *
         * @param data
         * @param key
         * @param mode
         * @return
         */
        private static String doAES(String data, String key, int mode) {
            try {
                boolean encrypt = mode == Cipher.ENCRYPT_MODE;
                byte[] content;
                if (encrypt) {
                    content = data.getBytes(defaultCharset);
                } else {
                    content = Base64.decodeBase64(data.getBytes());
                }
                SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset))
                        , KEY_AES);
                Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
                cipher.init(mode, keySpec);// 初始化
                byte[] result = cipher.doFinal(content);
                if (encrypt) {
                    return new String(Base64.encodeBase64(result));
                } else {
                    return new String(result, defaultCharset);
                }
            } catch (Exception e) {
            }
            return null;
        }
    }
    

    DES加密解密工具类(ECB模式填充:PKCS5Padding)

    package cn.builder.utils;
    
    import sun.misc.BASE64Encoder;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import java.security.SecureRandom;
    
    public class DESUtil {
        //密码,长度要是8的倍数    注意此处为简单密码  简单应用 要求不高时可用此密码
        private static String key = "King8888";
    
        /**
         * 加密
         *
         * @param datasource byte[]
         * @param key        String
         * @return byte[]
         */
        private static byte[] encryptByKey(byte[] datasource, String key) {
            try {
                SecureRandom random = new SecureRandom();
    
                DESKeySpec desKey = new DESKeySpec(key.getBytes());
                //创建一个密匙工厂,然后用它把DESKeySpec转换成
                SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
                SecretKey securekey = keyFactory.generateSecret(desKey);
                //Cipher对象实际完成加密操作 ecb模式下面的PKCS5Padding
                Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
                //用密匙初始化Cipher对象
                cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
                //现在,获取数据并加密
                //正式执行加密操作
                return cipher.doFinal(datasource);
            } catch (Throwable e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * @param data
         * @return
         * @throws Exception
         * @Method: encrypt
         * @Description: 加密数据然后转成Base64
         */
        public static String encrypt(String data) {  //对string进行BASE64Encoder转换
            byte[] bt = encryptByKey(data.getBytes(), key);
            BASE64Encoder base64en = new BASE64Encoder();
            String strs = new String(base64en.encode(bt));
            return strs;
        }
    
        /**
         * 解密
         *
         * @param src byte[]
         * @param key String
         * @return byte[]
         * @throws Exception
         */
        private static byte[] decrypt(byte[] src, String key) throws Exception {
            // DES算法要求有一个可信任的随机数源
            SecureRandom random = new SecureRandom();
            // 创建一个DESKeySpec对象
            DESKeySpec desKey = new DESKeySpec(key.getBytes());
            // 创建一个密匙工厂
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            // 将DESKeySpec对象转换成SecretKey对象
            SecretKey securekey = keyFactory.generateSecret(desKey);
            // Cipher对象实际完成解密操作
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            // 用密匙初始化Cipher对象
            cipher.init(Cipher.DECRYPT_MODE, securekey, random);
            // 真正开始解密操作
            return cipher.doFinal(src);
        }
    
        /**
         * @param data
         * @return
         * @throws Exception
         * @Method: decryptor
         * @Description: 从Base64解密 在Des解密数据
         */
        public static String decryptor(String data) throws Exception {  //对string进行BASE64Encoder转换
            sun.misc.BASE64Decoder base64en = new sun.misc.BASE64Decoder();
            byte[] bt = decrypt(base64en.decodeBuffer(data), key);
            String strs = new String(bt);
            return strs;
        }
    
        //测试
        public static void main(String args[]) {
            //待加密内容
            String str = "a=a01&&u=sa0keweid&&f=F002&&k=C0283&&t=20180801134532";
            //加密串
            String result = DESUtil.encrypt(str);
            System.out.println("加密后:" + result);
            try {
                //直接将如上内容解密
                String decryResult = DESUtil.decryptor(result);
                System.out.println("解密后:" + new String(decryResult));
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }
    

    MD5工具类(不可逆,但是据听说某教授给解开了。)

    package cn.builder.utils;
    
    import java.security.MessageDigest;
    
    import static java.nio.charset.StandardCharsets.UTF_8;
    
    public class MD5Util {
    
        private static final String HEX_DIGITS[] = {"0", "1", "2", "3", "4", "5",
                "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
    
        public static String md5Encode(String origin, String charsetname) {
            String resultString = null;
            try {
                resultString = origin;
                MessageDigest md = MessageDigest.getInstance("MD5");
                if (charsetname == null || "".equals(charsetname))
                    resultString = byteArrayToHexString(md.digest(resultString
                            .getBytes(UTF_8)));
                else
                    resultString = byteArrayToHexString(md.digest(resultString
                            .getBytes(charsetname)));
            } catch (Exception e) {
                e.printStackTrace();
            }
            return resultString;
        }
    
        private static String byteArrayToHexString(byte b[]) {
            StringBuffer resultSb = new StringBuffer();
            for (int i = 0; i < b.length; i++)
                resultSb.append(byteToHexString(b[i]));
    
            return resultSb.toString();
        }
    
        private static String byteToHexString(byte b) {
            int n = b;
            if (n < 0)
                n += 256;
            int d1 = n / 16;
            int d2 = n % 16;
            return HEX_DIGITS[d1] + HEX_DIGITS[d2];
        }
    
    }
    

    声明:以上三个工具类我已经亲测可用使用。有什么问题随时可用扣我。


    鼓励作者写出更好的技术文档,就请我喝一瓶哇哈哈哈哈哈哈哈。。

    微信:

    支付宝:


    感谢一路支持我的人。。。。。
    
    Love me and hold me
    QQ:69673804(16年老号)
    EMAIL:69673804@qq.com
    友链交换
    如果有兴趣和本博客交换友链的话,请按照下面的格式在评论区进行评论,我会尽快添加上你的链接。
    

    网站名称:KingYiFan’S Blog
    网站地址:http://blog.cnbuilder.cn
    网站描述:年少是你未醒的梦话,风华是燃烬的彼岸花。
    网站Logo/头像: [头像地址](https://blog.cnbuilder.cn/upload/2018/7/avatar20180720144536200.jpg)
    
  • 相关阅读:
    日常点滴
    Django基础之forms组件中的ModelForm组件
    你想了解的轮询、长轮询和websocket都在这里了
    python并发编程之协程
    聊聊五大IO模型
    python并发编程之线程
    网络编程
    python并发编程之进程
    python中的异常处理
    flask实现文件的上传
  • 原文地址:https://www.cnblogs.com/kingyifan/p/11721445.html
Copyright © 2011-2022 走看看