android加密aes

来源:互联网 发布:nba球员场均数据排名 编辑:程序博客网 时间:2024/06/15 12:05

这是一个AES的加密和解密的工具类


import android.util.Base64;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;/** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化; */public class AESUtil {    /*    * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。    */    private String sKey = "HrbyzkjForGzcxy8";//key,可自行修改    private String ivParameter = "1298458753216582";//偏移量,可自行修改    private static AESUtil instance = null;    private AESUtil() {    }    public static AESUtil getInstance() {        if (instance == null)            instance = new AESUtil();        return instance;    }    // 加密    public String encrypt(String clearText)  {        byte[] encrypted = null;        try {            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");            byte[] rawKey = sKey.getBytes();//            byte[] rawKey = getRawKey(sKey.getBytes());            SecretKeySpec keySpec = new SecretKeySpec(rawKey, "AES");            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度            cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);            encrypted = cipher.doFinal(clearText.getBytes("utf-8"));        } catch (Exception e) {            e.printStackTrace();        }        return Base64.encodeToString(encrypted, Base64.DEFAULT);// 此处使用BASE64做转码。    }    public static String encrypt(String clearText, String secretKey, String vector) {        byte[] encrypted = null;        try {            if (secretKey == null) {                return null;            }            if (secretKey.length() != 16) {                return null;            }            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");            byte[] raw = secretKey.getBytes();            SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");            IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度            cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);            encrypted = cipher.doFinal(clearText.getBytes("utf-8"));        } catch (Exception e) {            e.printStackTrace();        }        return Base64.encodeToString(encrypted, Base64.DEFAULT);// 此处使用BASE64做转码。    }    // 解密    public String decrypt(String cipherText) {        try {            byte[] raw = sKey.getBytes("ASCII");            SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());            cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);            byte[] encrypted1 = Base64.decode(cipherText, Base64.DEFAULT);// 先用base64解密            byte[] original = cipher.doFinal(encrypted1);            return new String(original, "utf-8");        } catch (Exception ex) {            return null;        }    }    public String decrypt(String cipherText, String key, String ivs) {        try {            byte[] raw = key.getBytes("ASCII");            SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");            IvParameterSpec iv = new IvParameterSpec(ivs.getBytes());            cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);            byte[] encrypted1 = Base64.decode(cipherText, Base64.DEFAULT);// 先用base64解密            byte[] original = cipher.doFinal(encrypted1);            return new String(original, "utf-8");        } catch (Exception ex) {            return null;        }    }    public static String encodeBytes(byte[] bytes) {        StringBuilder strBuf = new StringBuilder();        for (byte aByte : bytes) {            strBuf.append((char) (((aByte >> 4) & 0xF) + ((int) 'a')));            strBuf.append((char) (((aByte) & 0xF) + ((int) 'a')));        }        return strBuf.toString();    }    /**     * 生成密钥     *     * @param seed 种子     * @return 密钥     * @throws Exception     */    private static byte[] getRawKey(byte[] seed) throws Exception {        KeyGenerator keygen = KeyGenerator.getInstance("AES");        //for android        SecureRandom sr;        // 在4.2以上版本中,SecureRandom获取方式发生了改变        if (android.os.Build.VERSION.SDK_INT >= 17) {            sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");        } else {            sr = SecureRandom.getInstance("SHA1PRNG");        }        sr.setSeed(seed);        keygen.init(128, sr);        SecretKey sKey = keygen.generateKey();        return sKey.getEncoded();    }}


1 0