【java】AES加密解密|及Base64的使用

来源:互联网 发布:域名和ip绑定 编辑:程序博客网 时间:2024/05/19 09:38

转载自:http://www.cnblogs.com/arix04/archive/2009/10/15/1511839.html


AES加解密算法,使用Base64做转码以及辅助加密:

package com.wintv.common;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/******************************************************************************* * AES加解密算法 *  * @author arix04 *  */public class AES {    // 加密    public static String Encrypt(String sSrc, String sKey) throws Exception {        if (sKey == null) {            System.out.print("Key为空null");            return null;        }        // 判断Key是否为16位        if (sKey.length() != 16) {            System.out.print("Key长度不是16位");            return null;        }        byte[] raw = sKey.getBytes();        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);        byte[] encrypted = cipher.doFinal(sSrc.getBytes());        return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。    }    // 解密    public static String Decrypt(String sSrc, String sKey) throws Exception {        try {            // 判断Key是否正确            if (sKey == null) {                System.out.print("Key为空null");                return null;            }            // 判断Key是否为16位            if (sKey.length() != 16) {                System.out.print("Key长度不是16位");                return null;            }            byte[] raw = sKey.getBytes("ASCII");            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");            IvParameterSpec iv = new IvParameterSpec("0102030405060708"                    .getBytes());            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密            try {                byte[] original = cipher.doFinal(encrypted1);                String originalString = new String(original);                return originalString;            } catch (Exception e) {                System.out.println(e.toString());                return null;            }        } catch (Exception ex) {            System.out.println(ex.toString());            return null;        }    }    public static void main(String[] args) throws Exception {        /*         * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定         * 此处使用AES-128-CBC加密模式,key需要为16位。         */        String cKey = "1234567890123456";        // 需要加密的字串        String cSrc = "Email : arix04@xxx.com";        System.out.println(cSrc);        // 加密        long lStart = System.currentTimeMillis();        String enString = AES.Encrypt(cSrc, cKey);        System.out.println("加密后的字串是:" + enString);        long lUseTime = System.currentTimeMillis() - lStart;        System.out.println("加密耗时:" + lUseTime + "毫秒");        // 解密        lStart = System.currentTimeMillis();        String DeString = AES.Decrypt(enString, cKey);        System.out.println("解密后的字串是:" + DeString);        lUseTime = System.currentTimeMillis() - lStart;        System.out.println("解密耗时:" + lUseTime + "毫秒");    }}

AES加解密算法,使用byte2hex做转码:

package com.wintv.common;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/******************************************************************************* * AES加解密算法 *  * @author arix04 *  */public class AES {    // 加密    public static String Encrypt(String sSrc, String sKey) throws Exception {        if (sKey == null) {            System.out.print("Key为空null");            return null;        }        // 判断Key是否为16位        if (sKey.length() != 16) {            System.out.print("Key长度不是16位");            return null;        }        byte[] raw = sKey.getBytes();        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);        byte[] encrypted = cipher.doFinal(sSrc.getBytes());        return byte2hex(encrypted).toLowerCase();    }    // 解密    public static String Decrypt(String sSrc, String sKey) throws Exception {        try {            // 判断Key是否正确            if (sKey == null) {                System.out.print("Key为空null");                return null;            }            // 判断Key是否为16位            if (sKey.length() != 16) {                System.out.print("Key长度不是16位");                return null;            }            byte[] raw = sKey.getBytes("ASCII");            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");            IvParameterSpec iv = new IvParameterSpec("0102030405060708"                    .getBytes());            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);            byte[] encrypted1 = hex2byte(sSrc);            try {                byte[] original = cipher.doFinal(encrypted1);                String originalString = new String(original);                return originalString;            } catch (Exception e) {                System.out.println(e.toString());                return null;            }        } catch (Exception ex) {            System.out.println(ex.toString());            return null;        }    }    public static byte[] hex2byte(String strhex) {        if (strhex == null) {            return null;        }        int l = strhex.length();        if (l % 2 == 1) {            return null;        }        byte[] b = new byte[l / 2];        for (int i = 0; i != l / 2; i++) {            b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2),                    16);        }        return b;    }    public static String byte2hex(byte[] b) {        String hs = "";        String stmp = "";        for (int n = 0; n < b.length; n++) {            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));            if (stmp.length() == 1) {                hs = hs + "0" + stmp;            } else {                hs = hs + stmp;            }        }        return hs.toUpperCase();    }    public static void main(String[] args) throws Exception {        /*         * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定         */        String cKey = "1234567890123456";        // 需要加密的字串        String cSrc = "Email : arix04@xxx.com";        System.out.println(cSrc);        // 加密        long lStart = System.currentTimeMillis();        String enString = AES.Encrypt(cSrc, cKey);        System.out.println("加密后的字串是:" + enString);        long lUseTime = System.currentTimeMillis() - lStart;        System.out.println("加密耗时:" + lUseTime + "毫秒");        // 解密        lStart = System.currentTimeMillis();        String DeString = AES.Decrypt(enString, cKey);        System.out.println("解密后的字串是:" + DeString);        lUseTime = System.currentTimeMillis() - lStart;        System.out.println("解密耗时:" + lUseTime + "毫秒");    }}




0 0
原创粉丝点击