1. 程式人生 > >Java中的AES加解密工具類:AESUtils

Java中的AES加解密工具類:AESUtils

.com asc += for frame day 換行 fault mod

本人手寫已測試,大家可以參考使用

package com.mirana.frame.utils.encrypt;

import com.mirana.frame.constants.SysConstants;
import com.mirana.frame.utils.RandomUtils;
import com.mirana.frame.utils.SysPropUtils;
import com.mirana.frame.utils.encrypt.enumtype.AESMode;
import com.mirana.frame.utils.encrypt.enumtype.Algorithm;
import com.mirana.frame.utils.encrypt.enumtype.Padding; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.Charset;
import java.security.Security; /** * AES加解密工具類 */ public class AESUtils { // u8 charset protected static final Charset CHARSET_U8 = SysConstants.DEFAULT_CHARSET; // u8 string protected static final String CHARSET_U8_STR = SysConstants.DEFAULT_CHARSET_NAME; // 換行 protected static
final String NEXTLINE = SysPropUtils.LINE_SEPARATOR; /** * AES加密 * * @param algorithm 加密算法 * @param aesMode 加密模式 * @param padding 補碼方式 * @param serectKey 秘鑰 * @param ivKey 向量偏移量 * @param content 要加密的文本 * @return */ public static String encrypt (Algorithm algorithm, AESMode aesMode, Padding padding, String serectKey, String ivKey, String content) { // 加密模式 String encryptMode = algorithm.getValue() + "/" + aesMode.getValue() + "/" + padding.getValue(); StringBuffer encryptStr = new StringBuffer(); encryptStr.append("--------- [ Encrypt ] 加密算法:" + encryptMode + " ----------"); encryptStr.append(NEXTLINE); encryptStr.append("--------- [ Encrypt ] 算法:" + algorithm.getValue() + ", 加密模式:" + aesMode.getValue() + ",補碼: " + padding.getValue() + " ----------"); encryptStr.append(NEXTLINE); encryptStr.append("--------- [ Encrypt ] 秘鑰:" + serectKey + ", 向量偏移量:" + ivKey + " ----------"); encryptStr.append(NEXTLINE); encryptStr.append("--------- [ Encrypt ] 加密前數據:" + content + " ----------"); encryptStr.append(NEXTLINE); String encyptedContent = null; try { // 1.根據指定算法AES自成密碼器 String encyptType = encryptMode; // 2.1 如果是NOPADDING,加密的字符bytes長度必須是16的倍數; // 2.2 Java目前不支持ZEROPADDING // 2.3 如果是PKCS7Padding,需要調用BouncyCastleProvider讓java支持PKCS7Padding switch (padding) { case NO_PADDING: int len = content.getBytes("UTF-8").length; int m = len % 16; if (m != 0) { for (int i = 0; i < 16 - m; i++) { content += " "; } } break; case ZERO_PADDING: throw new IllegalArgumentException("抱歉,Java目前不支持" + Padding.ZERO_PADDING.getValue()); case PKCS7_PADDING: Security.addProvider(new BouncyCastleProvider()); break; default: break; } SecretKeySpec keyspec = new SecretKeySpec(serectKey.getBytes(CHARSET_U8), algorithm.getValue()); // 3.初始化密碼器,第一個參數為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個參數為使用的KEY,第三個參數為向量iv Cipher cipher = Cipher.getInstance(encyptType); // 4.ECB模式不需要使用IV,其他的模式都可以添加向量iv(不是必需) switch (aesMode) { case ECB: cipher.init(Cipher.ENCRYPT_MODE, keyspec); break; default: IvParameterSpec iv = new IvParameterSpec(ivKey.getBytes(CHARSET_U8)); cipher.init(Cipher.ENCRYPT_MODE, keyspec, iv); break; } // 5.獲取加密內容的字節數組(這裏要設置為utf-8)不然內容中如果有中文和英文混合中文就會解密為亂碼 byte[] byte_encode = content.getBytes(CHARSET_U8_STR); // 6.根據密碼器的初始化方式--加密:將數據加密 byte_encode = cipher.doFinal(byte_encode); // 7.將加密後的數據轉換為字符串 encyptedContent = new String(Base64.encodeBase64(byte_encode)); encryptStr.append("--------- [ Encrypt ] 加密後數據:" + encyptedContent + " ----------"); encryptStr.append(NEXTLINE); encryptStr.append("--------- [ Encrypt success ] 加密數據成功 ----------"); encryptStr.append(NEXTLINE); } catch (Exception e) { encryptStr.append("--------- [ Encrypt failed ] 加密數據失敗 ----------"); encryptStr.append(NEXTLINE); e.printStackTrace(); } System.out.println(encryptStr); // 7.將字符串返回,錯誤返回null return encyptedContent; } public static String decrypt (Algorithm algorithm, AESMode aesMode, Padding padding, String serectKey, String ivKey, String content) { // 加密模式 String encryptMode = algorithm.getValue() + "/" + aesMode.getValue() + "/" + padding.getValue(); StringBuffer decryptLog = new StringBuffer(); decryptLog.append("--------- [ Decrypt ] 加密算法:" + encryptMode + " ----------"); decryptLog.append(NEXTLINE); decryptLog.append("--------- [ Decrypt ] 算法:" + algorithm.getValue() + ", 加密模式:" + aesMode.getValue() + ",補碼: " + padding.getValue() + " ----------"); decryptLog.append(NEXTLINE); decryptLog.append("--------- [ Decrypt ] 秘鑰:" + serectKey + ",向量 偏移量:" + ivKey + " ----------"); decryptLog.append(NEXTLINE); decryptLog.append("--------- [ Decrypt ] 解密前數據:" + content + " ----------"); decryptLog.append(NEXTLINE); String decryptContent = null; try { // 1.根據指定算法AES自成密碼器 String encyptType = encryptMode; // 2.1 如果是NOPADDING,加密的字符bytes長度必須是16的倍數; // 2.2 Java目前不支持ZEROPADDING // 2.3 如果是PKCS7Padding,需要調用BouncyCastleProvider讓java支持PKCS7Padding switch (padding) { case NO_PADDING: int len = content.getBytes("UTF-8").length; int m = len % 16; if (m != 0) { for (int i = 0; i < 16 - m; i++) { content += " "; } } break; case ZERO_PADDING: throw new IllegalArgumentException("抱歉,Java目前不支持" + Padding.ZERO_PADDING.getValue()); case PKCS7_PADDING: Security.addProvider(new BouncyCastleProvider()); break; default: break; } SecretKeySpec keyspec = new SecretKeySpec(serectKey.getBytes(CHARSET_U8), algorithm.getValue()); // 3.初始化密碼器,第一個參數為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個參數為使用的KEY,第三個參數為向量iv Cipher cipher = Cipher.getInstance(encyptType); // 4.ECB模式不需要使用IV,其他的模式都可以添加向量iv(不是必需) switch (aesMode) { case ECB: cipher.init(Cipher.DECRYPT_MODE, keyspec); break; default: IvParameterSpec iv = new IvParameterSpec(ivKey.getBytes(CHARSET_U8)); cipher.init(Cipher.DECRYPT_MODE, keyspec, iv); break; } // 5.將加密並編碼後的內容解碼成字節數組 byte[] byte_content = Base64.decodeBase64(content); // 6.AES解密 byte_content = cipher.doFinal(byte_content); // 7.使用u8生成解密字符串 decryptContent = new String(byte_content, CHARSET_U8_STR); decryptLog.append("--------- [ Decrypt ] 解密後數據:" + decryptContent + " ----------"); decryptLog.append(NEXTLINE); decryptLog.append("--------- [ Decrypt success ] 解密數據成功 ----------"); decryptLog.append(NEXTLINE); } catch (Exception e) { decryptLog.append("--------- [ Decrypt failed ] 解密數據失敗 ----------"); decryptLog.append(NEXTLINE); e.printStackTrace(); } System.out.println(decryptLog); // 7.將字符串返回,錯誤返回null return decryptContent; } /** * 測試AES加密算法 * * @param algorithm 算法 * @param aesMode 加密模式 * @param padding 補碼 * @param serectKeyLength 秘鑰key長度 * @param ivKeyLength 向量iv長度*/ private static void testAESEncrypt (Algorithm algorithm, AESMode aesMode, Padding padding, int serectKeyLength, int ivKeyLength) { String originalStr = "這是一個沒有固定長度的測試的字符串"; String serectKey = RandomUtils.getString(serectKeyLength); String ivKey = RandomUtils.getString(ivKeyLength); String encryptContent = encrypt(algorithm, aesMode, padding, serectKey, ivKey, originalStr); String decryptContent = decrypt(algorithm, aesMode, padding, serectKey, ivKey, encryptContent); System.out.println("原字符串: " + originalStr); System.out.println("加密後字符串: " + encryptContent); System.out.println("解密後字符串: " + decryptContent); System.out.println(""); } public static void main (String[] args) { // // AES/CBC/* // // // AES/CBC/NO_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CBC, Padding.NO_PADDING, 16, 16); // // AES/CBC/PKCS5Padding // testAESEncrypt(Algorithm.AES, AESMode.CBC, Padding.PKCS5_PADDING, 16, 16); // // AES/CBC/PKCS7Padding // testAESEncrypt(Algorithm.AES, AESMode.CBC, Padding.PKCS7_PADDING, 16, 16); // // AES/CBC/ISO10126Padding // testAESEncrypt(Algorithm.AES, AESMode.CBC, Padding.ISO10126Padding, 16, 16); // ******************************************************************** // // AES/ECB/* // // // AES/ECB/NO_PADDING // testAESEncrypt(Algorithm.AES, AESMode.ECB, Padding.NO_PADDING, 16, 16); // // AES/ECB/PKCS5_PADDING // testAESEncrypt(Algorithm.AES, AESMode.ECB, Padding.PKCS5_PADDING, 16, 16); // // AES/ECB/PKCS7_PADDING // testAESEncrypt(Algorithm.AES, AESMode.ECB, Padding.PKCS7_PADDING, 16, 16); // // AES/ECB/ISO10126Padding // testAESEncrypt(Algorithm.AES, AESMode.ECB, Padding.ISO10126Padding, 16, 16); // ******************************************************************** // // AES/CFB/* // // // AES/CFB/NO_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CFB, Padding.NO_PADDING, 16, 16); // // AES/CFB/PKCS5_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CFB, Padding.PKCS5_PADDING, 16, 16); // // AES/CFB/PKCS7_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CFB, Padding.PKCS7_PADDING, 16, 16); // // AES/CFB/ISO10126Padding // testAESEncrypt(Algorithm.AES, AESMode.CFB, Padding.ISO10126Padding, 16, 16); // ******************************************************************** // // AES/CTR/* // // // AES/CTR/NO_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CTR, Padding.NO_PADDING, 16, 16); // // AES/CTR/PKCS5_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CTR, Padding.PKCS5_PADDING, 16, 16); // // AES/CTR/PKCS7_PADDING // testAESEncrypt(Algorithm.AES, AESMode.CTR, Padding.PKCS7_PADDING, 16, 16); // // AES/CTR/ISO10126Padding // testAESEncrypt(Algorithm.AES, AESMode.CTR, Padding.ISO10126Padding, 16, 16); // ******************************************************************** // AES/OFB/* // // AES/OFB/NO_PADDING testAESEncrypt(Algorithm.AES, AESMode.OFB, Padding.NO_PADDING, 16, 16); // AES/OFB/PKCS5_PADDING testAESEncrypt(Algorithm.AES, AESMode.OFB, Padding.PKCS5_PADDING, 16, 16); // AES/OFB/PKCS7_PADDING testAESEncrypt(Algorithm.AES, AESMode.OFB, Padding.PKCS7_PADDING, 16, 16); // AES/OFB/ISO10126Padding testAESEncrypt(Algorithm.AES, AESMode.OFB, Padding.ISO10126Padding, 16, 16); } }


AES/CBC/*,測試輸出:

--------- [ Encrypt ] 加密算法:AES/CBC/NoPadding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CBC,補碼: NoPadding ----------
--------- [ Encrypt ] 秘鑰:6AC587CB373C4629, 向量偏移量:EBC9591C109547AC ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:woWJayaezRlTAZAwwo0f6rKd3QGwY4kwyeVcwERMnMrFJWigAKeRgghmaPVi+eRqnfZrYGUWVy+e9QAuIN4CtQ== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CBC/NoPadding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CBC,補碼: NoPadding ----------
--------- [ Decrypt ] 秘鑰:6AC587CB373C4629,向量 偏移量:EBC9591C109547AC ----------
--------- [ Decrypt ] 解密前數據:woWJayaezRlTAZAwwo0f6rKd3QGwY4kwyeVcwERMnMrFJWigAKeRgghmaPVi+eRqnfZrYGUWVy+e9QAuIN4CtQ== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串              ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: woWJayaezRlTAZAwwo0f6rKd3QGwY4kwyeVcwERMnMrFJWigAKeRgghmaPVi+eRqnfZrYGUWVy+e9QAuIN4CtQ==
解密後字符串: 這是一個沒有固定長度的測試的字符串             

--------- [ Encrypt ] 加密算法:AES/CBC/PKCS5Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CBC,補碼: PKCS5Padding ----------
--------- [ Encrypt ] 秘鑰:C1A4F2FD73AA4497, 向量偏移量:45A85E8876BC45B3 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:HHN4NMy9sJx/LJX2ktHg0ZMhvYjcLFTBe6fPBD08Mcf1n+Epv/ymd47d+tmfivoLrjjlUo+WN5y2qkKmtZPWeA== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CBC/PKCS5Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CBC,補碼: PKCS5Padding ----------
--------- [ Decrypt ] 秘鑰:C1A4F2FD73AA4497,向量 偏移量:45A85E8876BC45B3 ----------
--------- [ Decrypt ] 解密前數據:HHN4NMy9sJx/LJX2ktHg0ZMhvYjcLFTBe6fPBD08Mcf1n+Epv/ymd47d+tmfivoLrjjlUo+WN5y2qkKmtZPWeA== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: HHN4NMy9sJx/LJX2ktHg0ZMhvYjcLFTBe6fPBD08Mcf1n+Epv/ymd47d+tmfivoLrjjlUo+WN5y2qkKmtZPWeA==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/CBC/PKCS7Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CBC,補碼: PKCS7Padding ----------
--------- [ Encrypt ] 秘鑰:543C44AA40C24780, 向量偏移量:5DAF6CE309044D52 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:iQEvpBVx3gX+bzDykW0WSvfVd0aqRG17q82asC/QsDWD2nqScl4peGZhedgRHLo54gcJNMgPVjmS2Uib5PHBww== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CBC/PKCS7Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CBC,補碼: PKCS7Padding ----------
--------- [ Decrypt ] 秘鑰:543C44AA40C24780,向量 偏移量:5DAF6CE309044D52 ----------
--------- [ Decrypt ] 解密前數據:iQEvpBVx3gX+bzDykW0WSvfVd0aqRG17q82asC/QsDWD2nqScl4peGZhedgRHLo54gcJNMgPVjmS2Uib5PHBww== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: iQEvpBVx3gX+bzDykW0WSvfVd0aqRG17q82asC/QsDWD2nqScl4peGZhedgRHLo54gcJNMgPVjmS2Uib5PHBww==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/CBC/ISO10126Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CBC,補碼: ISO10126Padding ----------
--------- [ Encrypt ] 秘鑰:F22B64EF4024479F, 向量偏移量:0F62A6138C934A6D ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:rb+fi0H6aiezRXc7vDiCj/FK5jecV5oVYPaGeen9gI/Or9PDk9DMHdu44u09LcmmpuIbDW7S5gNt6u7cea/Fsg== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CBC/ISO10126Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CBC,補碼: ISO10126Padding ----------
--------- [ Decrypt ] 秘鑰:F22B64EF4024479F,向量 偏移量:0F62A6138C934A6D ----------
--------- [ Decrypt ] 解密前數據:rb+fi0H6aiezRXc7vDiCj/FK5jecV5oVYPaGeen9gI/Or9PDk9DMHdu44u09LcmmpuIbDW7S5gNt6u7cea/Fsg== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: rb+fi0H6aiezRXc7vDiCj/FK5jecV5oVYPaGeen9gI/Or9PDk9DMHdu44u09LcmmpuIbDW7S5gNt6u7cea/Fsg==
解密後字符串: 這是一個沒有固定長度的測試的字符串

AES/ECB/*,測試輸出:

--------- [ Encrypt ] 加密算法:AES/ECB/NoPadding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:ECB,補碼: NoPadding ----------
--------- [ Encrypt ] 秘鑰:8DE67AB814CB4E1D, 向量偏移量:6C7AA2934E2241C4 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:nf5e8bxSnhpbOblsga54XxmqIytpXQG6Aim9VAXKx/nIH9Bc2akXOwwkUGwpJazC1yYwzm0ydeH+EQ437W7dUw== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/ECB/NoPadding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:ECB,補碼: NoPadding ----------
--------- [ Decrypt ] 秘鑰:8DE67AB814CB4E1D,向量 偏移量:6C7AA2934E2241C4 ----------
--------- [ Decrypt ] 解密前數據:nf5e8bxSnhpbOblsga54XxmqIytpXQG6Aim9VAXKx/nIH9Bc2akXOwwkUGwpJazC1yYwzm0ydeH+EQ437W7dUw== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串              ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: nf5e8bxSnhpbOblsga54XxmqIytpXQG6Aim9VAXKx/nIH9Bc2akXOwwkUGwpJazC1yYwzm0ydeH+EQ437W7dUw==
解密後字符串: 這是一個沒有固定長度的測試的字符串             

--------- [ Encrypt ] 加密算法:AES/ECB/PKCS5Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:ECB,補碼: PKCS5Padding ----------
--------- [ Encrypt ] 秘鑰:8B2A01576D554DF0, 向量偏移量:A8968C7DFE5B41E0 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:vxlE6f4pcWvt9v6Qdl5OyEBSNgTLedVyoEaGQYKchoDj5iZNDC8yUk82wDTmxQTJaFJskitvH89JCtCuKP/4jg== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/ECB/PKCS5Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:ECB,補碼: PKCS5Padding ----------
--------- [ Decrypt ] 秘鑰:8B2A01576D554DF0,向量 偏移量:A8968C7DFE5B41E0 ----------
--------- [ Decrypt ] 解密前數據:vxlE6f4pcWvt9v6Qdl5OyEBSNgTLedVyoEaGQYKchoDj5iZNDC8yUk82wDTmxQTJaFJskitvH89JCtCuKP/4jg== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: vxlE6f4pcWvt9v6Qdl5OyEBSNgTLedVyoEaGQYKchoDj5iZNDC8yUk82wDTmxQTJaFJskitvH89JCtCuKP/4jg==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/ECB/PKCS7Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:ECB,補碼: PKCS7Padding ----------
--------- [ Encrypt ] 秘鑰:444BE9008BF641CC, 向量偏移量:1BC7A338376F40FD ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:7UOL6EVv1cZnJBlP4y7OFIIjD4rFFE/dhc/fxsyK/7ADhYMO/VM41O1fzDsqPcKrQ6CJWvvs7wgYd3iVAdQV5A== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/ECB/PKCS7Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:ECB,補碼: PKCS7Padding ----------
--------- [ Decrypt ] 秘鑰:444BE9008BF641CC,向量 偏移量:1BC7A338376F40FD ----------
--------- [ Decrypt ] 解密前數據:7UOL6EVv1cZnJBlP4y7OFIIjD4rFFE/dhc/fxsyK/7ADhYMO/VM41O1fzDsqPcKrQ6CJWvvs7wgYd3iVAdQV5A== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: 7UOL6EVv1cZnJBlP4y7OFIIjD4rFFE/dhc/fxsyK/7ADhYMO/VM41O1fzDsqPcKrQ6CJWvvs7wgYd3iVAdQV5A==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/ECB/ISO10126Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:ECB,補碼: ISO10126Padding ----------
--------- [ Encrypt ] 秘鑰:A5C275229A294B5E, 向量偏移量:EDE8FCD30D754440 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:J/auLz3vRV1nPIf7MHh1RPMEFlAbGFS7AyZeZJB0mdrl+ZmWlRVa4elbm0hHWVbjWcGiWCjZJ3LSIOXCYDIhUA== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/ECB/ISO10126Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:ECB,補碼: ISO10126Padding ----------
--------- [ Decrypt ] 秘鑰:A5C275229A294B5E,向量 偏移量:EDE8FCD30D754440 ----------
--------- [ Decrypt ] 解密前數據:J/auLz3vRV1nPIf7MHh1RPMEFlAbGFS7AyZeZJB0mdrl+ZmWlRVa4elbm0hHWVbjWcGiWCjZJ3LSIOXCYDIhUA== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: J/auLz3vRV1nPIf7MHh1RPMEFlAbGFS7AyZeZJB0mdrl+ZmWlRVa4elbm0hHWVbjWcGiWCjZJ3LSIOXCYDIhUA==
解密後字符串: 這是一個沒有固定長度的測試的字符串

AES/CFB/*,測試輸出:

--------- [ Encrypt ] 加密算法:AES/CFB/NoPadding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CFB,補碼: NoPadding ----------
--------- [ Encrypt ] 秘鑰:2D8D04BF6B82403C, 向量偏移量:5ED121C9F82A451E ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:NzxJu+Ojkaati0X6Ys05V29Jaci0cnnOTiEQif2PN00g7xq/5GGzrJC8QFd76stQHccthh4+yJONpJQfkwF6Sg== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CFB/NoPadding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CFB,補碼: NoPadding ----------
--------- [ Decrypt ] 秘鑰:2D8D04BF6B82403C,向量 偏移量:5ED121C9F82A451E ----------
--------- [ Decrypt ] 解密前數據:NzxJu+Ojkaati0X6Ys05V29Jaci0cnnOTiEQif2PN00g7xq/5GGzrJC8QFd76stQHccthh4+yJONpJQfkwF6Sg== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串              ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: NzxJu+Ojkaati0X6Ys05V29Jaci0cnnOTiEQif2PN00g7xq/5GGzrJC8QFd76stQHccthh4+yJONpJQfkwF6Sg==
解密後字符串: 這是一個沒有固定長度的測試的字符串             

--------- [ Encrypt ] 加密算法:AES/CFB/PKCS5Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CFB,補碼: PKCS5Padding ----------
--------- [ Encrypt ] 秘鑰:357619F14C964136, 向量偏移量:68D8B163C9BF47D9 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:uuCGtpKDA9YfSCynXmmOrUOS2aYKOizDqoHVbHt+ZZpzJwPaQ//aDkyiHE5Ot3jaAaF6/aFC0YrufqXNI4PBgA== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CFB/PKCS5Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CFB,補碼: PKCS5Padding ----------
--------- [ Decrypt ] 秘鑰:357619F14C964136,向量 偏移量:68D8B163C9BF47D9 ----------
--------- [ Decrypt ] 解密前數據:uuCGtpKDA9YfSCynXmmOrUOS2aYKOizDqoHVbHt+ZZpzJwPaQ//aDkyiHE5Ot3jaAaF6/aFC0YrufqXNI4PBgA== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: uuCGtpKDA9YfSCynXmmOrUOS2aYKOizDqoHVbHt+ZZpzJwPaQ//aDkyiHE5Ot3jaAaF6/aFC0YrufqXNI4PBgA==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/CFB/PKCS7Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CFB,補碼: PKCS7Padding ----------
--------- [ Encrypt ] 秘鑰:67DA51FE61514AFB, 向量偏移量:44B21C81448B4556 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:+kTQ3J3U8HtewHsrAZG3ps/1IuOSZlEw0nMlaeL4FW1XLA8TZ6XK+ztUfdEh6EoMboAtqs53EhsYumm8R3ap/Q== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CFB/PKCS7Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CFB,補碼: PKCS7Padding ----------
--------- [ Decrypt ] 秘鑰:67DA51FE61514AFB,向量 偏移量:44B21C81448B4556 ----------
--------- [ Decrypt ] 解密前數據:+kTQ3J3U8HtewHsrAZG3ps/1IuOSZlEw0nMlaeL4FW1XLA8TZ6XK+ztUfdEh6EoMboAtqs53EhsYumm8R3ap/Q== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: +kTQ3J3U8HtewHsrAZG3ps/1IuOSZlEw0nMlaeL4FW1XLA8TZ6XK+ztUfdEh6EoMboAtqs53EhsYumm8R3ap/Q==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/CFB/ISO10126Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CFB,補碼: ISO10126Padding ----------
--------- [ Encrypt ] 秘鑰:A8E2F09BCD774223, 向量偏移量:FA7127821BCD4017 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:y7IFAcR0s++uzNtpLZGQLDJ4vLph/nh/+HxTN6+9OyWUuD8Bf1VdIHL+Bi7XcSic4Wq3IsXUl9c/qh8GpLH3nQ== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CFB/ISO10126Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CFB,補碼: ISO10126Padding ----------
--------- [ Decrypt ] 秘鑰:A8E2F09BCD774223,向量 偏移量:FA7127821BCD4017 ----------
--------- [ Decrypt ] 解密前數據:y7IFAcR0s++uzNtpLZGQLDJ4vLph/nh/+HxTN6+9OyWUuD8Bf1VdIHL+Bi7XcSic4Wq3IsXUl9c/qh8GpLH3nQ== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: y7IFAcR0s++uzNtpLZGQLDJ4vLph/nh/+HxTN6+9OyWUuD8Bf1VdIHL+Bi7XcSic4Wq3IsXUl9c/qh8GpLH3nQ==
解密後字符串: 這是一個沒有固定長度的測試的字符串

AES/CTR/*,測試輸出:

--------- [ Encrypt ] 加密算法:AES/CTR/NoPadding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CTR,補碼: NoPadding ----------
--------- [ Encrypt ] 秘鑰:33812BC2AFEF4D28, 向量偏移量:C974012F5CEA489B ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:4zLJWUfPzuFxhfZScOMDAUZHVV5r7nWd9bqoOJ530XPrSVC7hlw59Lh0P0695p4RyT0wlRzlBgny7LskEvk2uA== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CTR/NoPadding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CTR,補碼: NoPadding ----------
--------- [ Decrypt ] 秘鑰:33812BC2AFEF4D28,向量 偏移量:C974012F5CEA489B ----------
--------- [ Decrypt ] 解密前數據:4zLJWUfPzuFxhfZScOMDAUZHVV5r7nWd9bqoOJ530XPrSVC7hlw59Lh0P0695p4RyT0wlRzlBgny7LskEvk2uA== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串              ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: 4zLJWUfPzuFxhfZScOMDAUZHVV5r7nWd9bqoOJ530XPrSVC7hlw59Lh0P0695p4RyT0wlRzlBgny7LskEvk2uA==
解密後字符串: 這是一個沒有固定長度的測試的字符串             

--------- [ Encrypt ] 加密算法:AES/CTR/PKCS5Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CTR,補碼: PKCS5Padding ----------
--------- [ Encrypt ] 秘鑰:1D98BAD34AE94641, 向量偏移量:091226AB46B44502 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:rXHbLqijNiBvvcrk34MblERIfL/AjRsho/IhpmrasAuFjZF8X+9j73X92EnmFXLrS5Kz ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CTR/PKCS5Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CTR,補碼: PKCS5Padding ----------
--------- [ Decrypt ] 秘鑰:1D98BAD34AE94641,向量 偏移量:091226AB46B44502 ----------
--------- [ Decrypt ] 解密前數據:rXHbLqijNiBvvcrk34MblERIfL/AjRsho/IhpmrasAuFjZF8X+9j73X92EnmFXLrS5Kz ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: rXHbLqijNiBvvcrk34MblERIfL/AjRsho/IhpmrasAuFjZF8X+9j73X92EnmFXLrS5Kz
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/CTR/PKCS7Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CTR,補碼: PKCS7Padding ----------
--------- [ Encrypt ] 秘鑰:A7AFF087BCEA4CB3, 向量偏移量:C6F372061F87400C ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:nZt2UvnEMpsOdM9Ze2B5qQYws4sVbjqg6PzLRSuQRkUkapzGR98oEkt/DqBBCiEHmvVrjzQO8cPW0dG3Owh1RQ== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CTR/PKCS7Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CTR,補碼: PKCS7Padding ----------
--------- [ Decrypt ] 秘鑰:A7AFF087BCEA4CB3,向量 偏移量:C6F372061F87400C ----------
--------- [ Decrypt ] 解密前數據:nZt2UvnEMpsOdM9Ze2B5qQYws4sVbjqg6PzLRSuQRkUkapzGR98oEkt/DqBBCiEHmvVrjzQO8cPW0dG3Owh1RQ== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: nZt2UvnEMpsOdM9Ze2B5qQYws4sVbjqg6PzLRSuQRkUkapzGR98oEkt/DqBBCiEHmvVrjzQO8cPW0dG3Owh1RQ==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/CTR/ISO10126Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:CTR,補碼: ISO10126Padding ----------
--------- [ Encrypt ] 秘鑰:9CB9134F56294E57, 向量偏移量:2F53A1CBE07E467B ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:ngt4WKtqwsI7SINPnWddpSijd+zabWbLMqmFk5z1lo6kaW9oPXx536MHWRbfqCbmNFy+n2TJ178bE2Y5NoQPZw== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/CTR/ISO10126Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:CTR,補碼: ISO10126Padding ----------
--------- [ Decrypt ] 秘鑰:9CB9134F56294E57,向量 偏移量:2F53A1CBE07E467B ----------
--------- [ Decrypt ] 解密前數據:ngt4WKtqwsI7SINPnWddpSijd+zabWbLMqmFk5z1lo6kaW9oPXx536MHWRbfqCbmNFy+n2TJ178bE2Y5NoQPZw== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: ngt4WKtqwsI7SINPnWddpSijd+zabWbLMqmFk5z1lo6kaW9oPXx536MHWRbfqCbmNFy+n2TJ178bE2Y5NoQPZw==
解密後字符串: 這是一個沒有固定長度的測試的字符串

AES/OFB/*,測試輸出:

--------- [ Encrypt ] 加密算法:AES/OFB/NoPadding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:OFB,補碼: NoPadding ----------
--------- [ Encrypt ] 秘鑰:CF6B28476B434496, 向量偏移量:894C3C61F7EC4808 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:dxWt2Fw9n6/D5pRaq4qx5SeqMB0WnKoyoi+ircoDaYNywjHBNqZ+AkFQbvHHu95ITw8sufbcsJGQX6lFDwPbVA== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/OFB/NoPadding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:OFB,補碼: NoPadding ----------
--------- [ Decrypt ] 秘鑰:CF6B28476B434496,向量 偏移量:894C3C61F7EC4808 ----------
--------- [ Decrypt ] 解密前數據:dxWt2Fw9n6/D5pRaq4qx5SeqMB0WnKoyoi+ircoDaYNywjHBNqZ+AkFQbvHHu95ITw8sufbcsJGQX6lFDwPbVA== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串              ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: dxWt2Fw9n6/D5pRaq4qx5SeqMB0WnKoyoi+ircoDaYNywjHBNqZ+AkFQbvHHu95ITw8sufbcsJGQX6lFDwPbVA==
解密後字符串: 這是一個沒有固定長度的測試的字符串             

--------- [ Encrypt ] 加密算法:AES/OFB/PKCS5Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:OFB,補碼: PKCS5Padding ----------
--------- [ Encrypt ] 秘鑰:B49117B4A4964EFF, 向量偏移量:E8CF95FF1D2A4A74 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:gQDGEqp2G8Mt5ayuFf8B+UyM2L7rwlHIiAWUgc/SkoMQHP/7e7fk/gsSxQY9ZAM3Ql6AE58LA0mWoM604VbUAA== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/OFB/PKCS5Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:OFB,補碼: PKCS5Padding ----------
--------- [ Decrypt ] 秘鑰:B49117B4A4964EFF,向量 偏移量:E8CF95FF1D2A4A74 ----------
--------- [ Decrypt ] 解密前數據:gQDGEqp2G8Mt5ayuFf8B+UyM2L7rwlHIiAWUgc/SkoMQHP/7e7fk/gsSxQY9ZAM3Ql6AE58LA0mWoM604VbUAA== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: gQDGEqp2G8Mt5ayuFf8B+UyM2L7rwlHIiAWUgc/SkoMQHP/7e7fk/gsSxQY9ZAM3Ql6AE58LA0mWoM604VbUAA==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/OFB/PKCS7Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:OFB,補碼: PKCS7Padding ----------
--------- [ Encrypt ] 秘鑰:7F2C5D507B5041BA, 向量偏移量:357F871961A84E3F ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:shuo1qyEvWi7KxdDRSTniZcZKRdgaZnZvbgovlA0ctyOFV5jnPGWhaP0Vl53E39UKfUwrBeFYWB6xYf4fsY3zQ== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/OFB/PKCS7Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:OFB,補碼: PKCS7Padding ----------
--------- [ Decrypt ] 秘鑰:7F2C5D507B5041BA,向量 偏移量:357F871961A84E3F ----------
--------- [ Decrypt ] 解密前數據:shuo1qyEvWi7KxdDRSTniZcZKRdgaZnZvbgovlA0ctyOFV5jnPGWhaP0Vl53E39UKfUwrBeFYWB6xYf4fsY3zQ== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: shuo1qyEvWi7KxdDRSTniZcZKRdgaZnZvbgovlA0ctyOFV5jnPGWhaP0Vl53E39UKfUwrBeFYWB6xYf4fsY3zQ==
解密後字符串: 這是一個沒有固定長度的測試的字符串

--------- [ Encrypt ] 加密算法:AES/OFB/ISO10126Padding ----------
--------- [ Encrypt ] 算法:AES, 加密模式:OFB,補碼: ISO10126Padding ----------
--------- [ Encrypt ] 秘鑰:0746E45280884C87, 向量偏移量:2EBF60DEE1F14462 ----------
--------- [ Encrypt ] 加密前數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Encrypt ] 加密後數據:OpgpMES7fA6fIANe8EGEXirfEty/zo98IKG/PzZqqMeoRhQRkFKy4wbIQ+3V5EsW5YL8qdL1pfxKoRMIlIjCHQ== ----------
--------- [ Encrypt success ] 加密數據成功 ----------

--------- [ Decrypt ] 加密算法:AES/OFB/ISO10126Padding ----------
--------- [ Decrypt ] 算法:AES, 加密模式:OFB,補碼: ISO10126Padding ----------
--------- [ Decrypt ] 秘鑰:0746E45280884C87,向量 偏移量:2EBF60DEE1F14462 ----------
--------- [ Decrypt ] 解密前數據:OpgpMES7fA6fIANe8EGEXirfEty/zo98IKG/PzZqqMeoRhQRkFKy4wbIQ+3V5EsW5YL8qdL1pfxKoRMIlIjCHQ== ----------
--------- [ Decrypt ] 解密後數據:這是一個沒有固定長度的測試的字符串 ----------
--------- [ Decrypt success ] 解密數據成功 ----------

原字符串: 這是一個沒有固定長度的測試的字符串
加密後字符串: OpgpMES7fA6fIANe8EGEXirfEty/zo98IKG/PzZqqMeoRhQRkFKy4wbIQ+3V5EsW5YL8qdL1pfxKoRMIlIjCHQ==
解密後字符串: 這是一個沒有固定長度的測試的字符串

Java中的AES加解密工具類:AESUtils