AES工具加密

来源:互联网 发布:钢铁力量六级车数据 编辑:程序博客网 时间:2024/05/22 06:46



AES加密类


package com.pohoocredit.profitcard.backend.utils;import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;/** * @desc: * @Author:li_shuai * @date:Create on 2017/9/15 16:25 */public class AESEncipher {    /**     * AES加密字符串     *     * @param content     *            需要被加密的字符串     * @param salt     *            加密需要的密码     * @return 密文     */    public static byte[] encrypt(String content, String salt) {        try {            KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者            kgen.init(128, new SecureRandom(salt.getBytes()));// 利用用户密码作为随机数初始化出            // 128位的key生产者            //加密没关系,SecureRandom是生成安全随机数序列,salt.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行            SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥            byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回            // null。            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥            Cipher cipher = Cipher.getInstance("AES");// 创建密码器            byte[] byteContent = content.getBytes("utf-8");            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器            byte[] result = cipher.doFinal(byteContent);// 加密            return result;        } catch (NoSuchPaddingException e) {            e.printStackTrace();        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (InvalidKeyException e) {            e.printStackTrace();        } catch (IllegalBlockSizeException e) {            e.printStackTrace();        } catch (BadPaddingException e) {            e.printStackTrace();        }        return null;    }    /**     * 解密AES加密过的字符串     *     * @param content     *            AES加密过过的内容     * @param salt     *            加密时的密码     * @return 明文     */    public static byte[] decrypt(byte[] content, String salt) {        try {            KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者            kgen.init(128, new SecureRandom(salt.getBytes()));            SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥            byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥            Cipher cipher = Cipher.getInstance("AES");// 创建密码器            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密模式的密码器            byte[] result = cipher.doFinal(content);            return result; // 明文        } 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();        }        return null;    }    /**     * 将加密后的返回结果进行base编码     * @param content     * @param salt     * @return     */    public static String encodeSecretKey(String content,String salt) {        byte[] bytes = AESEncipher.encrypt(content, salt);        return Base64Encipher.encodeToStr(bytes);    }    /**     * 将base64编码的结果返回,转码为加密前的结果     * @param content     * @param salt     * @return     */    public static String decodeSecretKey(String content,String salt) {        byte[] decode = Base64Encipher.decode(content);        byte[] decrypt = AESEncipher.decrypt(decode, salt);        return new String(decrypt);    }    public static void main(String... args) {        System.out.println(AESEncipher.encodeSecretKey("123456你好", "kuaixin"));        System.out.println(AESEncipher.decodeSecretKey("fCog/HjpMlQtQrOWbxKL7g==","kuaixin"));    }}



Base64类


package com.pohoocredit.profitcard.backend.utils;import java.io.*;/** * @desc: * @Author:li_shuai * @date:Create on 2017/9/15 17:17 */public class Base64Encipher {    public Base64Encipher() {    }    /**     * 功能:编码字符串     *     * @author      * @date 2017年09月13日     * @param data     *  源字符串     * @return String     */    public static String encodeToStr(byte[] data) {        return new String(encode(data));    }    /**     * 功能:解码字符串     *     * @author      * @date 2017年09月13日     * @param data     *  源字符串     * @return String     */    public static byte[] decode(String data) {        return decode(data.toCharArray());    }    /**     * 功能:编码byte[]     *     * @author      * @date 2017年09月13日     * @param data     *  源     * @return char[]     */    public static char[] encode(byte[] data) {        char[] out = new char[((data.length + 2) / 3) * 4];        for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {            boolean quad = false;            boolean trip = false;            int val = (0xFF & (int) data[i]);            val <<= 8;            if ((i + 1) < data.length) {                val |= (0xFF & (int) data[i + 1]);                trip = true;            }            val <<= 8;            if ((i + 2) < data.length) {                val |= (0xFF & (int) data[i + 2]);                quad = true;            }            out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];            val >>= 6;            out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];            val >>= 6;            out[index + 1] = alphabet[val & 0x3F];            val >>= 6;            out[index + 0] = alphabet[val & 0x3F];        }        return out;    }    /**     * 功能:解码     *     * @author      * @date 2017年09月13日     * @param data     *  编码后的字符数组     * @return byte[]     */    public static byte[] decode(char[] data) {        int tempLen = data.length;        for (int ix = 0; ix < data.length; ix++) {            if ((data[ix] > 255) || codes[data[ix]] < 0) {                --tempLen; // ignore non-valid chars and padding            }        }        // calculate required length:        // -- 3 bytes for every 4 valid base64 chars        // -- plus 2 bytes if there are 3 extra base64 chars,        // or plus 1 byte if there are 2 extra.        int len = (tempLen / 4) * 3;        if ((tempLen % 4) == 3) {            len += 2;        }        if ((tempLen % 4) == 2) {            len += 1;        }        byte[] out = new byte[len];        int shift = 0; // # of excess bits stored in accum        int accum = 0; // excess bits        int index = 0;        // we now go through the entire array (NOT using the 'tempLen' value)        for (int ix = 0; ix < data.length; ix++) {            int value = (data[ix] > 255) ? -1 : codes[data[ix]];            if (value >= 0) { // skip over non-code                accum <<= 6; // bits shift up by 6 each time thru                shift += 6; // loop, with new bits being put in                accum |= value; // at the bottom.                if (shift >= 8) { // whenever there are 8 or more shifted in,                    shift -= 8; // write them out (from the top, leaving any                    out[index++] = // excess at the bottom for next iteration.                            (byte) ((accum >> shift) & 0xff);                }            }        }        // if there is STILL something wrong we just have to throw up now!        if (index != out.length) {            throw new Error("Miscalculated data length (wrote " + index                    + " instead of " + out.length + ")");        }        return out;    }    /**     * 功能:编码文件     *     * @author      * @date 2017年09月13日     * @param file     *  源文件     */    public static void encode(File file) throws IOException {        if (!file.exists()) {            System.exit(0);        }        else {            byte[] decoded = readBytes(file);            char[] encoded = encode(decoded);            writeChars(file, encoded);        }        file = null;    }    /**     * 功能:解码文件。     *     * @author      * @date 2017年09月13日     * @param file     *  源文件     * @throws IOException     */    public static void decode(File file) throws IOException {        if (!file.exists()) {            System.exit(0);        } else {            char[] encoded = readChars(file);            byte[] decoded = decode(encoded);            writeBytes(file, decoded);        }        file = null;    }    //    // code characters for values 0..63    //    private static char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="            .toCharArray();    //    // lookup table for converting base64 characters to value in range 0..63    //    private static byte[] codes = new byte[256];    static {        for (int i = 0; i < 256; i++) {            codes[i] = -1;            // LoggerUtil.debug(i + "&" + codes[i] + " ");        }        for (int i = 'A'; i <= 'Z'; i++) {            codes[i] = (byte) (i - 'A');            // LoggerUtil.debug(i + "&" + codes[i] + " ");        }        for (int i = 'a'; i <= 'z'; i++) {            codes[i] = (byte) (26 + i - 'a');            // LoggerUtil.debug(i + "&" + codes[i] + " ");        }        for (int i = '0'; i <= '9'; i++) {            codes[i] = (byte) (52 + i - '0');            // LoggerUtil.debug(i + "&" + codes[i] + " ");        }        codes['+'] = 62;        codes['/'] = 63;    }    private static byte[] readBytes(File file) throws IOException {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        byte[] b = null;        InputStream fis = null;        InputStream is = null;        try {            fis = new FileInputStream(file);            is = new BufferedInputStream(fis);            int count = 0;            byte[] buf = new byte[16384];            while ((count = is.read(buf)) != -1) {                if (count > 0) {                    baos.write(buf, 0, count);                }            }            b = baos.toByteArray();        } finally {            try {                if (fis != null)                    fis.close();                if (is != null)                    is.close();                if (baos != null)                    baos.close();            } catch (Exception e) {                System.out.println(e);            }        }        return b;    }    private static char[] readChars(File file) throws IOException {        CharArrayWriter caw = new CharArrayWriter();        Reader fr = null;        Reader in = null;        try {            fr = new FileReader(file);            in = new BufferedReader(fr);            int count = 0;            char[] buf = new char[16384];            while ((count = in.read(buf)) != -1) {                if (count > 0) {                    caw.write(buf, 0, count);                }            }        } finally {            try {                if (caw != null)                    caw.close();                if (in != null)                    in.close();                if (fr != null)                    fr.close();            } catch (Exception e) {                System.out.println(e);            }        }        return caw.toCharArray();    }    private static void writeBytes(File file, byte[] data) throws IOException {        OutputStream fos = null;        OutputStream os = null;        try {            fos = new FileOutputStream(file);            os = new BufferedOutputStream(fos);            os.write(data);        } finally {            try {                if (os != null)                    os.close();                if (fos != null)                    fos.close();            } catch (Exception e) {                System.out.println(e);            }        }    }    private static void writeChars(File file, char[] data) throws IOException {        Writer fos = null;        Writer os = null;        try {            fos = new FileWriter(file);            os = new BufferedWriter(fos);            os.write(data);        } finally {            try {                if (os != null)                    os.close();                if (fos != null)                    fos.close();            } catch (Exception e) {                e.printStackTrace();            }        }    }    // /////////////////////////////////////////////////    // end of test code.    // /////////////////////////////////////////////////}

原创粉丝点击