工具篇——AESCBCUtil(用於AES加密解密)
阿新 • • 發佈:2019-01-10
寫程式碼的四點:
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);