当前位置: 首页 > news >正文

JAVA AES ECB/CBC 加解密

JAVA AES ECB/CBC 加解密

  • 1. AES ECB
  • 2. AES CBC

1. AES ECB

package org.apache.jmeter.functions;/*** @author yuyang*/import org.apache.commons.lang3.StringUtils;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;/*** @author heartingme* @date 2023/1/10 9:20 下午* movingbrick*/
public class AES_ECB {/*** 编码*/private static final String ENCODING = "UTF-8";/*** 算法定义*/private static final String AES_ALGORITHM = "AES";/*** 指定填充方式*/private static final String CIPHER_PADDING = "AES/ECB/PKCS5Padding";/*** AES加密** @param content 待加密内容* @param aesKey  密码* @return*/public static String encrypt(String content, String aesKey) {if (StringUtils.isBlank(content)) {return null;}//判断秘钥是否为16if (StringUtils.isNotBlank(aesKey) && aesKey.length() == 16) {try {//对密码进行编码byte[] bytes = aesKey.getBytes(ENCODING);//设置加密算法,生成秘钥SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);// "算法/模式/补码方式"Cipher cipher = Cipher.getInstance(CIPHER_PADDING);//选择加密cipher.init(Cipher.ENCRYPT_MODE, skeySpec);//根据待加密内容生成字节数组byte[] encrypted = cipher.doFinal(content.getBytes(ENCODING));//返回base64字符串Base64.Encoder encoder = Base64.getEncoder();return encoder.encodeToString(encrypted);} catch (Exception e) {throw new RuntimeException(e);}} else {return "secret key length should be i6";}}/*** 解密** @param content 待解密内容* @param aesKey  密码* @return*/public static String decrypt(String content, String aesKey) {if (StringUtils.isBlank(content)) {return null;}//判断秘钥是否为16if (StringUtils.isNotBlank(aesKey) && aesKey.length() == 16) {try {//对密码进行编码byte[] bytes = aesKey.getBytes(ENCODING);//设置解密算法,生成秘钥SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);// "算法/模式/补码方式"Cipher cipher = Cipher.getInstance(CIPHER_PADDING);//选择解密cipher.init(Cipher.DECRYPT_MODE, skeySpec);//先进行Base64解码Base64.Decoder decoder = Base64.getDecoder();byte[] decodeBase64 = decoder.decode(content);//根据待解密内容进行解密byte[] decrypted = cipher.doFinal(decodeBase64);//将字节数组转成字符串return new String(decrypted, ENCODING);} catch (Exception e) {throw new RuntimeException(e);}} else {return "secret key length should be i6";}}public static void main(String[] args) {// AES支持三种长度的密钥:128位、192位、256位。// 代码中这种就是128位的加密密钥,16字节 * 8/字节 = 128位。String random = "Dig1234ctidHuma3";System.out.println("密钥key:" + random);System.out.println("---------解密---------");String decrypt = decrypt(aesResult, random);System.out.println("aes解密结果:" + decrypt);}
}

输出结果

密钥key:Dig1234ctidHuma3
---------加密---------
aes加密结果:X9kwt0EG+CmNc05gaSV1RLpP4c+6kT6LoJRI9U4o9Y/yqQ4pHae34Wl4gq9h3IvO1A8Ah8VfOqnCy2IJy09EzQ==
---------解密---------
aes解密结果:{"token":"0e84b297-d8f2-4779-b7f1-60966ed19ce1"}

2. AES CBC

package org.apache.jmeter.functions;
/*** @author heartingme* @date 2023/1/10 4:25 下午* movingbrick*/
import org.apache.commons.lang3.StringUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;/*** @author heartingme* @date 2023/1/10 9:20 下午* movingbrick*/
public class AES_CBC {/*** 编码*/private static final String ENCODING = "UTF-8";/*** 算法定义*/private static final String AES_ALGORITHM = "AES";/*** 指定填充方式*/private static final String CIPHER_CBC_PADDING = "AES/CBC/PKCS5Padding";/*** 偏移量(CBC中使用,增强加密算法强度)*//*** AES_CBC加密** @param content 待加密内容* @param aesKey  密码* @return*/public static String encryptCBC(String content, String aesKey, String ivSeed) {if (StringUtils.isBlank(content)) {System.out.println("AES_CBC encrypt: the content is null!");return null;}//判断秘钥是否为16if (StringUtils.isNotBlank(aesKey) && aesKey.length() == 16) {try {//对密码进行编码byte[] bytes = aesKey.getBytes(ENCODING);//设置加密算法,生成秘钥SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);// "算法/模式/补码方式"Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);//偏移IvParameterSpec iv = new IvParameterSpec(ivSeed.getBytes(ENCODING));//选择加密cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);//根据待加密内容生成字节数组byte[] encrypted = cipher.doFinal(content.getBytes(ENCODING));//返回base64字符串Base64.Encoder encoder = Base64.getEncoder();return encoder.encodeToString(encrypted);} catch (Exception e) {System.out.println("AES_CBC encrypt exception:" + e.getMessage());throw new RuntimeException(e);}} else {System.out.println("AES_CBC encrypt: the aesKey is null or error!");return null;}}/*** AES_CBC解密** @param content 待解密内容* @param aesKey  密码* @return*/public static String decryptCBC(String content, String aesKey, String ivSeed) {if (StringUtils.isBlank(content)) {System.out.println("AES_CBC decrypt: the content is null!");return null;}//判断秘钥是否为16if (StringUtils.isNotBlank(aesKey) && aesKey.length() == 16) {try {//对密码进行编码byte[] bytes = aesKey.getBytes(ENCODING);//设置解密算法,生成秘钥SecretKeySpec skeySpec = new SecretKeySpec(bytes, AES_ALGORITHM);//偏移IvParameterSpec iv = new IvParameterSpec(ivSeed.getBytes(ENCODING));// "算法/模式/补码方式"Cipher cipher = Cipher.getInstance(CIPHER_CBC_PADDING);//选择解密cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);//先进行Base64解码Base64.Decoder decoder = Base64.getDecoder();byte[] decodeBase64 = decoder.decode(content);//根据待解密内容进行解密byte[] decrypted = cipher.doFinal(decodeBase64);//将字节数组转成字符串return new String(decrypted, ENCODING);} catch (Exception e) {System.out.println("AES_CBC decrypt exception:" + e.getMessage());throw new RuntimeException(e);}} else {System.out.println("AES_CBC decrypt: the aesKey is null or error!");return null;}}public static void main(String[] args) {// AES支持三种长度的密钥:128位、192位、256位。// 代码中这种就是128位的加密密钥,16字节 * 8/字节 = 128位。String srt = "Dig1693cti23fga3";String iv_seed = "1234567829387469";System.out.println("密钥key:" + srt);System.out.println("iv:" + iv_seed);System.out.println("--------AES_CBC加密解密---------");String aes ="{\"token\":\"0e84b297-d8f2-4779-b7f1-60966ed19ce1\"}";String cbcResult = encryptCBC(aes, srt, iv_seed);System.out.println("aes_cbc加密结果:" + cbcResult);System.out.println();System.out.println("---------解密CBC---------");String cbcDecrypt = decryptCBC(cbcResult, srt, iv_seed);System.out.println("aes解密结果:" + cbcDecrypt);System.out.println();}}

输出结果

密钥key:Dig1693cti23fga3
iv:1234567829387469
--------AES_CBC加密解密---------
aes_cbc加密结果:37qW7JuF+Ck+CzAtAlxOzbUC4n0BFMUB+XirmFIHhoxcrRoQDR4fw14hvSDWaywRskjKRcSADjxLuwPKsq6fTw==---------解密CBC---------
aes解密结果:{"token":"0e84b297-d8f2-4779-b7f1-60966ed19ce1"}
http://www.lryc.cn/news/125786.html

相关文章:

  • Android FrameWork 层 Handler源码解析
  • list
  • ABeam×Startup丨德硕管理咨询(深圳)创新研究团队前往灵境至维·既明科技进行拜访交流
  • TCP的相关性质
  • pointpillars在2D CNN引入自适应注意力机制
  • 【每日一题】1572. 矩阵对角线元素的和
  • leetcode原题:检查子树
  • 2023年国赛数学建模思路 - 案例:ID3-决策树分类算法
  • 可视化绘图技巧100篇进阶篇(七)-三维堆积柱形图(3D Stacked Bar Chart)
  • React源码解析18(7)------ 实现事件机制(onClick事件)
  • Android app专项测试之耗电量测试
  • 设计模式-面试常问
  • 聊聊在集群环境中本地缓存如何进行同步
  • 【C++深入浅出】初识C++上篇(关键字,命名空间,输入输出,缺省参数,函数重载)
  • 租房合同范本
  • 轻薄的ESL电子标签有哪些特性?
  • AI 实力:利用 Docker 简化机器学习应用程序的部署和可扩展性
  • 商用汽车转向系统常见故障解析
  • Python中的MetaPathFinder
  • 工控机防病毒
  • LangChain手记 Question Answer 问答系统
  • 如何优化css中的一些昂贵属性
  • 基于安防监控EasyCVR视频汇聚融合技术的运输管理系统的分析
  • 在WordPress站点中展示阅读量等流量分析数据(超详细实现)
  • 学习 Iterator 迭代器
  • JVM---垃圾回收算法介绍
  • Ubuntu一直卡死的问题(20.04)
  • 自动化测试用例设计实例
  • CSS3基础
  • 【栈】 735. 行星碰撞