AES解密工具类

package com.cross.bridge.prerecord.util;

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;

/**
 * @Describe: AES解密工具类
 * @Author: Bridge
 * @Date: 2018/5/19
 * @Version: 1.00
 */
public class AES {
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

    private static final String HEXES = "0123456789ABCDEF";

    //16进制字符串转换为字节数组
    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                    + Character.digit(s.charAt(i+1), 16));
        }
        return data;
    }


    public static String byteArrayToHexString( byte [] raw ) {
        if ( raw == null ) {
            return null;
        }
        final StringBuilder hex = new StringBuilder( 2 * raw.length );
        for ( final byte b : raw ) {
            hex.append(HEXES.charAt((b & 0xF0) >> 4))
                    .append(HEXES.charAt((b & 0x0F)));
        }
        return hex.toString();
    }

    //加密
    public static byte[] AES_cbc_encrypt(byte[] srcData,byte[] key)
    {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance(ALGORITHM);

            byte[] iv = Arrays.copyOfRange(key, 0, 16);

            cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv));
            byte[] encData = cipher.doFinal(srcData);
            return encData;
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }

    //解密
    public static byte[] AES_cbc_decrypt(byte[] encData,byte[] key)
    {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
            Cipher cipher = Cipher.getInstance(ALGORITHM);

            byte[] iv = Arrays.copyOfRange(key, 0, 16);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));

            byte[] decbbdt = cipher.doFinal(encData);
            return decbbdt;
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String args[])
    {
        try {
            final String strPlain = "{\"bizSID\":\"1\",\"changedTime\":1521743161,\"desc\":\"新建\",\"sid\":\"-1\",\"status\":0,\"version\":\"1.0\"}";
            final String strPassword = "12345678901234567890123456789012";

            System.out.println("String to Encrypt: " + strPlain);

            String strCipher = byteArrayToHexString(
                    AES_cbc_encrypt(
                            strPlain.getBytes("UTF-8"),
                            strPassword.getBytes("UTF-8")
                    )
            );

            System.out.println("Encrypted: " + strCipher);
            String aesCbcDecrypt = new String(AES_cbc_decrypt(
                    hexStringToByteArray(strCipher),
                    strPassword.getBytes("UTF-8")), "UTF-8");
            System.out.println("Decrypted : " +aesCbcDecrypt);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自my.oschina.net/u/3854850/blog/1818871