• 对称加密算法


    package com.kaishengit.security;
    
    import java.security.Key;
    import java.security.SecureRandom;
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.DESedeKeySpec;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.PBEParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import org.apache.commons.codec.binary.Hex;
    
    /**
     * 对称加密帮助类
     * @author kdj
     * 创建时间:2018年4月12日
     */
    public class SymmetricUtil {
    
        public static void main(String[] args) {
            try {
                String pas = "要加密的字符串!!";
                
                //DES
                String keyVal = getKeyStrByType("DES");
                //加密
                String desStr = DESEncode(pas, keyVal);
                System.out.println("DES encode:"+desStr);
                //解密
                System.out.println("DES decode:"+DESDecode(desStr, keyVal));
                
                //DES3
                keyVal = getKeyStrByType("DESede");
                //加密
                desStr = DES3Encode(pas, keyVal);
                System.out.println("DES3 encode:"+desStr);
                //解密
                System.out.println("DES3 decode:"+DES3Decode(desStr, keyVal));
                
                //AES
                keyVal = getKeyStrByType("AES");
                //加密
                desStr = AESEncode(pas, keyVal);
                System.out.println("AES encode:"+desStr);
                //解密
                System.out.println("AES decode:"+AESDecode(desStr, keyVal));
                
                //PBE
                SecureRandom random = new SecureRandom();
                byte[] salt = random.generateSeed(8);
                String saltStr = Hex.encodeHexString(salt);
                String password = "qwertyuiop";
                //加密
                desStr = PBEEncode(pas, saltStr, password);
                System.out.println("PBE encode:"+desStr);
                //解密
                System.out.println("PBE decode:"+PBEDecode(desStr, saltStr, password));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        /**
         * DES加密
         * @param pas
         * @param keyVal
         * @return
         * @throws Exception
         */
        public static String DESEncode(String pas,String keyVal) throws Exception{
            byte[] keyArr = Hex.decodeHex(keyVal);
            //key的转换
            DESKeySpec desKeySpec = new DESKeySpec(keyArr);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            Key converSecretKey = secretKeyFactory.generateSecret(desKeySpec);
            //进行加密
            //加密的格式
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, converSecretKey);
            byte[] result = cipher.doFinal(pas.getBytes());
            return Hex.encodeHexString(result);
        }
        
        /**
         * DES解密
         * @param pas
         * @param keyVal
         * @return
         * @throws Exception
         */
        public static String DESDecode(String pas,String keyVal) throws Exception{
            //解密
            byte[] keyArr = Hex.decodeHex(keyVal);
            //key的转换
            DESKeySpec desKeySpec = new DESKeySpec(keyArr);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            Key converSecretKey = secretKeyFactory.generateSecret(desKeySpec);
            
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.DECRYPT_MODE, converSecretKey);
            byte[] result = cipher.doFinal(Hex.decodeHex(pas));
            return new String(result);
        }
        
        /**
         * DES3加密
         * @param pas
         * @param keyVal
         * @return
         * @throws Exception
         */
        public static String DES3Encode(String pas,String keyVal) throws Exception{
            byte[] keyArr = Hex.decodeHex(keyVal);
            //key的转换
            DESedeKeySpec desKeySpec = new DESedeKeySpec(keyArr);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");
            Key converSecretKey = secretKeyFactory.generateSecret(desKeySpec);
            //进行加密
            //加密的格式
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, converSecretKey);
            byte[] result = cipher.doFinal(pas.getBytes());
            return Hex.encodeHexString(result);
        }
        
        /**
         * DES3解密
         * @param pas
         * @param keyVal
         * @return
         * @throws Exception
         */
        public static String DES3Decode(String pas,String keyVal) throws Exception{
            //解密
            byte[] keyArr = Hex.decodeHex(keyVal);
            //key的转换
            DESedeKeySpec desKeySpec = new DESedeKeySpec(keyArr);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");
            Key converSecretKey = secretKeyFactory.generateSecret(desKeySpec);
            
            Cipher cipher = Cipher.getInstance("DESede");
            cipher.init(Cipher.DECRYPT_MODE, converSecretKey);
            byte[] result = cipher.doFinal(Hex.decodeHex(pas));
            return new String(result);
        }
        
        /**
         * AES的加密
         * @param pas
         * @param keyVal
         * @return
         * @throws Exception
         */
        public static String AESEncode(String pas,String keyVal) throws Exception{
            Key key = new SecretKeySpec(Hex.decodeHex(keyVal), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result = cipher.doFinal(pas.getBytes());
            String resultStr = Hex.encodeHexString(result);
            return resultStr;
        }
        
        /**
         * AES的解密
         * @param pas
         * @param keyVal
         * @return
         * @throws Exception
         */
        public static String AESDecode(String pas,String keyVal) throws Exception{
            Key key = new SecretKeySpec(Hex.decodeHex(keyVal), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] result = cipher.doFinal(Hex.decodeHex(pas));
            return new String(result);
        }
        
        /**
         * PBE加密
         * @param val 要加密的字符串
         * @param keyVal 密钥
         * @param salt 盐
         * @param password 口令
         * @return
         * @throws Exception
         */
        public static String PBEEncode(String val,String salt,String password) throws Exception{
            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            Key key = factory.generateSecret(pbeKeySpec);
            
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(Hex.decodeHex(salt), 100);
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            cipher.init(Cipher.ENCRYPT_MODE, key,pbeParameterSpec);
            byte[] bytes = cipher.doFinal(val.getBytes());
            return Hex.encodeHexString(bytes);
        }
        
        /**
         * PBE解密
         * @param val 要解密的字符串
         * @param keyVal 秘钥
         * @param salt 盐
         * @param password 口令
         * @return
         * @throws Exception
         */
        public static String PBEDecode(String val,String salt,String password) throws Exception{
            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            Key key = factory.generateSecret(pbeKeySpec);
            //解密
            PBEParameterSpec pbeParameterSpec2 = new PBEParameterSpec(Hex.decodeHex(salt), 100);
            Cipher cipher2 = Cipher.getInstance("PBEWITHMD5andDES");
            cipher2.init(Cipher.DECRYPT_MODE, key,pbeParameterSpec2);
            byte[] bytes2 = cipher2.doFinal(Hex.decodeHex(val));
            return new String(bytes2);
        }
        
        /**
         * DES和AES生成的KEY
         * @param type
         * @return
         * @throws Exception
         */
        public static String getKeyStrByType(String type) throws Exception{
            //生成key
            KeyGenerator keyGenerator = KeyGenerator.getInstance(type);
            //生成默认长度的key
            keyGenerator.init(new SecureRandom());
            SecretKey secretKey = keyGenerator.generateKey();
            byte[] bytekey = secretKey.getEncoded();
            return Hex.encodeHexString(bytekey);
        }
        
        
    }
  • 相关阅读:
    文件批量上传
    XML如何不进行解析原样输出
    1456710017
    java标准百分比
    解决SSM项目下静态资源(img、js、css)无法引用的问题
    MySQL查询当天数据以及大量查询时提升速度
    多线程test
    JAVA中等待所有线程都执行结束(转2)
    java中等待所有线程都执行结束
    关于Java多线程(JAVA多线程实现的四种方式)
  • 原文地址:https://www.cnblogs.com/fucktom/p/8854037.html
Copyright © 2020-2023  润新知