1. 程式人生 > >工具篇——AESCBCUtil(用於AES加密解密)

工具篇——AESCBCUtil(用於AES加密解密)

寫程式碼的四點:

     1.明確需求。要做什麼?

     2.分析思路。要怎麼做?(1,2,3……)

     3.確定步驟。每一個思路要用到哪些語句、方法和物件。

     4.程式碼實現。用具體的語言程式碼將思路實現出來。

學習新技術的四點:

     1.該技術是什麼?

     2.該技術有什麼特點?(使用需注意的方面)

     3.該技術怎麼使用?(寫Demo)

     4.該技術什麼時候用?(在Project中的使用場景 )

----------------------早計劃,早準備,早完成。-------------------------

程式碼如下:

package com.wy.test.other;

import java.util.Locale;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES加密解密字串工具類
 * 概述:AES高階加密標準,是對稱金鑰加密中最流行的演算法之一;
 *       工作模式包括:ECB、CBC、CTR、OFB、CFB;
 * 使用範圍:該工具類僅支援CBC模式下的:
 *              填充:PKCS7PADDING
 *              資料塊:128位
 *              密碼(key):32位元組長度(例如:12345678901234567890123456789012)
 *              偏移量(iv):16位元組長度(例如:1234567890123456)
 *              輸出:hex
 *              字符集:UTF-8
 * 使用方式:String encrypt = AESCBCUtil.encrypt("wy");
 *           String decrypt = AESCBCUtil.decrypt(encrypt);
 * 驗證方式:http://tool.chacuo.net/cryptaes(線上AES加密解密)
 */
public class AESCBCUtil {

    //密碼
    private static final String key = "12345678901234567890123456789012";
    //iv偏移量
    private static final String iv = "1234567890123456";

    /**
     * 加密:對字串進行加密,並返回十六進位制字串(hex)
     *
     * @param encryptStr 需要加密的字串
     * @return 加密後的十六進位制字串(hex)
     */
    public static String encrypt(String encryptStr) {
        try {
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);

            byte[] encrypted = cipher.doFinal(encryptStr.getBytes());

            return byte2HexStr(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    /**
     * 解密:對加密後的十六進位制字串(hex)進行解密,並返回字串
     *
     * @param encryptedStr 需要解密的,加密後的十六進位制字串
     * @return 解密後的字串
     */
    public static String decrypt(String encryptedStr) {
        try {
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");


            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7PADDING");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);

            byte[] bytes = hexStr2Bytes(encryptedStr);
            byte[] original = cipher.doFinal(bytes);

            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    /**
     * 十六進位制字串轉換為byte[]
     *
     * @param hexStr 需要轉換為byte[]的字串
     * @return 轉換後的byte[]
     */
    public static byte[] hexStr2Bytes(String hexStr) {
        /*對輸入值進行規範化整理*/
        hexStr = hexStr.trim().replace(" ", "").toUpperCase(Locale.US);
        //處理值初始化
        int m = 0, n = 0;
        int iLen = hexStr.length() / 2; //計算長度
        byte[] ret = new byte[iLen]; //分配儲存空間

        for (int i = 0; i < iLen; i++) {
            m = i * 2 + 1;
            n = m + 1;
            ret[i] = (byte) (Integer.decode("0x" + hexStr.substring(i * 2, m) + hexStr.substring(m, n)) & 0xFF);
        }
        return ret;
    }

    /**
     * byte[]轉換為十六進位制字串
     *
     * @param bytes 需要轉換為字串的byte[]
     * @return 轉換後的十六進位制字串
     */
    public static String byte2HexStr(byte[] bytes) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < bytes.length; n++) {
            stmp = (Integer.toHexString(bytes[n] & 0XFF));
            if (stmp.length() == 1)
                hs = hs + "0" + stmp;
            else
                hs = hs + stmp;
        }
        return hs;
    }
}

在專案中的應用:

//加密
        String encrypt;
//        encrypt = AESCBCUtil.encrypt("1234567890");
//        encrypt = AESCBCUtil.encrypt("中華人民共和國");
//        encrypt = AESCBCUtil.encrypt("abcdefg");
//        encrypt = AESCBCUtil.encrypt("ABCDEFG");
        encrypt = AESCBCUtil.encrypt("{\"msg_type_value\":\"1111111\",\"msg_sdk\":\"zq\",\"msg_type\":\"1\"}");
        LogUtil.e("AESCBCUtil加密結果", encrypt + "");

        //解密
        String decrypt = AESCBCUtil.decrypt(encrypt);
        LogUtil.e("AESCBCUtil解密結果", decrypt);