Java 最简单的实现 AES 加密和解密

AES简介

AES(Advanced Encryption Standard)高级加密标准,是一种被广泛使用的对称加密算法,用于加密和解密数据。它曾经是美国政府的一个机密标准,但现在已成为公开的加密算法,并被广泛使用于商业、政府及军事领域。

AES算法有三种不同的密钥长度:128位、192位和256位,每种长度有不同数量的轮数,其中128位密钥需要进行10轮加密,192位密钥需要进行12轮加密,256位密钥需要进行14轮加密。其中,轮数指的是加密算法中处理数据的重复次数,每轮中会对数据进行代换、置换、线性变换等操作,以增强加密强度。

AES算法的加密和解密过程使用的是相同的密钥,因此被称为对称密钥加密算法。它通过将明文按照固定大小分块(128比特),并对每个块进行相同的加密操作,从而实现加密。解密时则对密文进行反向操作即可。

总体来说,AES算法具有安全、高效等优势,已成为目前最常用的加密算法之一。

一、示例

1.加密解密工具类

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;/*** @author rwy* @Title:* @Package* @Description:* @date 2023-11-22 15:37*/
@Component
public class AESEncryption {//十六位十六进制数作为秘钥(下面有提供随机生成密钥)private static final String SECRET_KEY = "mySecretKey123456";//十六位十六进制数作为秘钥偏移量(可以和前端自行商量)private static final String INIT_VECTOR = "myInitializationVector";/*** AES加密* @param originalString* @return* @throws Exception*/public static String encrypt(String originalString) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), "AES");IvParameterSpec ivParameterSpec = new IvParameterSpec(INIT_VECTOR.getBytes());cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);byte[] encryptedBytes = cipher.doFinal(originalString.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}/*** AES解密* @param encryptedString* @return* @throws Exception*/public static String decrypt(String encryptedString) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), "AES");IvParameterSpec ivParameterSpec = new IvParameterSpec(INIT_VECTOR.getBytes());cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedString));return new String(decryptedBytes);}public static void main(String[] args) {try {String originalString = "Hello, World!";String encryptedString = encrypt(originalString);System.out.println("Encrypted: " + encryptedString);String decryptedString = decrypt(encryptedString);System.out.println("Decrypted: " + decryptedString);} catch (Exception e) {e.printStackTrace();}}
}

2.AES随机生成密钥

public static void main(String[] args) {try {KeyGenerator kg = KeyGenerator.getInstance("AES");kg.init(128);//要生成多少位,只需要修改这里即可128, 192或256SecretKey sk = kg.generateKey();byte[] b = sk.getEncoded();String s = byteToHexString(b);System.out.println(s);System.out.println("十六进制密钥长度为"+s.length());System.out.println("二进制密钥的长度为"+s.length()*4);}catch (NoSuchAlgorithmException e) {e.printStackTrace();System.out.println("没有此算法。");}}public static String byteToHexString(byte[] bytes) {StringBuffer sb = new StringBuffer();for (int i = 0; i < bytes.length; i++) {String strHex=Integer.toHexString(bytes[i]);if(strHex.length() > 3) {sb.append(strHex.substring(6));} else {if(strHex.length() < 2) {sb.append("0" + strHex);} else {sb.append(strHex);}}}return sb.toString();}

二、登录实战完整代码

1.前端:

这里前端传过来的密码是加密过后

前端加密解密可参考:

vue MD5加密和AES加密方法_vue 加密_IDycy的博客-CSDN博客

2.后端

/*** 账号密码登录* @param user* @return* @throws Exception*/
@PostMapping("/cs")public Result<JSONObject> login(@RequestBody SysUser user) throws Exception {Result<JSONObject> result = new Result<JSONObject>();LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(SysUser::getUsername, user.getUsername());SysUser sysUser = sysUserService.getOne(queryWrapper);result = sysUserService.checkUserIsEffective(sysUser);if (!result.isSuccess()) {return result;}//1. 解密前端传过来的加密的密码String decryptAse = aesEncryption(user.getPassword());//2. 校验用户名或密码是否正确String userpassword = PasswordUtil.encrypt(user.getUsername(), decryptAse, sysUser.getSalt());String syspassword = sysUser.getPassword();if (!syspassword.equals(userpassword)) {result.error500("用户名或密码错误");return result;}//以下代码忽略...return result;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/207916.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验

一、项目背景 世博文化公园是上海的绿色新地标&#xff0c;是生态自然永续、文化融合创新、市民欢聚共享的大公园。作为世博地区的城市更新项目&#xff0c;世博文化公园的建设关乎上海城市风貌、上海文化展示、城市生态环境、市民游客体验、上海服务品牌等&#xff0c;被赋予…

【C语言】函数(二):函数调用与链式访问

目录 函数调用传值调用传址调用练习题 嵌套调用链式访问 函数调用 函数调用分为传值调用和传址调用 传值调用 传值调用时&#xff0c;函数的形参和实参分别有着自己的内存空间&#xff0c;形参的改变不会影响实参。在上文中说到的利用一个函数实现两个整数的交换的错误写法就是…

进程API

linux下进程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux环境运行 子进程并不是完全拷贝了父进程。具体来说&#xff0c;虽然它拥有自己的 地址空间&#xff08;即拥有自己的私有内存&#xff09;、寄存器…

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode节点类型&#xff1a; 永久节点&#xff1a;create /pa…

人工智能-循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35…

【AI】行业消息精选和分析(11月22日)

今日动态 &#x1f453; Video-LLaVA&#xff1a;视觉语言模型革新&#xff1a; - 图像和视频信息转换为文字格式。 - 多模态理解能力&#xff0c;适用于自动问答系统等。 &#x1f4c8; 百度文心一言用户数达7000万&#xff1a; &#x1f50a; RealtimeTTS&#xff1a;实时文本…

还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录 前言摩尔斯电码Python实现摩斯密码对照表加密解密测试 完整代码总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Py…

力扣.面试题 04.06. 后继者(java 树的中序遍历)

Problem: 面试题 04.06. 后继者 文章目录 题目描述思路解题方法复杂度Code 题目描述 设计一个算法&#xff0c;找出二叉搜索树中指定节点的“下一个”节点&#xff08;也即中序后继&#xff09;。 如果指定节点没有对应的“下一个”节点&#xff0c;则返回null。 思路 由于题…

「Docker」如何在苹果电脑上构建简单的Go云原生程序「MacOS」

介绍 使用Docker开发Golang云原生应用程序&#xff0c;使用Golang服务和Redis服务 注&#xff1a;写得很详细 为方便我的朋友可以看懂 环境部署 确保已经安装Go、docker等基础配置 官网下载链接直达&#xff1a;Docker官网下载 Go官网下载 操作步骤 第一步 创建一个…

【SpringBoot】ThreadLocal 的详解

一、ThreadLocal 简介 ThreadLocal 叫做线程变量&#xff0c;意思是 ThreadLocal 中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal 为变量在每个线程中都创建了一个副本&#xff0c;那么每个线…

虚拟机centos设置网络模式(桥接|NAT)

前言 桥接模式是通过物理网卡直接与外部网络建立联系的&#xff0c;而NAT模式则是通过虚拟网卡VMnet1或VMnet8通过宿主机共享IP与外部建立网络关系当需要将虚拟机资源共享给局域网用户使用时&#xff0c;宜采用桥接模式&#xff1b;当需要保护虚拟机资源&#xff0c;确保只能由…

封面从这里取好啦

文章目录 前端NPMViteNode.js 后端JavaMavenPython 数据库算法 前端 NPM Vite Node.js 后端 Java Maven Python 数据库 算法