美文网首页工具类
数据加密工具类集合

数据加密工具类集合

作者: 无我_无他_有你 | 来源:发表于2022-01-20 09:48 被阅读0次

    1.引入依赖

     <!-- 加密工具包 包含MD5、RSA、AES等加密方式-->
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
            </dependency>
            <dependency>
                <groupId>org.bouncycastle</groupId>
                <artifactId>bcprov-jdk15on</artifactId>
            </dependency>
    

    AES加、解密算法工具类

    package pers.darcy.flower.utils.util;
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import java.nio.charset.StandardCharsets;
    import java.security.SecureRandom;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    /**
     * AES加、解密算法工具类
     */
    public class AESUtil {
        /**
         * 加密算法AES
         */
        private static final String KEY_ALGORITHM = "AES";
    
        /**
         * key的长度,Wrong key size: must be equal to 128, 192 or 256
         * 传入时需要16、24、36
         */
        private static final Integer KEY_LENGTH = 16 * 8;
    
        /**
         * 算法名称/加密模式/数据填充方式
         * 默认:AES/ECB/PKCS5Padding
         */
        private static final String ALGORITHMS = "AES/ECB/PKCS5Padding";
    
        /**
         * 后端AES的key,由静态代码块赋值
         */
        public static String key;
    
        static {
            key = getKey();
        }
    
        /**
         * 获取key
         */
        public static String getKey() {
            StringBuilder uid = new StringBuilder();
            //产生16位的强随机数
            Random rd = new SecureRandom();
            for (int i = 0; i < KEY_LENGTH / 8; i++) {
                //产生0-2的3位随机数
                int type = rd.nextInt(3);
                switch (type) {
                    case 0:
                        //0-9的随机数
                        uid.append(rd.nextInt(10));
                        break;
                    case 1:
                        //ASCII在65-90之间为大写,获取大写随机
                        uid.append((char) (rd.nextInt(25) + 65));
                        break;
                    case 2:
                        //ASCII在97-122之间为小写,获取小写随机
                        uid.append((char) (rd.nextInt(25) + 97));
                        break;
                    default:
                        break;
                }
            }
            return uid.toString();
        }
    
        /**
         * 加密
         *
         * @param content    加密的字符串
         * @param encryptKey key值
         */
        public static String encrypt(String content, String encryptKey) throws Exception {
            //设置Cipher对象
            Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM));
    
            //调用doFinal
            byte[] b = cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
    
            // 转base64
            return Base64.encodeBase64String(b);
    
        }
    
        /**
         * 解密
         *
         * @param encryptStr 解密的字符串
         * @param decryptKey 解密的key值
         */
        public static String decrypt(String encryptStr, String decryptKey) throws Exception {
            //base64格式的key字符串转byte
            byte[] decodeBase64 = Base64.decodeBase64(encryptStr);
    
            //设置Cipher对象
            Cipher cipher = Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));
    
            //调用doFinal解密
            byte[] decryptBytes = cipher.doFinal(decodeBase64);
            return new String(decryptBytes);
        }
    
    
    //    public static void main(String[] args) {
    //        //16位
    //        String key = "MIGfMA0GCSqGSIb3";
    //
    //        //字符串
    //        String str = "huanzi.qch@qq.com:欢子";
    //        try {
    //            //加密
    //            String encrypt = AESUtil.encrypt(str, key);
    //            //解密
    //            String decrypt = AESUtil.decrypt(encrypt, key);
    //            System.out.println("加密前:" + str);
    //            System.out.println("加密后:" + encrypt);
    //            System.out.println("解密后:" + decrypt);
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //        }
    //    }
    
    
        public static void main(String[] args) {
            //16位
            String key = "MIGfMA0GCSqGSIb3";
    
            //复杂对象
            Map<String,Object> userMap = new HashMap<>(2);
            userMap.put("username","123456");
            userMap.put("password","111111");
            try {
                //加密
                String encrypt = AESUtil.encrypt(userMap.toString(), key);
                //解密
                String decrypt = AESUtil.decrypt(encrypt, key);
                System.out.println("加密前:" + userMap.toString());
                System.out.println("加密后:" + encrypt);
                System.out.println("解密后:" + decrypt);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    Base64加密解密 工具类

    package pers.darcy.flower.utils.util;
    
    import org.apache.commons.codec.binary.Base64;
    
    /**
     * Base64加密解密 工具类
     *
     * @author wbw
     * @version 1.0
     * @since 1.0
     */
    public abstract class Base64Util {
    
        /**
         * 字符编码
         */
        private final static String ENCODING = "UTF-8";
    
        /**
         * 方法描述: Base64编码
         *
         * @param data 待编码数据
         * @return java.lang.String
         * @author wqf
         * @date 2022/1/19 11:54
         */
        public static String encode(String data) throws Exception {
    
            // 执行编码
            byte[] b = Base64.encodeBase64(data.getBytes(ENCODING));
    
            return new String(b, ENCODING);
        }
    
    
        /**
         * 方法描述: Base64安全编码<br>
         * 遵循RFC 2045实现
         *
         * @param data 待编码数据
         * @return java.lang.String
         * @author wqf
         * @date 2022/1/19 11:53
         */
        public static String encodeSafe(String data) throws Exception {
    
            // 执行编码
            byte[] b = Base64.encodeBase64(data.getBytes(ENCODING), true);
    
            return new String(b, ENCODING);
        }
    
        /**
         * 方法描述: Base64解码
         *
         * @param data 待解码数据
         * @return java.lang.String
         * @author wqf
         * @date 2022/1/19 11:53
         */
        public static String decode(String data) throws Exception {
            // 执行解码
            byte[] b = Base64.decodeBase64(data.getBytes(ENCODING));
            return new String(b, ENCODING);
        }
    }
    

    DES工具类

    package pers.darcy.flower.utils.util;
    
    import org.apache.commons.codec.binary.Base64;
    import org.bouncycastle.jce.provider.BouncyCastleProvider;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import java.security.Key;
    import java.security.SecureRandom;
    import java.security.Security;
    
    /**
     * DES安全编码组件
     *
     * @author wbw
     * @version 1.0
     */
    public abstract class DESUtil {
        static {
            Security.insertProviderAt(new BouncyCastleProvider(), 1);
        }
    
        //new BouncyCastleProvider();后端加解密中,不能在代码里new BouncyCastleProvider(),JceSecurity. getVerificationResult内部会进行判断,如果是新值,则每次都会put到map中,导致内存缓便被耗尽,程序假死崩溃
       // private static final BouncyCastleProvider BOUNCY_CASTLE_PROVIDER=new BouncyCastleProvider();
    
        /**
         * 密钥算法 <br>
         * Java 6 只支持56bit密钥 <br>
         * Bouncy Castle 支持64bit密钥
         */
        private static final String KEY_ALGORITHM = "DES";
    
        /**
         * 加密/解密算法 / 工作模式 / 填充方式
         */
        private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5PADDING";
    
        /**
         * 转换密钥
         *
         * @param key 二进制密钥
         * @return Key 密钥
         * @throws Exception
         */
        private static Key toKey(byte[] key) throws Exception {
            // 实例化DES密钥材料
            DESKeySpec dks = new DESKeySpec(key);
            // 实例化秘密密钥工厂
            SecretKeyFactory keyFactory = SecretKeyFactory
                    .getInstance(KEY_ALGORITHM);
            // 生成秘密密钥
            return keyFactory.generateSecret(dks);
        }
    
        /**
         * 方法描述: 解密
         *
         * @param data 待解密数据
         * @param key  密钥
         * @return byte[]
         * @author wqf
         * @date 2022/1/19 14:03
         */
        public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    
            // 还原密钥
            Key k = toKey(key);
    
            // 实例化
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    
            // 初始化,设置为解密模式
            cipher.init(Cipher.DECRYPT_MODE, k);
    
            // 执行操作
            return cipher.doFinal(data);
        }
    
        /**
         * 方法描述:  加密
         *
         * @param data 待加密数据
         * @param key  密钥
         * @return byte[]
         * @author wqf
         * @date 2022/1/19 14:03
         */
        public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
            // 还原密钥
            Key k = toKey(key);
            // 实例化
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            // 初始化,设置为加密模式
            cipher.init(Cipher.ENCRYPT_MODE, k);
            // 执行操作
            return cipher.doFinal(data);
        }
    
        /**
         * 方法描述: 生成密钥
         *
         * @return byte[]
         * @author wqf
         * @date 2022/1/19 14:03
         */
        public static byte[] initKey() throws Exception {
            //实例化密钥生成器,若要使用64bit密钥注意替换 将下述代码中的KeyGenerator.getInstance(CIPHER_ALGORITHM);替换为KeyGenerator.getInstance(CIPHER_ALGORITHM, "BC");
            KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            //初始化密钥生成器 若要使用64bit密钥注意替换 将下述代码kg.init(56); 替换为kg.init(64);
            kg.init(56, new SecureRandom());
            // 生成秘密密钥
            SecretKey secretKey = kg.generateKey();
            // 获得密钥的二进制编码形式
            return secretKey.getEncoded();
        }
    
        public static byte[] initKey(String seed) throws Exception {
            KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            SecureRandom secureRandom = new SecureRandom(new Base64().decode(seed));
            kg.init(secureRandom);
            SecretKey secretKey = kg.generateKey();
            return secretKey.getEncoded();
        }
    }
    

    MD5工具类

    package pers.darcy.flower.utils.util;
    
    import org.apache.commons.codec.digest.DigestUtils;
     
    /**
     * MD5加密组件
     * 
     * @author wbw
     * @version 1.0
     * @since 1.0
     */
    public abstract class MD5Util {
    
        /**
         * 方法描述: MD5加密
         *
         * @param data 待加密数据
         * @return byte[]
         * @author wqf
         * @date 2022/1/19 11:54
         */
        public static byte[] encodeMD5(String data) throws Exception {
            // 执行消息摘要
            return DigestUtils.md5(data);
        }
    
        /**
         * 方法描述: MD5加密
         *
         * @param data 待加密数据
         * @return java.lang.String
         * @author wqf
         * @date 2022/1/19 11:54
         */
        public static String encodeMD5Hex(String data) {
            // 执行消息摘要
            return DigestUtils.md5Hex(data);
        }
    }
    

    RSA加、解密算法工具类

    package cn.huanzi.ims.util;
    
    
    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import java.io.ByteArrayOutputStream;
    import java.security.Key;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * RSA加、解密算法工具类
     */
    public class RSAUtil {
    
        /**
         * 加密算法AES
         */
        private static final String KEY_ALGORITHM = "RSA";
    
        /**
         * 算法名称/加密模式/数据填充方式
         * 默认:RSA/ECB/PKCS1Padding
         */
        private static final String ALGORITHMS = "RSA/ECB/PKCS1Padding";
    
        /**
         * Map获取公钥的key
         */
        private static final String PUBLIC_KEY = "publicKey";
    
        /**
         * Map获取私钥的key
         */
        private static final String PRIVATE_KEY = "privateKey";
    
        /**
         * RSA最大加密明文大小
         */
        private static final int MAX_ENCRYPT_BLOCK = 117;
    
        /**
         * RSA最大解密密文大小
         */
        private static final int MAX_DECRYPT_BLOCK = 128;
    
        /**
         * RSA 位数 如果采用2048 上面最大加密和最大解密则须填写:  245 256
         */
        private static final int INITIALIZE_LENGTH = 1024;
    
        /**
         * 后端RSA的密钥对(公钥和私钥)Map,由静态代码块赋值
         */
        private static Map<String, Object> genKeyPair = new HashMap<>();
    
        static {
            try {
                genKeyPair.putAll(genKeyPair());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 生成密钥对(公钥和私钥)
         */
        private static Map<String, Object> genKeyPair() throws Exception {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            keyPairGen.initialize(INITIALIZE_LENGTH);
            KeyPair keyPair = keyPairGen.generateKeyPair();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            Map<String, Object> keyMap = new HashMap<String, Object>(2);
            //公钥
            keyMap.put(PUBLIC_KEY, publicKey);
            //私钥
            keyMap.put(PRIVATE_KEY, privateKey);
            return keyMap;
        }
    
        /**
         * 私钥解密
         *
         * @param encryptedData 已加密数据
         * @param privateKey    私钥(BASE64编码)
         */
        public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
            //base64格式的key字符串转Key对象
            byte[] keyBytes = Base64.decodeBase64(privateKey);
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
    
            //设置加密、填充方式
            /*
                如需使用更多加密、填充方式,引入
                <dependency>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bcprov-jdk16</artifactId>
                    <version>1.46</version>
                </dependency>
                并改成
                Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider());
             */
            Cipher cipher = Cipher.getInstance(ALGORITHMS);
            cipher.init(Cipher.DECRYPT_MODE, privateK);
    
            //分段进行解密操作
            return encryptAndDecryptOfSubsection(encryptedData, cipher, MAX_DECRYPT_BLOCK);
        }
    
        /**
         * 公钥加密
         *
         * @param data      源数据
         * @param publicKey 公钥(BASE64编码)
         */
        public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
            //base64格式的key字符串转Key对象
            byte[] keyBytes = Base64.decodeBase64(publicKey);
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            Key publicK = keyFactory.generatePublic(x509KeySpec);
    
            //设置加密、填充方式
            /*
                如需使用更多加密、填充方式,引入
                <dependency>
                    <groupId>org.bouncycastle</groupId>
                    <artifactId>bcprov-jdk16</artifactId>
                    <version>1.46</version>
                </dependency>
                并改成
                Cipher cipher = Cipher.getInstance(ALGORITHMS ,new BouncyCastleProvider());
             */
            Cipher cipher = Cipher.getInstance(ALGORITHMS);
            cipher.init(Cipher.ENCRYPT_MODE, publicK);
    
            //分段进行加密操作
            return encryptAndDecryptOfSubsection(data, cipher, MAX_ENCRYPT_BLOCK);
        }
    
        /**
         * 获取私钥
         */
        public static String getPrivateKey() {
            Key key = (Key) genKeyPair.get(PRIVATE_KEY);
            return Base64.encodeBase64String(key.getEncoded());
        }
    
        /**
         * 获取公钥
         */
        public static String getPublicKey() {
            Key key = (Key) genKeyPair.get(PUBLIC_KEY);
            return Base64.encodeBase64String(key.getEncoded());
        }
    
        /**
         * 分段进行加密、解密操作
         */
        private static byte[] encryptAndDecryptOfSubsection(byte[] data, Cipher cipher, int encryptBlock) throws Exception {
            int inputLen = data.length;
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int offSet = 0;
            byte[] cache;
            int i = 0;
            // 对数据分段加密
            while (inputLen - offSet > 0) {
                if (inputLen - offSet > encryptBlock) {
                    cache = cipher.doFinal(data, offSet, encryptBlock);
                } else {
                    cache = cipher.doFinal(data, offSet, inputLen - offSet);
                }
                out.write(cache, 0, cache.length);
                i++;
                offSet = i * encryptBlock;
            }
            byte[] toByteArray = out.toByteArray();
            out.close();
            return toByteArray;
        }
    //
    //    public static void main(String[] args) {
    //        //字符串
    //        String str = "huanzi.qch@qq.com:欢子";
    //        try {
    //            System.out.println("私钥:" + RSAUtil.getPrivateKey());
    //            System.out.println("公钥:" + RSAUtil.getPublicKey());
    //
    //            //公钥加密
    //            byte[] ciphertext = RSAUtil.encryptByPublicKey(str.getBytes(), RSAUtil.getPublicKey());
    //            //私钥解密
    //            byte[] plaintext = RSAUtil.decryptByPrivateKey(ciphertext, RSAUtil.getPrivateKey());
    //
    //            System.out.println("公钥加密前:" + str);
    //            System.out.println("公钥加密后:" + Base64.encodeBase64String(ciphertext));
    //            System.out.println("私钥解密后:" + new String(plaintext));
    //        } catch (Exception e) {
    //            e.printStackTrace();
    //        }
    //    }
    
        public static void main(String[] args) {
            //复杂对象
            Map<String,Object> userMap = new HashMap<>(2);
            userMap.put("username","123456");
            userMap.put("password","111111");
            try {
                System.out.println("私钥:" + RSAUtil.getPrivateKey());
                System.out.println("公钥:" + RSAUtil.getPublicKey());
    
                //公钥加密
                byte[] ciphertext = RSAUtil.encryptByPublicKey(userMap.toString().getBytes(), RSAUtil.getPublicKey());
                //私钥解密
                byte[] plaintext = RSAUtil.decryptByPrivateKey(ciphertext, RSAUtil.getPrivateKey());
    
                System.out.println("公钥加密前:" + userMap.toString());
                System.out.println("公钥加密后:" + Base64.encodeBase64String(ciphertext));
                System.out.println("私钥解密后:" + new String(plaintext));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:数据加密工具类集合

        本文链接:https://www.haomeiwen.com/subject/lbcjhrtx.html