Android AES加解密

/**

 * 字节数组转化为大写16进制字符串

 *

 * @param b

 * @return

 */

private static String byte2HexStr(byte[] b) {

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < b.length; i++) {

        String s = Integer.toHexString(b[i] & 0xFF);

        if (s.length() == 1) {

            sb.append("0");

        }



        sb.append(s.toUpperCase());

    }



    return sb.toString();

}



/**

 * 16进制字符串转字节数组

 *

 * @param s

 * @return

 */

private static byte[] str2ByteArray(String s) {

    int byteArrayLength = s.length() / 2;

    byte[] b = new byte[byteArrayLength];

    for (int i = 0; i < byteArrayLength; i++) {

        byte b0 = (byte) Integer.valueOf(s.substring(i * 2, i * 2 + 2), 16)

                .intValue();

        b[i] = b0;

    }



    return b;

}





/**

 * AES 加密

 *

 * @param content  明文

 * @param password 生成秘钥的关键字

 * @return

 */



public static String aesEncrypt(String content, String password) {

    try {

        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());

        SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);

        byte[] encryptedData = cipher.doFinal(content.getBytes(bm));

        // return new String(encryptedData,bm);

        return Base64.encode(encryptedData);

// return byte2HexStr(encryptedData);

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();

    } catch (NoSuchPaddingException e) {

        e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();

    } catch (InvalidKeyException e) {

        e.printStackTrace();

    } catch (IllegalBlockSizeException e) {

        e.printStackTrace();

    } catch (BadPaddingException e) {

        e.printStackTrace();

    } catch (InvalidAlgorithmParameterException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }



    return null;

}



/**

 * AES 解密

 *

 * @param content  密文

 * @param password 生成秘钥的关键字

 * @return

 */



public static String aesDecrypt(String content, String password) {

    try {

        byte[] byteMi = Base64.decode(content);

// byte[] byteMi= str2ByteArray(content);

        IvParameterSpec zeroIv = new IvParameterSpec(VIPARA.getBytes());

        SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);

        byte[] decryptedData = cipher.doFinal(byteMi);

        return new String(decryptedData, "utf-8");

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

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();

    } catch (InvalidAlgorithmParameterException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

    return null;

}

}




Base64



package com.pro.testignore.T20190224.aes;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class Base64 {

private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

        .toCharArray();



public static String encode(byte[] data) {

    int start = 0;

    int len = data.length;

    StringBuffer buf = new StringBuffer(data.length * 3 / 2);



    int end = len - 3;

    int i = start;

    int n = 0;



    while (i <= end) {

        int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8)

                | (((int) data[i + 2]) & 0x0ff);



        buf.append(legalChars[(d >> 18) & 63]);

        buf.append(legalChars[(d >> 12) & 63]);

        buf.append(legalChars[(d >> 6) & 63]);

        buf.append(legalChars[d & 63]);



        i += 3;



        if (n++ >= 14) {

            n = 0;

            buf.append(" ");

        }

    }



    if (i == start + len - 2) {

        int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8);



        buf.append(legalChars[(d >> 18) & 63]);

        buf.append(legalChars[(d >> 12) & 63]);

        buf.append(legalChars[(d >> 6) & 63]);

        buf.append("=");

    } else if (i == start + len - 1) {

        int d = (((int) data[i]) & 0x0ff) << 16;



        buf.append(legalChars[(d >> 18) & 63]);

        buf.append(legalChars[(d >> 12) & 63]);

        buf.append("==");

    }



    return buf.toString();

}



private static int decode(char c) {

    if (c >= 'A' && c <= 'Z')

        return ((int) c) - 65;

    else if (c >= 'a' && c <= 'z')

        return ((int) c) - 97 + 26;

    else if (c >= '0' && c <= '9')

        return ((int) c) - 48 + 26 + 26;

    else

        switch (c) {

            case '+':

                return 62;

            case '/':

                return 63;

            case '=':

                return 0;

            default:

                throw new RuntimeException("unexpected code: " + c);

        }

}



/**

 * Decodes the given Base64 encoded String to a new byte array. The byte

 * array holding the decoded data is returned.

 */



public static byte[] decode(String s) {



    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    try {

        decode(s, bos);

    } catch (IOException e) {

        throw new RuntimeException();

    }

    byte[] decodedBytes = bos.toByteArray();

    try {

        bos.close();

        bos = null;

    } catch (IOException ex) {

        System.err.println("Error while decoding BASE64: " + ex.toString());

    }

    return decodedBytes;

}



private static void decode(String s, OutputStream os) throws IOException {

    int i = 0;



    int len = s.length();



    while (true) {

        while (i < len && s.charAt(i) <= ' ')

            i++;



        if (i == len)

            break;



        int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6)

                + (decode(s.charAt(i + 3)));



        os.write((tri >> 16) & 255);

        if (s.charAt(i + 2) == '=')

            break;

        os.write((tri >> 8) & 255);

        if (s.charAt(i + 3) == '=')

            break;

        os.write(tri & 255);



        i += 4;

    }

}

}




 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值