简单AES加解密Demo——带你了解AES

news2024/11/30 2:37:40

1.AES简介

        AES的全称是Advanced Encryption Standard,意思是高级加密标准。它的出现主要是为了取代DES加密算法的,因为我们都知道DES算法的密钥长度是56Bit,因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,虽然出现了3DES的加密方法,但由于它的加密时间是DES算法的3倍多,64Bit的分组大小相对较小,所以还是不能满足人们对安全性的要求。于是1997年1月2号,美国国家标准技术研究所宣布希望征集高级加密标准,用以取代DES。AES也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。

        在密码标准征集中,所有AES候选提交方案都必须满足以下标准:

  • 分组大小为128位的分组密码。
  • 必须支持三种密码标准:128位、192位和256位。
  • 比提交的其他算法更安全。
  • 在软件和硬件实现上都很高效。

        AES密码与分组密码Rijndael基本上完全一致,Rijndael分组大小和密钥大小都可以为128位、192位和256位。然而AES只要求分组大小为128位,因此只有分组长度为128Bit的Rijndael才称为AES算法。本文只对分组大小128位,密钥长度也为128位的Rijndael算法进行分析。密钥长度为192位和256位的处理方式和128位的处理方式类似,只不过密钥长度每增加64位,算法的循环次数就增加2轮,128位循环10轮、192位循环12轮、256位循环14轮。

2.AES具体数学知识

        略....感兴趣同学可以自行查资料

3.AES加解密重要构成

1.密钥

        密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。AES支持三种长度的密钥:128位,192位,256位。平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

2.填充

        要想了解填充的概念,我们先要了解AES的分组加密特性。什么是分组加密呢?我们来看看下面这张图:AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

        填充涉及以下三种填充模式:

NoPadding:

        不做任何填充,但是要求明文必须是16字节的整数倍。

PKCS5Padding(默认):

        如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:

        如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

4.Java代码Demo

接口api代码如下:

controller层:

 

service接口: 

impl实现类: 

工具类:

package com.example.demo.utils;

import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;


@Component
public class AESUtil {
    private static final String IV = "3412566146136412";
    private static final String ENCODING = "UTF-8";
    private static final String SECRET_KEY = "1234234234234112";

    /**
    * AES Decrypt Method
    *
     * @param ciphertext the text need to decrypt
     * @return cleartext
    * */
    public static String decrypt(String ciphertext) {
        byte[] buffer;
        byte[] bytes = Base64.getDecoder().decode(ciphertext);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
        SecretKeySpec secretKeySpec = new SecretKeySpec(AESUtil.SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,ivParameterSpec);
            buffer = cipher.doFinal(bytes);
            return new String(buffer,ENCODING);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * AES Encrypt Method
     *
     * @param cleartext the text need to decrypt
     * @return ciphertext
     * */
    public static String encrypt(String cleartext){
        try{
            byte[] raw = AESUtil.SECRET_KEY.getBytes(StandardCharsets.UTF_8);
            SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec ivParameterSpec = new IvParameterSpec(AESUtil.IV.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
            byte[] bytes = cipher.doFinal(cleartext.getBytes(StandardCharsets.UTF_8));
            return new BASE64Encoder().encode(bytes);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 测试类:

得到结果如下: 

启动服务,我们用postman验证 

前方介绍文字摘自知乎:密码学基础:AES加密算法 - 知乎

什么是AES加密?详解AES加密算法原理流程 - 知乎 

代码原创手打不易 ,谢谢关注

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

外包的水太深了,18k的阿里外包不太敢去.....

有挺多测试员曾在BAT、网易这些大厂做过外包,想必大家也是非常关心此类问题,我就想介绍下“什么是外包?”,“外包公司的现状”,就“为什么这么多人鄙视外包测试岗?”、”阿里18K的外包测试岗能去吗&#xf…

phpstudy搭建dvwa(以及搭建dvwa问题解决)

目录 phpstudy 下载 问题解决 启动问题 DVWA 下载 安装 配置 phpstudy 下载 小皮面板(phpstudy) - 让天下没有难配的服务器环境! (xp.cn) 问题解决 启动问题 要使用dvwa靶场,Apache和myql都是需要启动的,但是可能会遇到mysql启动不…

三大抽样分布

1.三大抽样分布 本人博客:总体分布、样本分布、抽样分布的区别 每一个样本统计量(本质是随机变量)都有一个分布 以样本平均数为例,它是总体平均数的一个估计量,如果按照相同的样本容量,相同的抽样方式&am…

LVS负载均衡群集——NAT模式实例

目录 一、集群与分布式1.1 集群的含义1.2 LVS模型1.3 系统性能扩展方式1.4 群集的三种类型1.4.1 负载均衡群集1.4.2 高可用群集1.4.3 高性能运算群集 1.5 LVS 的负载调度算法①轮询(Round Robin)②加权轮询(Weighted Round Robin)…

电脑重装系统到一半遇到死机该如何解决

在进行电脑重装系统的过程中,有时会遇到系统卡住不动的情况,让人苦恼不已。本文将为您解析电脑重装系统中途卡住的原因,并提供有效的解决方法,帮助您顺利完成系统重装。 工具/原料: 系统版本:windows10专业…

.Net Core 6 WebApi 项目搭建(二)

书接上文,上文写了个简单的.net core api程序创建流程,今天来写一下简单项目搭建步骤。 一.Autofac反射程序集方式服务注册 我们这里还是使用Autofac容器,具体使用教程可参考文章《.NET Core基础知识-依赖注入(Autofac&#xff…

七、进程程序替换

文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…

node.js卸载、安装、配置详解

node.js卸载、安装、配置详解 一、 node.js卸载二、下载安装2.1 下载2.2 安装2.2.1 选择msi安装2.2.2 选择zip安装 三、配置3.1 环境变量配置3.2 修改缓存、全局模块路径3.3 全局安装3.4 设置淘宝镜像3.5 全局安装 四、node-red安装及配置 一、 node.js卸载 第一步&#xff1a…

Salesforce顾问如何实现逆袭成为公司CIO?

Salesforce是一个适用于所有业务流程的绝佳平台,它的设置方式意味着使用者可以培养出独特的技能。其中一些从业者非常适合担任高管,Trailblazers通常会晋升到高层职位。 本文将帮助Trailblazers了解职位晋升需要的能力,为Salesforce之旅做好…

【大数据原理与技术】期末习题总结大全,建议收藏

【大数据原理与技术】期末习题总结大全,建议收藏 📢📢题目来源于B站,慕课网,百度 ,适用于期末复习,内容仅供参考,祝大家考试顺利! 📢以下思维导图我是根据我们…

LiveGBS国标GB/T28181流媒体平台功能-作为下级国标平台级联到第三方海康大华宇视华为等国标平台及其它政务公安内网国标视频平台

LiveGBS国标GB/T28181流媒体平台功能-作为下级国标平台级联到第三方海康大华宇视华为等国标平台及其它政务公安内网国标视频平台 1、GB/T28181级联是什么2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入…

固定翼、免像控、相对精度优于10cm,农村不动产项目验证

前言 在航测外业作业中,布设相控点应该是耗时最多的工作,繁琐而辛苦。本次,中水成勘院联合成都睿铂,以睿铂DG4pros五镜头倾斜相机为载荷,纵横CW10型固定翼无人机为载机,共同进行免像控相对精度项目验证。希…

软件测试常见的20个误区,你真的了解吗?

常见的20个误区 今天分享软件测试中常遇到的 20 个误区,争取能给想从事软件测试的小伙伴一点启发。 1、测试人员不需要了解软件开发知识 抛开自动化测试,测试开发等,这些是必须要学习软件开发知识。功能测试和接口测试等还是需要软件开发知…

VUE3-组件问题

VUE3-组件问题 文章目录 VUE3-组件问题一、S-Table1.问题描述2.问题展示3.问题解决 二、form表单无法显示1.问题描述2.问题展示3.问题解决 一、S-Table 1.问题描述 一个页面存在两个S-table,经检查均无误,第一个S-Table刷新可用,第二个刷新…

迷茫了5年:做完这个测试项目,我终于决定跳槽!

2023年早已过半,来个迟到的年中总结,说实话,2023,很迷茫,然后过的非常不如意,倒不是上一年的职业目标没达到,而是接下来的路根本不知道如何走。在没解决这个问题之前,或者说没搞清楚…

numpy知识点总结

numpy 基本介绍 ufunc 接口方法的基础 reduce,聚合方法 accumulate,累计聚合 reduceat,按指定轴向、指定切片聚合 outer:外积 ndarray 数据结构的基础 数组的创建 特定的函数结构 从特定库函数创建 random系列 特定的结构创建数…

9. 支持向量机(SVM)

9.1 优化目标 在逻辑回归中做一些小改动变成支持向量机。 如果观察逻辑回归的代价函数,会发现每个样本(x,y)都会为总的代价函数增加如下图这一项。因此对于总的代价函数,我们通常对所有的训练样本从第1项到第m项进行求和。 图中的这一表达式就代表每个单…

CnOpenData小巨人和单项冠军企业专利及引用被引用数据

一、数据简介 专精特新”一词最早来源于2011年7月,由时任工信部总工程师朱宏任在《中国产业发展和产业政策报告(2011)》新闻发布会上首次提出。“专精特新”是指具备专业化、精细化、特色化、创新型四大优势的企业。根据工信部的定义&#xf…

单层玻璃隔断移门轨道滑轮如何安装

在家居装修中,隔断是不可或缺的一部分。而单层玻璃隔断因其时尚美观和装修效果好,备受人们的喜爱。在单层玻璃隔断中,移门轨道和滑轮的选择及安装也是至关重要的一环。下面,阁瑞活动隔断就为大家详细介绍一下单层玻璃隔断移门轨道…

javaScript蓝桥杯----年度明星项⽬

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 作为前端开发的主⼒语⾔, JavaScript 相关的开源项⽬是每⼀个前端开发者都应该多多关注的。我们可以通过这⼀年新增 star 的数量来判断⼀个开源项⽬的流⾏趋势。 本题请实现⼀个展示 2022 年 JavaScript 明…