android 数据安全中常用的加密算法 AES

来源:互联网 发布:ubuntu 丢失windows 编辑:程序博客网 时间:2024/05/24 06:55

        AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
       严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。
       因此,在当前阶段来说,AES加密是非常安全的,因此可以用来对我们的敏感数据进行加密,下面给出Android平台下AES加密的代码实现。需要注意的是,在4.2以上的版本中,SecureRandom实例的获取方式发生了变化,因此为了兼容高版本,添加了版本判断。

import android.annotation.SuppressLint;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;/** * ******************************************************** * AES加密 * ******************************************************** * Created by wang on 16/8/9. */@SuppressLint("TrulyRandom")public class Aes {    //密钥    public final static String secretKey = "你的秘钥";    //    private final static String HEX = "0123456789ABCDEF";    //android 4.2    private final static int JELLY_BEAN_4_2 = 17;    /**     * AES加密     *     * @param plainText 待加密文本     * @return     * @throws Exception     */    public static String encrypt(String plainText) throws Exception {        return encrypt(secretKey, plainText);    }    /**     * 加密     *     * @param secretKey 密钥     * @param plainText 待加密文本     * @return     * @throws Exception     */    public static String encrypt(String secretKey, String plainText) throws Exception {        byte[] rawKey = getRawKey(secretKey.getBytes());        byte[] result = encrypt(rawKey, plainText.getBytes());        return toHex(result);    }    /**     * AES解密     *     * @param encryptText 待揭秘文本     * @return     * @throws Exception     */    public static String decrypt(String encryptText) throws Exception {        return decrypt(secretKey, encryptText);    }    /**     * 解密     *     * @param secretKey   密钥     * @param encryptText 待揭秘文本     * @return     * @throws Exception     */    public static String decrypt(String secretKey, String encryptText) throws Exception {        byte[] rawKey = getRawKey(secretKey.getBytes());        byte[] enc = toByte(encryptText);        byte[] result = decrypt(rawKey, enc);        return new String(result);    }    /**     * 获取256位的加密密钥     *     * @param seed     * @return     * @throws Exception     */    @SuppressLint("TrulyRandom")    private static byte[] getRawKey(byte[] seed) throws Exception {        KeyGenerator kgen = KeyGenerator.getInstance("AES");        SecureRandom sr = null;        // 在4.2以上版本中,SecureRandom获取方式发生了改变        if (android.os.Build.VERSION.SDK_INT >= JELLY_BEAN_4_2) {            sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");        } else {            sr = SecureRandom.getInstance("SHA1PRNG");        }        sr.setSeed(seed);        // 256 bits or 128 bits,192bits        kgen.init(256, sr);        SecretKey skey = kgen.generateKey();        byte[] raw = skey.getEncoded();        return raw;    }    /**     * 真正的加密过程     *     * @param key     * @param src     * @return     * @throws Exception     */    private static byte[] encrypt(byte[] key, byte[] src) throws Exception {        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");        Cipher cipher = Cipher.getInstance("AES");        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);        byte[] encrypted = cipher.doFinal(src);        return encrypted;    }    /**     * 真正的解密过程     *     * @param key     * @param encrypted     * @return     * @throws Exception     */    private static byte[] decrypt(byte[] key, byte[] encrypted)            throws Exception {        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");        Cipher cipher = Cipher.getInstance("AES");        cipher.init(Cipher.DECRYPT_MODE, skeySpec);        byte[] decrypted = cipher.doFinal(encrypted);        return decrypted;    }    public static String toHex(String txt) {        return toHex(txt.getBytes());    }    public static String fromHex(String hex) {        return new String(toByte(hex));    }    public static byte[] toByte(String hexString) {        int len = hexString.length() / 2;        byte[] result = new byte[len];        for (int i = 0; i < len; i++)            result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),                    16).byteValue();        return result;    }    public static String toHex(byte[] buf) {        if (buf == null)            return "";        StringBuffer result = new StringBuffer(2 * buf.length);        for (int i = 0; i < buf.length; i++) {            appendHex(result, buf[i]);        }        return result.toString();    }    private static void appendHex(StringBuffer sb, byte b) {        sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));    }
0 0
原创粉丝点击