Java加密相关util代码收藏

public class AESUtil {

    // 定义一个私有构造方法
    private AESUtil() {

    }

    // 定义一个静态私有变量(不初始化,不使用final关键字,使用volatile保证了多线程访问时instance变量的可见性,避免了instance初始化时其他变量属性还没赋值完时,被另外线程调用)
    private static volatile AESUtil instance;

    // 定义一个共有的静态方法,返回该类型实例
    public static AESUtil getIstance() {
        // 对象实例化时与否判断(不使用同步代码块,instance不等于null时,直接返回对象,提高运行效率)
        if (instance == null) {
            // 同步代码块(对象未初始化时,使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复被创建)
            synchronized (Md5Util.class) {
                // 未初始化,则初始instance变量
                if (instance == null) {
                    instance = new AESUtil();
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        String content = "test这是我的测试,测试AES加密算法,通信安全,避免被篡改:id=30&times=2342342342343&appid=02938404353543535345345353453453453534534534";  
        String password = "12345678";  
        //加密  
        System.out.println("加密前:" + content);  
        byte[] encryptResult = AESUtil.getIstance().encrypt(content, password);  
        String encryptResultStr = AESUtil.getIstance().parseByte2HexStr(encryptResult);  

        System.out.println("加密后:" + encryptResultStr);  
        System.out.println("加密后:" + encryptResultStr.length());
        //解密  
        byte[] decryptFrom = AESUtil.getIstance().parseHexStr2Byte(encryptResultStr);  
        byte[] decryptResult =AESUtil.getIstance().decrypt(decryptFrom,password);  
        System.out.println("解密后:" + new String(decryptResult));  

        String str = "2790816A347E2C0C9259E180984B2554F48914A70146B92E39FFC2753AEEE23402BB56EFCDA5ABE5EECD809E6CF7D3F36F17E63BA86AD3D8D7130449C272E440";
        byte[] decryptFrom1 = AESUtil.getIstance().parseHexStr2Byte(str);  
        byte[] decryptResult1 =AESUtil.getIstance().decrypt(decryptFrom1,"8e4959d2c40e4123a50e88119e7fc5c7");  
        System.out.println("解密后:" + new String(decryptResult1));  

    }

    /**
     * 将所有参数 通过 AES 加密 (sign,app_id除外);
     * @param params
     * @return
     */
    public Map<String, String> tranToAesData(Map<String, String> params,String tranKey){
        Map<String, String> res = new HashMap<>();
        for (String key : params.keySet()){
            if (key.equals("sign") || key.equals("app_id")){
                res.put(key, params.get(key));
            }else{
                res.put(key, AESUtil.getIstance().commonEncrypt(params.get(key), tranKey));
            }
        }
        return res;
    }

    /**
     * 将所有参数 通过 AES 加密 (sign,app_id除外);
     * @param params
     * @return
     */
    public Map<String, String> tranToDesData(Map<String, String> params,String tranKey){
        Map<String, String> res = new HashMap<>();
        for (String key : params.keySet()){
            if (key.equals("sign") || key.equals("app_id")){
                res.put(key, params.get(key));
            }else{
                res.put(key, AESUtil.getIstance().commonDecrypt(params.get(key), tranKey));
            }
        }
        return res;
    }

    /**
     * 公共加密方法
     * @param content   加密内容
     * @param password  秘钥
     * @return  
     */
    public String commonEncrypt(String content,String password){
        return this.parseByte2HexStr(encrypt(content, password));
    }

    /**
     * 公共解密方法
     * @param content   解密内容
     * @param password  秘钥
     * @return
     */
    public String commonDecrypt(String content, String password){
        return new String(AESUtil.getIstance().decrypt(AESUtil.getIstance().parseHexStr2Byte(content),password));
    }


    /**
     * 加密
     * 
     * @param content
     *            需要加密的内容
     * @param password
     *            加密密码
     * @return
     */
    private byte[] encrypt(String content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" ); 
            secureRandom.setSeed(password.getBytes()); 
            kgen.init(128, secureRandom);

            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return result; // 加密
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解密
     * 
     * @param content
     *            待解密内容
     * @param password
     *            解密密钥
     * @return
     */
    private byte[] decrypt(byte[] content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" ); 
            secureRandom.setSeed(password.getBytes()); 
            kgen.init(128, secureRandom);

            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;
    }

    /**
     * 将二进制转换成16进制
     * 
     * @param buf
     * @return
     */
    private 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();
    }

    /**
     * 将16进制转换为二进制
     * 
     * @param hexStr
     * @return
     */
    private 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值