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

Aes加解密

加解密概念

  • 加密
    • AES加密
      • 填充模式
      • 加密模式
      • 示例

加密

通过一系列计算将明文转换成一个密文。
加密和解密的对象通常是字节数组(有的语言动态数组类比切片

加密后的数据,可能有很多是不可读字符。通常会将其转换为可见的字符串。

  • 直接将字节数组转为16进制的字符串(一个字节8位,4位表示一个16进制数据,因此转换后的数据是转换前字节数组的2倍长度,之所以采用16进制是因为其看起来更加紧凑)
  • 将字节数组进行Base64编码

AES加密

算法相关常量在类Cipher的注释中有说明。

AES是一种对称加密算法。具体加密方式是以16字节一块进行分块加密。
如果明文长度不是16的倍数,那么则需要进行填充,这就引申出了填充模式。
其密钥长度要求为 128 位(16字节)、192(24字节) 位和 256(32字节) 位,三种,越长越安全,速度越慢

填充模式

常用填充模式:PKCS#5、PKCS#7。在Java中已经将其行为统一了。
在模式的定义上:

  • PKCS#5用于8字节块为单位的加密场景
  • PKCS#7用于非8字节块为单位的加密场景,在现代应用中更通用
    但是它们的实现方式都是类似的,剩余的字节数组长度距离加密块差几个字节,就填充几个字节,而且每一位值也是这个长度

比如剩下5字节,在AES中,是以16字节为单位,差11个字节。那么就会在这5个字节后面加11个项,而且每一项的值都是11

加密模式

AES中现在用得最多的就是CBC模式.
这种方式在加密一个块时,需要使用上一个块加密后的数据与当前明文块进行异或运算。也就是说每一个块的加密都不一样。
这就有一个点,第一个加密块前面没有数据块,所以我们需要指定一个初始向量(有的也称之为偏移量)(其长度就是一个数据块的长度)

示例

  • 加密(如果使用的是CBC模式,则需要指定初始向量(说白了就是手动创建加密块,因此也是长度为16的字节数组),
  1. 生成iv(如果是CBC模式,则需要。长度与加密块一致(16字节))
// 如果是CBC模式 首先生成iv向量(本质就是一个长度为16的字节数组,随便怎么构建)
// 可以自行创建16字节的数组,但推荐生成随机iv
// 自行构建
String ivStr = "1111111111111111"
byte[] iv = ivStr.getBytes(StandardCharsets.UTF_8);// 生成随机iv
SecureRandom secureRandom = new SecureRandom();
byte[] iv = new byte[16];
secureRandom.nextBytes(iv);IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
  1. 生成密钥
    AES密钥支持16字节、24字节、32字节(越长越安全,运算速度越慢)
    与iv类似,可以自定义密钥串,然后构建密钥对象,也可以直接生成指定长度的随机密钥
// 指定密钥串,构建密钥对象
String key = "0111111111111111";
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");// 生成指定长度的密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
  1. 创建加密器,在java中通过聚合名称指定多项配置(AES/CBC/PKCS7Padding它制定了加密算法、加密模式、填充模式
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
  1. 初始化加密器。指定加密还是解密,密钥,初始向量
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
  1. 执行加解密。参数和返回都是字节数组
byte[] resByte = cipher.doFinal(s.getBytes(StandardCharsets.UTF_8));
  1. 以上加密结果可能会有一些不可读的字符,因此为了方便查看,存储,传输等,我们常常将字节数组转为16进制字符串或者Base64进行存储,传输。
    不仅是加密结果。随的的生成iv字节数组,随机生成密钥字节数组 等包含不可读字符的字节数组都可以采用这种方式进行分发,存储
  • Base64编解码
// 字节数组编码为Base64字符串
String encodedKey = Base64.getEncoder().encodeToString(encoded);// Base64字符串解码为字节数组
byte[] keyBytes = Base64.getDecoder().decode(encodedKey);
  • 16进制编解码
// 字节数组编码为16进制字符串
public String byte2Hex(byte[] bytes) {int len = bytes.length;StringBuilder builder = new StringBuilder();for (int i = 0, j = 0; i < len; i++) {builder.append(Integer.toHexString((0xF0 & bytes[i]) >>> 4));builder.append(Integer.toHexString(0x0F & bytes[i]));}return builder.toString();
}// 16进制字符串转字节数组
public byte[] hexToBytes(String s) {byte[] bytes = new byte[(s.length() + 1) >> 1];for (int i = 0, j = 0; i < bytes.length; i++) {int left = Character.digit(s.charAt(j++), 16) << 4;left = left | Character.digit(s.charAt(j++), 16);bytes[i] = (byte) (left & 0xff);}return bytes;
}

相关文章:

Aes加解密

加解密概念 加密AES加密填充模式加密模式示例 加密 通过一系列计算将明文转换成一个密文。 加密和解密的对象通常是字节数组&#xff08;有的语言动态数组类比切片&#xff09; 加密后的数据&#xff0c;可能有很多是不可读字符。通常会将其转换为可见的字符串。 直接将字节…...

【时时三省】Tessy 故障入侵 使用教程

目录 1,故障入侵 介绍 故障入侵适用场景: 打故障入侵的方法和选项介绍: 2,打单个函数的故障入侵 3,打整体用例的故障入侵 4,一个函数打多个故障入侵 山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 1,故障入侵 介绍 故障入侵适用场景: 故障入侵 …...

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…...

CondaValueError: Malformed version string ‘~‘: invalid character(s).

问题描述&#xff1a;在window下使用conda安装任何包都会报错。报错信息是CondaValueError: Malformed version string ~: invalid character(s). 解决办法&#xff1a;把.condarc文件的源地址删除&#xff08;八成是源地址访问不了了&#xff09;&#xff0c;只保存默认的&am…...

01-Ubuntu24.04LTS上安装PGSQL

目录 一、准备工作 1.1、系统要求 1.2 、更新 Ubuntu 系统 1.3 、安装依赖 1.4 、添加 PostgreSQL 16 软件源 二、安装 PostgreSQL 16 数据库 三、管理 PostgreSQL 服务 四、PostgreSQL 管理操作 4.1 、访问 Postgres 超级用户账户 4.2 、创建数据库并设置管理权限 4…...

Esp32使用micropython基于espnow实现语音对讲机

ESP-NOW协议介绍 ESP-NOW 是乐鑫自主研发的无连接通信协议,具有短数据包传输功能。该协议使多个设备能够以简单的方式相互通信。ESP-NOW 支持以下功能: 加密和未加密的单播通信; 混合加密和未加密的对等设备; 最多可携带 250 字节 的有效载荷; 发送回调功能,可以设置用于…...

Docker 容器隔离关键技术:SELinux

Docker 容器隔离关键技术&#xff1a;SELinux SELinux&#xff08;Security-Enhanced Linux&#xff09; 是 Linux 内核中的一项安全机制&#xff0c;用于实现强制访问控制&#xff08;MAC&#xff09;。Docker 利用了 SELinux 来增强容器的隔离性&#xff0c;通过对文件、进程…...

Java并发07之ThreadLocal

文章目录 1 ThreadLocal原理2 内部结构3 内存泄露问题4 entry的key为什么被设计为弱引用 1 ThreadLocal原理 ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private st…...

【单细胞数据库】癌症单细胞数据库CancerSEA

数据库地址&#xff1a;home (hrbmu.edu.cn) Cite Huating Yuan, Min Yan, Guanxiong Zhang, Wei Liu, Chunyu Deng, Gaoming Liao, Liwen Xu, Tao Luo, Haoteng Yan, Zhilin Long, Aiai Shi, Tingting Zhao, Yun Xiao, Xia Li, CancerSEA: a cancer single-cell state atlas…...

Rsa加解密 + 签名验签

Rsa加解密 概述聚合算法名称&#xff08;用于创建加密器&#xff09;基本概念填充方式分块加密 基本使用生成密钥加解密创建加密器设置模式&#xff08;加密&#xff09;、公钥对明文加密&#xff0c;并对结果进行Base64编码对以上结果&#xff0c;进行解密 设置模式&#xff0…...

bugku-web-留言板1

大小写绕过也不行 <ScRipt>ALeRt(“XSS”);</sCRipT> 双写绕过可以 <scscriptript>alert(z)</scscriptript> 改变大小写 在测试过程中&#xff0c;我们可以改变测试语句的大小写来绕过XSS规则&#xff1a; 比如&#xff1a;<script>alert(“xs…...

进程状态的学习

进程状态就是 task_struct 内的一个整数 状态间是可以进行转化的 运行&#xff1a; 每一个框都是进程的task_struct&#xff0c;都有唯一的pcb和pid来标识它的唯一性 让CPU选择一个进程去运行&#xff0c;本质是选择一个进程的PCB去运行&#xff0c;task_struct里一定有内存指…...

Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)

Vue 2.0-&#xff1e;3.0学习笔记&#xff08;Vue 3 &#xff08;四&#xff09;- Composition API 的优势&#xff09; Composition API 的优势1. Options API 存在的问题2. Composition API 的优势 Composition API 的优势 1. Options API 存在的问题 笔记 使用传统OptionsA…...

close and shutdown?

背景&#xff1a;我们要讲述的是网络编程中常用的两个API&#xff1a; #include <unistd.h> int close(int fd); #include <sys/socket.h> int shutdown(int sockfd, int how); 以及TCP的半连接&#xff0c;半打开。 shutdown函数的行为依赖第二个参数区分&#xf…...

PostgreSQL + hasura + Apollo + GraphQL + React + Antd

技术栈 PostgreSQL hasura Apollo GraphQL React Antd 适用于复杂的查询,快速开发 环境安装 安装PostgreSQL hasura,使用docker安装 使用 Docker Compose 部署时&#xff0c;它会同时启动两个容器PostgreSQL和 Hasura GraphQL ,如下 version: "3.6" serv…...

Android笔记【10】

一、前言 学习课程时&#xff0c;对于自己不懂的点的记录。 二、内容 学习一段代码&#xff1a; val drawerState rememberDrawerState(DrawerValue.Closed)val scope rememberCoroutineScope()Scaffold (topBar{TopAppBar(navigationIcon {IconButton(onClick {scope.lau…...

Leetcode打卡:N皇后

执行结果&#xff1a;通过 题目&#xff1a;51 N皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...

Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体

目录 1. struct clk_hw 2. struct clk_ops 3. struct clk_core 4. struct clk_notifier 5. struct clk 6. struct clk_gate 7. struct clk_divider 8. struct clk_mux 9. struct clk_fixed_factor 10. struct clk_fractional_divider 11. struct clk_multiplier 12…...

[Deep Learning] 深度学习中常用函数的整理与介绍(pytorch为例)

文章目录 深度学习中常用函数的整理与介绍常见损失函数1. L2_loss | nn.MSELoss()公式表示&#xff1a;特点&#xff1a;应用&#xff1a;缺点&#xff1a;主要参数&#xff1a;示例用法&#xff1a;注意事项&#xff1a; 2. L1 Loss | nn.L1Loss数学定义&#xff1a;特点&…...

【ETCD】etcd简单入门之单节点部署etcd

etcd 是一个分布式可靠的键值存储系统&#xff0c;用于分布式系统中最关键的数据&#xff0c;主要特点包括&#xff1a; 简单&#xff1a;具有明确的、面向用户的 API&#xff08;gRPC&#xff09; 安全&#xff1a;自动 TLS 支持&#xff0c;并可选的客户端证书认证 快速&am…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...