目录

  • 一、简介
  • 二、AES工具类
  • 三、实践
    • 3.1 AES之ECB模式加密
    • 3.2 AES之ECB模式解密
    • 3.3 AES之CBC模式加密
    • 3.4 AES之CBC模式解密
  • 结语

一、简介

  密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准高级加密标准。对称加密算法也就是加密和解密用相同的密钥,具体的加解密流程如下:

至于AES使用ECB和CBC模式的特点在上一篇文章Java实现3DES工具类(包含CBC和ECB)里有说过,就不再描述了。其实通过Java原生类实现起来都是差不多的,主要在于算法,密钥规范,工作模式的不同。

二、AES工具类

AesUtil.java

package com.alian.csdn.utils;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;/*** @program: CSDN* @description: Aes工具类* @author: Alian* @create: 2021-06-05 09:20:10**/
public class AesUtil {private static final String ALGORITHM = "AES";private static final String AES_CBC_PADDING = "AES/CBC/PKCS5Padding";//AES/CBC/PKCS7Paddingprivate static final String AES_ECB_PADDING = "AES/ECB/PKCS5Padding";//AES/ECB/PKCS7Padding/*** 也可以通过这种方式获取密钥** @param key* @return*/private static SecretKey getSecretKey(byte[] key) {try {//获取指定的密钥生成器KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);//加密强随机数SecureRandom secureRandom = new SecureRandom();secureRandom.setSeed(key);//这里可以是128、192、256、越大越安全keyGen.init(256, secureRandom);return keyGen.generateKey();} catch (NoSuchAlgorithmException e) {throw new RuntimeException("AES获取密钥出现错误,算法异常");}}/*** Aes加密(CBC工作模式)** @param key   密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数* @param keyIv 初始化向量,keyIv长度必须等于16* @param data  明文* @return 密文* @throws Exception*/public static byte[] encodeByCBC(byte[] key, byte[] keyIv, byte[] data)throws Exception {//获取SecretKey对象,也可以使用getSecretKey()方法Key secretKey = new SecretKeySpec(key, ALGORITHM);//获取指定转换的密码对象Cipher(参数:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);//创建向量参数规范也就是初始化向量IvParameterSpec ips = new IvParameterSpec(keyIv);//用密钥和一组算法参数规范初始化此Cipher对象(加密模式)cipher.init(Cipher.ENCRYPT_MODE, secretKey, ips);//执行加密操作return cipher.doFinal(data);}/*** Aes加密(ECB工作模式)** @param key   密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数* @param keyIv 初始化向量,keyIv长度必须等于16* @param data  密文* @return 明文* @throws Exception*/public static byte[] decodeByCBC(byte[] key, byte[] keyIv, byte[] data)throws Exception {//获取SecretKey对象,也可以使用getSecretKey()方法Key secretKey = new SecretKeySpec(key, ALGORITHM);//获取指定转换的密码对象Cipher(参数:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(AES_CBC_PADDING);//创建向量参数规范也就是初始化向量IvParameterSpec ips = new IvParameterSpec(keyIv);//用密钥和一组算法参数规范初始化此Cipher对象(加密模式)cipher.init(Cipher.DECRYPT_MODE, secretKey, ips);//执行加密操作return cipher.doFinal(data);}/*** Aes加密(ECB工作模式),不要IV** @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数* @param data 明文* @return 密文* @throws Exception*/public static byte[] encodeByECB(byte[] key, byte[] data) throws Exception {//获取SecretKey对象,也可以使用getSecretKey()方法SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);//获取指定转换的密码对象Cipher(参数:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(AES_ECB_PADDING);//用密钥和一组算法参数规范初始化此Cipher对象(加密模式)cipher.init(Cipher.ENCRYPT_MODE, secretKey);//执行加密操作return cipher.doFinal(data);}/*** Aes解密(ECB工作模式),不要IV** @param key  密钥,key长度必须大于等于 3*8 = 24,并且是8的倍数* @param data 密文* @return 明文* @throws Exception*/public static byte[] decodeByECB(byte[] key, byte[] data) throws Exception {//获取SecretKey对象,也可以使用getSecretKey()方法SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);//获取指定转换的密码对象Cipher(参数:算法/工作模式/填充模式)Cipher cipher = Cipher.getInstance(AES_ECB_PADDING);//用密钥和一组算法参数规范初始化此Cipher对象(加密模式)cipher.init(Cipher.DECRYPT_MODE, secretKey);//执行加密操作return cipher.doFinal(data);}
}

三、实践

  • AES加密key的长度至少为24位并且是8的倍数
  • AES里CBC模式的加解密初始化向量的长度为16
  • AES里加解密的时候密钥要保持一致

3.1 AES之ECB模式加密

    /*** AES加密之ECB加密* 此处单元测试的注解是采用:org.junit.Test* @throws Exception*/@Testpublic void ecbEncode() throws Exception {System.out.println("------------------AES加密之ECB加密转base64------------------");//key的长度至少为24位并且是8的倍数(比如32,40等等)String aesKey = "ee1b7d9ca0b7d10d2cd27f35d34bb412";String plainText = "<root><out_refund_no>20180608163757915497</out_refund_no><out_trade_no>15070411211528250141228</out_trade_no><refund_account>REFUND_SOURCE_RECHARGE_FUNDS</refund_account><refund_fee>1</refund_fee><refund_id>50000607002018060805036784330</refund_id><refund_recv_accout>支付用户零钱</refund_recv_accout><refund_request_source>API</refund_request_source><refund_status>SUCCESS</refund_status><settlement_refund_fee>1</settlement_refund_fee><settlement_total_fee>1</settlement_total_fee><success_time>2018-06-08 16:38:05</success_time><total_fee>1</total_fee><transaction_id>4200000129201806063432463966</transaction_id></root>";System.out.println("ECB加密原始数据:" + plainText);byte[] key = aesKey.getBytes(StandardCharsets.UTF_8);byte[] data = plainText.getBytes(StandardCharsets.UTF_8);//ECB模式加密byte[] encode = AesUtil.encodeByECB(key, data);System.out.println("ECB加密后转Base64的数据:" + Base64.getEncoder().encodeToString(encode));}

运行结果:

------------------AES加密之ECB加密转base64------------------
ECB加密原始数据:<root><out_refund_no>20180608163757915497</out_refund_no><out_trade_no>15070411211528250141228</out_trade_no><refund_account>REFUND_SOURCE_RECHARGE_FUNDS</refund_account><refund_fee>1</refund_fee><refund_id>50000607002018060805036784330</refund_id><refund_recv_accout>支付用户零钱</refund_recv_accout><refund_request_source>API</refund_request_source><refund_status>SUCCESS</refund_status><settlement_refund_fee>1</settlement_refund_fee><settlement_total_fee>1</settlement_total_fee><success_time>2018-06-08 16:38:05</success_time><total_fee>1</total_fee><transaction_id>4200000129201806063432463966</transaction_id></root>
ECB加密后转Base64的数据:vuQrpYy7xHB63Ha2s8dQdp9GX96XLUJknNebiHzQZpZq9GAe/drIFiCW+TwcCUy93TdN8vMOoGHn7G5jcB1azuNyHjCqR8rYELFR1BvD9j15IR31i3GjSw4U3Y+1LqLohC7q4Gajv4FvC9SNSa4xXpAuV0vARWjZOlSJHYQ9rvG89RK8alYFKrQZDBcMAx+knA7nrJ4LkLpPub6d9rRgon9hK2BVQbVIE1JqJnP6oJGq9gxhEyCg5j/c7PU+gTUvaOlCaByxKjCaVqrCAN1o3SNpjr8HgAIKC7qLpvr6twvnQ2UpIvG81HVeS3w8R/XHS8HO4SX81iPG5G/Y2SV8udCheA8Rh8EXxetibz4USoFRRf6vUebRuHaNhyp9NP5VzJ8+KDh1ySGXoBc1JKKi/s/R2rFzp4mHWtKcL3F0wIgAIJu2KVwI5nzy/zZJLXb4SKLBM5TQrkWt1l1qOeIpGTG6xlgGTjvPTa/+Au+VGYwqN+fUEojyruojlFFwkglYBASLQak0lVJRhOp+9fsrX8oSSHGl0a4NqWNSN1gyASGY1vL3yG0l+vVcjHaj+m9Ac04C0LzdT9zP2Pp1ImpzjTd2xed4X3DCcSJN8DB7JaWLe2iffe807aYz6VVVWDMKTcPpYoIqbX2tHGDO+6AyKHRN6QwBlbyUsSTd30N49GnDTfALcY7mMU374jr8dOfd2ciUDBgAsvFN4vPisn7LH4HH0HQfdiVbnCSZuUA0/NTjq2Jy5WAaY5Kkrh2i5TIg7d6LC1StBI1JPV/9PYGXAIXBSZVR57pz9zstekW2aHKmnlIvwzn2mSvmllH0iboxb0zyoxqZPzMgUO7pS3Ym7g==

3.2 AES之ECB模式解密

    /*** AES加密之ECB解密* 此处单元测试的注解是采用:org.junit.Test* @throws Exception*/@Testpublic void ecbDecode() throws Exception {System.out.println("------------------AES加密之ECB解密------------------");//和加密时密钥一样String aesKey = "ee1b7d9ca0b7d10d2cd27f35d34bb412";//base64编码后的字符串String plainText = "vuQrpYy7xHB63Ha2s8dQdp9GX96XLUJknNebiHzQZpZq9GAe/drIFiCW+TwcCUy93TdN8vMOoGHn7G5jcB1azuNyHjCqR8rYELFR1BvD9j15IR31i3GjSw4U3Y+1LqLohC7q4Gajv4FvC9SNSa4xXpAuV0vARWjZOlSJHYQ9rvG89RK8alYFKrQZDBcMAx+knA7nrJ4LkLpPub6d9rRgon9hK2BVQbVIE1JqJnP6oJGq9gxhEyCg5j/c7PU+gTUvaOlCaByxKjCaVqrCAN1o3SNpjr8HgAIKC7qLpvr6twvnQ2UpIvG81HVeS3w8R/XHS8HO4SX81iPG5G/Y2SV8udCheA8Rh8EXxetibz4USoFRRf6vUebRuHaNhyp9NP5VzJ8+KDh1ySGXoBc1JKKi/s/R2rFzp4mHWtKcL3F0wIgAIJu2KVwI5nzy/zZJLXb4SKLBM5TQrkWt1l1qOeIpGTG6xlgGTjvPTa/+Au+VGYwqN+fUEojyruojlFFwkglYBASLQak0lVJRhOp+9fsrX8oSSHGl0a4NqWNSN1gyASGY1vL3yG0l+vVcjHaj+m9Ac04C0LzdT9zP2Pp1ImpzjTd2xed4X3DCcSJN8DB7JaWLe2iffe807aYz6VVVWDMKTcPpYoIqbX2tHGDO+6AyKHRN6QwBlbyUsSTd30N49GnDTfALcY7mMU374jr8dOfd2ciUDBgAsvFN4vPisn7LH4HH0HQfdiVbnCSZuUA0/NTjq2Jy5WAaY5Kkrh2i5TIg7d6LC1StBI1JPV/9PYGXAIXBSZVR57pz9zstekW2aHKmnlIvwzn2mSvmllH0iboxb0zyoxqZPzMgUO7pS3Ym7g==";System.out.println("ECB解密原始数据:" + plainText);//因为原始字符串经过base64编码后的字符串byte[] key = aesKey.getBytes(StandardCharsets.UTF_8);byte[] data = Base64.getDecoder().decode(plainText);//ECB模式解密byte[] decodeStr = AesUtil.decodeByECB(key, data);System.out.println("ECB解密后转字符串数据:" + new String(decodeStr, StandardCharsets.UTF_8));}

运行结果:

------------------AES加密之ECB解密------------------
ECB解密原始数据:vuQrpYy7xHB63Ha2s8dQdp9GX96XLUJknNebiHzQZpZq9GAe/drIFiCW+TwcCUy93TdN8vMOoGHn7G5jcB1azuNyHjCqR8rYELFR1BvD9j15IR31i3GjSw4U3Y+1LqLohC7q4Gajv4FvC9SNSa4xXpAuV0vARWjZOlSJHYQ9rvG89RK8alYFKrQZDBcMAx+knA7nrJ4LkLpPub6d9rRgon9hK2BVQbVIE1JqJnP6oJGq9gxhEyCg5j/c7PU+gTUvaOlCaByxKjCaVqrCAN1o3SNpjr8HgAIKC7qLpvr6twvnQ2UpIvG81HVeS3w8R/XHS8HO4SX81iPG5G/Y2SV8udCheA8Rh8EXxetibz4USoFRRf6vUebRuHaNhyp9NP5VzJ8+KDh1ySGXoBc1JKKi/s/R2rFzp4mHWtKcL3F0wIgAIJu2KVwI5nzy/zZJLXb4SKLBM5TQrkWt1l1qOeIpGTG6xlgGTjvPTa/+Au+VGYwqN+fUEojyruojlFFwkglYBASLQak0lVJRhOp+9fsrX8oSSHGl0a4NqWNSN1gyASGY1vL3yG0l+vVcjHaj+m9Ac04C0LzdT9zP2Pp1ImpzjTd2xed4X3DCcSJN8DB7JaWLe2iffe807aYz6VVVWDMKTcPpYoIqbX2tHGDO+6AyKHRN6QwBlbyUsSTd30N49GnDTfALcY7mMU374jr8dOfd2ciUDBgAsvFN4vPisn7LH4HH0HQfdiVbnCSZuUA0/NTjq2Jy5WAaY5Kkrh2i5TIg7d6LC1StBI1JPV/9PYGXAIXBSZVR57pz9zstekW2aHKmnlIvwzn2mSvmllH0iboxb0zyoxqZPzMgUO7pS3Ym7g==
ECB解密后转字符串数据:<root><out_refund_no>20180608163757915497</out_refund_no><out_trade_no>15070411211528250141228</out_trade_no><refund_account>REFUND_SOURCE_RECHARGE_FUNDS</refund_account><refund_fee>1</refund_fee><refund_id>50000607002018060805036784330</refund_id><refund_recv_accout>支付用户零钱</refund_recv_accout><refund_request_source>API</refund_request_source><refund_status>SUCCESS</refund_status><settlement_refund_fee>1</settlement_refund_fee><settlement_total_fee>1</settlement_total_fee><success_time>2018-06-08 16:38:05</success_time><total_fee>1</total_fee><transaction_id>4200000129201806063432463966</transaction_id></root>

格式化结果如下:

<root><out_refund_no>20180608163757915497</out_refund_no><out_trade_no>15070411211528250141228</out_trade_no><refund_account>REFUND_SOURCE_RECHARGE_FUNDS</refund_account><refund_fee>1</refund_fee><refund_id>50000607002018060805036784330</refund_id><refund_recv_accout>支付用户零钱</refund_recv_accout><refund_request_source>API</refund_request_source><refund_status>SUCCESS</refund_status><settlement_refund_fee>1</settlement_refund_fee><settlement_total_fee>1</settlement_total_fee><success_time>2018-06-08 16:38:05</success_time><total_fee>1</total_fee><transaction_id>4200000129201806063432463966</transaction_id>
</root>

3.3 AES之CBC模式加密

    /*** AES加密之CBC加密转base64* 此处单元测试的注解是采用:org.junit.Test* @throws Exception*/@Testpublic void cbcEncode() throws Exception {System.out.println("------------------AES加密之CBC加密转base64------------------");String desKey = "4c1ab02124f0941fbc01f902be421843";//初始化向量的长度为16String keyIv = "12345678abcdefgh";String plainText = "{\"txncode\":\"QueryInvoice\",\"instid\":\"10000006\",\"mchntid\":\"100000060000001\",\"netid\":\"040000280001\",\"posid\":\"040000280001\",\"oprid\":\"wtsd001\",\"serialNo\":\"04000028000121052148281221\",\"postTime\":\"2021-06-03 00:08:00\",\"responsecode\":\"000000\",\"responsedesc\":\"成功\",\"messageList\":{\"code\":\"03702170021109363363\",\"viewUrl\":\"https://www.chinaeinv.com/p.jspa?c=15E38CA48E906F7985CF\",\"pdfUnsignedUrl\":\"https://www.chinaeinv.com/pdf.jspa?c=15E38CA48E906F7985CF\",\"generateTime\":\"2021-05-21 17:46:29\",\"totalAmount\":\"50\"}}";System.out.println("CBC加密原始数据:" + plainText);byte[] key = desKey.getBytes(StandardCharsets.UTF_8);byte[] data = plainText.getBytes(StandardCharsets.UTF_8);byte[] encode = AesUtil.encodeByCBC(key, keyIv.getBytes(StandardCharsets.UTF_8), data);System.out.println("CBC加密后转Base64的数据:" + Base64.getEncoder().encodeToString(encode));}

运行结果:

------------------AES加密之CBC加密转base64------------------
CBC加密原始数据:{"txncode":"QueryInvoice","instid":"10000006","mchntid":"100000060000001","netid":"040000280001","posid":"040000280001","oprid":"wtsd001","serialNo":"04000028000121052148281221","postTime":"2021-06-03 00:08:00","responsecode":"000000","responsedesc":"成功","messageList":{"code":"03702170021109363363","viewUrl":"https://www.chinaeinv.com/p.jspa?c=15E38CA48E906F7985CF","pdfUnsignedUrl":"https://www.chinaeinv.com/pdf.jspa?c=15E38CA48E906F7985CF","generateTime":"2021-05-21 17:46:29","totalAmount":"50"}}
CBC加密后转Base64的数据:KRdou0k/HC1jdHlddMJBPI18jjsu9djXZpd99dkKFbyawP59uPDqTGknoLD01fv1/KTVYe5oSzqMsK2DH+QFvQKT86ieJsOxyB5CRLvrcp780hdBwW1RvxEZYqarXhpOLskLdjbTo1L9BJht4gA8HuDw3w9gMx/HcZeUiESVDt2ihspLrDAMyj7OwU2pdE+3o/O3V++BcpIdUHsPcqB02kSWlPiEBfsl5xZvm0P9rmlfPPTTP754L+Hc/s4vOAMoWCOZtBljfojDHdhRqr6iLoAr1ZtNrz51Ph8Sz7P94wm/0RrFQDpvJd9m2f5Ph3m3zjHHlFXv3GXMDZjcrshjxemyyZ+7nIXmbcjWLDOo9AGoH/33FE0JGs9jS+XtaaTnNNsw9thJmjDuIe4QQEyBOQemvkxf15bg1q3O+jxorh4/WL2+TuK6i8ybhJIadcSn1w5pQj97NRQjZNvFMg+VdlqgvEDaGebwFDXqU/k8tlmnTF/5UhnI4T4aimut4jJVL/ktBulUbKjsdPLJIHi6hJuUZboYr1p+ExDlxhZqKnJ/rV9eyhRQKWT65yrYzZ2p1nRhiG/7a7BavsFof2prvbpUOwa9nMYHEwtvJoDjoJF/8t3fr7KaPHQ/+IMo7DOL/pG8iUQKm0AHYazyFH7DDOBbTq0O+Y5vC7iTD1gB1Lc=

3.4 AES之CBC模式解密

    /*** AES加密之CBC解密* 此处单元测试的注解是采用:org.junit.Test* @throws Exception*/@Testpublic void cbcDecode() throws Exception {System.out.println("------------------AES加密之CBC解密------------------");//和加密时密钥一样String desKey = "4c1ab02124f0941fbc01f902be421843";String plainText = "KRdou0k/HC1jdHlddMJBPI18jjsu9djXZpd99dkKFbyawP59uPDqTGknoLD01fv1/KTVYe5oSzqMsK2DH+QFvQKT86ieJsOxyB5CRLvrcp780hdBwW1RvxEZYqarXhpOLskLdjbTo1L9BJht4gA8HuDw3w9gMx/HcZeUiESVDt2ihspLrDAMyj7OwU2pdE+3o/O3V++BcpIdUHsPcqB02kSWlPiEBfsl5xZvm0P9rmlfPPTTP754L+Hc/s4vOAMoWCOZtBljfojDHdhRqr6iLoAr1ZtNrz51Ph8Sz7P94wm/0RrFQDpvJd9m2f5Ph3m3zjHHlFXv3GXMDZjcrshjxemyyZ+7nIXmbcjWLDOo9AGoH/33FE0JGs9jS+XtaaTnNNsw9thJmjDuIe4QQEyBOQemvkxf15bg1q3O+jxorh4/WL2+TuK6i8ybhJIadcSn1w5pQj97NRQjZNvFMg+VdlqgvEDaGebwFDXqU/k8tlmnTF/5UhnI4T4aimut4jJVL/ktBulUbKjsdPLJIHi6hJuUZboYr1p+ExDlxhZqKnJ/rV9eyhRQKWT65yrYzZ2p1nRhiG/7a7BavsFof2prvbpUOwa9nMYHEwtvJoDjoJF/8t3fr7KaPHQ/+IMo7DOL/pG8iUQKm0AHYazyFH7DDOBbTq0O+Y5vC7iTD1gB1Lc=";String keyIv = "12345678abcdefgh";System.out.println("CBC解密原始数据:" + plainText);byte[] key = desKey.getBytes(StandardCharsets.UTF_8);//因为结果时byte[] data = Base64.getDecoder().decode(plainText);byte[] decodeStr = AesUtil.decodeByCBC(key, keyIv.getBytes(StandardCharsets.UTF_8), data);System.out.println("CBC解密后转字符串数据:" + new String(decodeStr, StandardCharsets.UTF_8));}

运行结果:

------------------AES加密之CBC解密------------------
CBC解密原始数据:KRdou0k/HC1jdHlddMJBPI18jjsu9djXZpd99dkKFbyawP59uPDqTGknoLD01fv1/KTVYe5oSzqMsK2DH+QFvQKT86ieJsOxyB5CRLvrcp780hdBwW1RvxEZYqarXhpOLskLdjbTo1L9BJht4gA8HuDw3w9gMx/HcZeUiESVDt2ihspLrDAMyj7OwU2pdE+3o/O3V++BcpIdUHsPcqB02kSWlPiEBfsl5xZvm0P9rmlfPPTTP754L+Hc/s4vOAMoWCOZtBljfojDHdhRqr6iLoAr1ZtNrz51Ph8Sz7P94wm/0RrFQDpvJd9m2f5Ph3m3zjHHlFXv3GXMDZjcrshjxemyyZ+7nIXmbcjWLDOo9AGoH/33FE0JGs9jS+XtaaTnNNsw9thJmjDuIe4QQEyBOQemvkxf15bg1q3O+jxorh4/WL2+TuK6i8ybhJIadcSn1w5pQj97NRQjZNvFMg+VdlqgvEDaGebwFDXqU/k8tlmnTF/5UhnI4T4aimut4jJVL/ktBulUbKjsdPLJIHi6hJuUZboYr1p+ExDlxhZqKnJ/rV9eyhRQKWT65yrYzZ2p1nRhiG/7a7BavsFof2prvbpUOwa9nMYHEwtvJoDjoJF/8t3fr7KaPHQ/+IMo7DOL/pG8iUQKm0AHYazyFH7DDOBbTq0O+Y5vC7iTD1gB1Lc=
CBC解密后转字符串数据:{"txncode":"QueryInvoice","instid":"10000006","mchntid":"100000060000001","netid":"040000280001","posid":"040000280001","oprid":"wtsd001","serialNo":"04000028000121052148281221","postTime":"2021-06-03 00:08:00","responsecode":"000000","responsedesc":"成功","messageList":{"code":"03702170021109363363","viewUrl":"https://www.chinaeinv.com/p.jspa?c=15E38CA48E906F7985CF","pdfUnsignedUrl":"https://www.chinaeinv.com/pdf.jspa?c=15E38CA48E906F7985CF","generateTime":"2021-05-21 17:46:29","totalAmount":"50"}}

格式化后结果如下:

{"txncode": "QueryInvoice","instid": "10000006","mchntid": "100000060000001","netid": "040000280001","posid": "040000280001","oprid": "wtsd001","serialNo": "04000028000121052148281221","postTime": "2021-06-03 00:08:00","responsecode": "000000","responsedesc": "成功","messageList": {"code": "03702170021109363363","viewUrl": "https://www.chinaeinv.com/p.jspa?c=15E38CA48E906F7985CF","pdfUnsignedUrl": "https://www.chinaeinv.com/pdf.jspa?c=15E38CA48E906F7985CF","generateTime": "2021-05-21 17:46:29","totalAmount": "50"}
}

  从以上格式化的结果和最开始结果,我们可以看到数据实现了加密和解密并保护了数据的完整性。微信其实也使用到了AES加密方式,后续我会针对微信退款异步通知的接口写一个实例,避免大家躺坑。

结语

  以上就是今天要讲的内容,本文仅仅简单介绍了AES,简单编写了一个AesUtil工具类,包含了CBC和ECB两种模式,整体上和DES工具类是差不多的,主要在于算法,密钥规范,工作模式的不同。有兴趣的同学可以先去了解一下AES算法的原理,希望对您有所帮助,欢迎大家评论交流。

Java实现AES工具类(包含CBC和ECB)相关推荐

  1. AES对称加密和解密算法以及Java的AES工具类

    参考资料:百度百科[高级加密标准] AES简介 1.密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块 ...

  2. java aes 工具类_AESUtil Java AES 加密解密工具类

    package com.singlee.util; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; impo ...

  3. AES工具类及漏铜修复

    在使用Sonar扫描代码是发现AES工具类提示如下漏洞 很明显.漏洞存在于红色方框 Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS ...

  4. java轻量级并行工具类_16 个超级实用的 Java 工具类

    原标题:16 个超级实用的 Java 工具类 源 /juejin 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名, ...

  5. Java导入Excel工具类使用教程

    前言: 本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包.支持RESTful API,支持Spring ...

  6. Java身份证校验工具类

    Java身份证校验工具类 工作中经常会涉及到身份证的校验,而且需求不同,有的需要校验最后一位校验位,有的不需要,这里参考了几篇文章及自己工作中用到的情况写了一个工具类.记录一下,菜鸟一个,大佬勿喷. ...

  7. Java封装OkHttp3工具类

    点击关注公众号,Java干货及时送达  作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...

  8. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  9. java时间日期工具类_java日期处理工具类

    java日期处理工具类 import java.text.DecimalFormat; import java.text.ParsePosition; import java.text.SimpleD ...

最新文章

  1. 一些有用的webservice
  2. python爬虫从入门到精通-Python网络爬虫开发从入门到精通
  3. Java集合框架之 Java HashMap 源码解析
  4. 使用bash判断PATH中是否存在某个路径
  5. [数位dp] bzoj 3209 花神的数论题
  6. python pd Series 添加行_Python数据分析与挖掘的常用工具
  7. 启动go服务_内网穿透工具 FRP公网服务端、内网客户端快速配置文件说明
  8. 【Python】Numpy中对向量、矩阵的使用
  9. 信息学奥赛C++语言:判断两位数
  10. Github | 微软-计算机视觉最佳实践、代码示例和相关文档
  11. CheckStyle检查规则模板说明
  12. redis_lua_nginx环境配置过程
  13. 网络图片爬虫(几个简单步骤实现网页图片的爬取,详细步骤,超详细,简单易懂)
  14. html分享到微博,h5页面分享到微信、朋友圈、新浪微博、QQ空间、QQ好友组件
  15. 海量大数据地图可视化
  16. 【食品化学与营养】第二章 水的化学与营养 笔记
  17. 弦振动 matlab,特殊弦振动问题的MATLAB仿真.doc
  18. Java Web应用开发——作业四
  19. 电力拖动控制系统作业答案4
  20. 计算机组成(超详细)+附带思维导图

热门文章

  1. ATN开源社区基于华为云ModelArts进行AI开发的实践
  2. JWT认证方式之-System.IdentityModel.Tokens.Jwt
  3. 无人车地图激战正酣 各家虎视眈眈 谷歌这次可能有点悬了!
  4. js识别android ios9,JS判断客户端是IOS还是ANDROID
  5. K-Means聚类 和 高斯混合模型(GMM)
  6. 全球及中国生物质气化行业研究及十四五规划分析报告
  7. Java实现导出内容为PDF格式
  8. 图纸格式dwg批转pdf如何操作
  9. Xcon2014 Geekpwn2014
  10. 人体十二经络穴位口诀