AES加密中的CBC和ECB

目录

1.说明

2.ECB模式(base64)

3.CBC模式

4.总结


1.说明

AES是常见的对称加密算法,加密和解密使用相同的密钥,流程如下:

主要概念如下:

①明文

②密钥

用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过加密算法(如非对称加密或者md5加密等)加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

③加密函数

将明文,密钥及IV变量作为参数,生成加密后的密文,有的加密模式没有IV变量

④解密函数

将密文,密钥及IV变量作为参数,生成解密后的明文,有的加密模式没有IV变量

⑤密文

2.加密模式的组成

①密钥长度

分为AES128,AES192,AES256。

AES128:要求密钥长度为16个字节,分为四行四列的矩阵。

AES192:要求密钥长度为24个字节,分为四行六列的矩阵。

AES256:要求密钥长度为32个字节,分为四行八列的矩阵。

②加密模式

ECB,CBC,CFB,OFB,CTR,CCM,GCM,XTS

③填充模式

 AES加密是以16个字节为一组进行分组加密,要求明文的长度一定是16个字节的整数倍,如果不够16个字节的倍数,需要按照填充模式进行填充。填充模式如下:

NONE:不填充,要求明文长度必须是16个字节的整数倍。

PKCS7:缺多少就补充多少个字节数量。

ZERO:缺多少就补充多少个字节的0。

ANSI923:最后一个字节填充缺少的数量,其他字节填充0。

ISO7816_4:填充的第一个字节为16进制的0x80,其他字节填充0。

ISO10126:最后一个字节填充缺少的数量,其他字节填充随机数。

注意:当明文长度已经是16个字节的整数倍时,当填充模式为NONE以外的模式时,也会进行填充,填充16个16。

2.ECB模式(base64)

加密执行流程:

(1)前端加密及解密

①引入依赖

npm install crypto-js 

②加密及解密的工具类

import CryptoJS from 'crypto-js'// ECB模式
export function Encrypt(word,key) {let srcs = CryptoJS.enc.Utf8.parse(word);let keyInfo = CryptoJS.enc.Utf8.parse(key);let encrypted = CryptoJS.AES.encrypt(srcs, keyInfo, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7})
//返回base64格式的加密结果return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}export function Decrypt(word,key) {let keyInfo = CryptoJS.enc.Utf8.parse(key);let base64 = CryptoJS.enc.Base64.parse(word);let srcs = CryptoJS.enc.Base64.stringify(base64);const decrypt = CryptoJS.AES.decrypt(srcs, keyInfo, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);return decryptedStr;
}

密钥长度必须是16个字节,24个字节或者32个字节,如果不是,可以进行加密,但是不能进行解密。

前端填充方式:

        /*** Padding namespace.*/export namespace pad {/*** PKCS #5/7 padding strategy.*/const Pkcs7: Padding;/*** ANSI X.923 padding strategy.*/const AnsiX923: Padding;/*** ISO 10126 padding strategy.*/const Iso10126: Padding;/*** ISO/IEC 9797-1 Padding Method 2.*/const Iso97971: Padding;/*** Zero padding strategy.*/const ZeroPadding: Padding;/*** A noop padding strategy.*/const NoPadding: Padding;}

(2)后端加密及解密

①引入依赖

        <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency>

②后端加密及解密工具类

package com.example.utils;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;/*** ECB加解密工具类*/
public class AesTool {private static String ALGO = "AES";private static byte[] keyValue = "TD2g45EfXqGnBLaXpzPZ6A==".getBytes();/*** <p>description: 加密</p >* <p>param: [Data] </p >* <p>return: java.lang.String </p >* <p>author: zhangcj </p >* <p>date: 2021/12/29 </p >*/public static String encrypt(String data) {try {Key key = generateKey();Cipher c = Cipher.getInstance(ALGO);c.init(1, key);byte[] encVal = c.doFinal(data.getBytes());String encryptedValue = Base64.encodeBase64String(encVal);return encryptedValue;} catch (Exception var5) {throw new RuntimeException(var5);}}// public static String decrypt(String encryptedData, String keyValue) {//     try {//         Key key = generateKey(keyValue);//         Cipher c = Cipher.getInstance(ALGO);//         c.init(2, key);//         byte[] decordedValue = Base64.decodeBase64(encryptedData);//         byte[] decValue = c.doFinal(decordedValue);//         String decryptedValue = new String(decValue);//         return decryptedValue;//     } catch (Exception var6) {//         throw new RuntimeException(var6);//     }// }public static String decrypt(String content,String password) throws Exception {byte[] contentNew = Base64.decodeBase64(content);SecretKeySpec skeySpec = new SecretKeySpec(password.getBytes("UTF-8"), "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // "算法/模式/补码方式"cipher.init(Cipher.DECRYPT_MODE, skeySpec);return new String(cipher.doFinal(contentNew));}private static Key generateKey() throws Exception {Key key = new SecretKeySpec(keyValue, ALGO);return key;}private static Key generateKey(String key) throws Exception {return new SecretKeySpec(key.getBytes(), ALGO);}
}

③调用方式

        String decrypt = AesTool.decrypt("D5DT/9wwi89s0ny9VYwMTA==", "5bzMeuzs2XQfG8QFyx1hGg==");System.out.println(decrypt);

(3)说明

 ECB模式加密,将明文及密钥通过CryptoJS.enc.Utf8.parse进行转换,将UTF8编码的字符串转换为字节数组,然后加密模式及填充方式,最后生成密文。

密文分为两种格式,一种是base64,另一种是hex。

前端加密之后,后端进行解密时,首先根据前端的密文格式,将密文转换成字节数组,再设置和前端一致的模式和补充方式进行解密。

ECB模式加密安全性较低,但性能很高,相同的明文段加密后的密文一致。

前端加密需要的密钥可以由后端生成,生成方式如下:

        // 方式1KeyGenerator keyGen = KeyGenerator.getInstance("AES");keyGen.init(128);SecretKey secretKey = keyGen.generateKey();byte[] keyBytes = secretKey.getEncoded();String key = Base64.getEncoder().encodeToString(keyBytes);System.out.println(key);// 方式2SecureRandom secureRandom = new SecureRandom();KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128, secureRandom);byte[] key2 = keyGenerator.generateKey().getEncoded();String base64Key = java.util.Base64.getEncoder().encodeToString(key2);System.out.println(base64Key);

主要分为两步:生成一个随机的AES密钥;将密钥已base64编码的形式保存或传输。

3.CBC模式

(1)前端加密及解密

①引入依赖

npm install crypto-js 

②加密及解密工具类

import CryptoJS from 'crypto-js'// CBC模式
export function Encrypt1(word,key,iv) {let srcs = CryptoJS.enc.Utf8.parse(word);let keyInfo = CryptoJS.enc.Utf8.parse(key);let ivInfo = CryptoJS.enc.Utf8.parse(iv);let encrypted = CryptoJS.AES.encrypt(srcs, keyInfo, {iv: ivInfo ,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7})return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
export function Decrypt1(word,key,iv) {let keyInfo = CryptoJS.enc.Utf8.parse(key);let ivInfo = CryptoJS.enc.Utf8.parse(iv);let base64  = CryptoJS.enc.Base64.parse(word);let srcs = CryptoJS.enc.Base64.stringify(base64);const decrypt = CryptoJS.AES.decrypt(srcs, keyInfo, {iv: ivInfo ,mode: CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);return decryptedStr;
}

 (2)后端加密及解密

①引入依赖

        <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency>

②加密及解密工具类

package com.example.utils;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;/*** @Author linaibo* @Date 2024/2/7 15:53* CBC加解密工具* @Version 1.0*/public class AexCbcTool {// public static String decryptAES(String content,String key, String ivInfo) throws Exception {//     SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("ASCII"), "AES");//     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//     IvParameterSpec iv = new IvParameterSpec(ivInfo.getBytes());//     cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);//     byte[] encrypted1 = Base64.decodeBase64(content);//先用bAES64解密//     return new String(cipher.doFinal(encrypted1));// }/*** 解密** @param enc       加密内容* @param uniqueKey 唯一key* @return*/public static String decrypt(String enc, String uniqueKey, String iv) throws Exception {byte[] key = uniqueKey.getBytes();SecretKey secretKey = new SecretKeySpec(key, "AES");IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);byte[] encrypted1 = Base64.decodeBase64(enc);//先用bAES64解密byte[] plainBytes = cipher.doFinal(encrypted1);return new String(plainBytes, "UTF-8");}/*** 加密** @param src* @param uniqueKey* @return*/public static String encrypt(String src, String uniqueKey, String iv) throws Exception {byte[] key = uniqueKey.getBytes();SecretKey secretKey = new SecretKeySpec(key, "AES");IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes("utf-8"));Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);byte[] cipherBytes = cipher.doFinal(src.getBytes("UTF-8"));String encryptedValue = Base64.encodeBase64String(cipherBytes);return encryptedValue;}}

4.总结

在项目中使用时,比如对密码的加密,需要先调用后端接口获取加密密钥,根据获取的加密密钥在前端对密码进行加密,将加密后的信息发送给后端,在后端进行解密,解密之后再进行加密,将加密后的密码和表中的密码进行比较,一致则登录成功

https://blog.51cto.com/u_16175526/7323980

AES算法的CBC和ECB两种工作模式_aes iv需要保密吗-CSDN博客

AES加解密模式_aes_cbc_encrypt-CSDN博客

AES解密报错Invalid AES key length: xx bytes与Given final block not properly padded的解决方法-CSDN博客

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

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

相关文章

算法学习——LeetCode力扣二叉树篇2

算法学习——LeetCode力扣二叉树篇2 107. 二叉树的层序遍历 II 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#…

用C语言列出Linux或Unix上的网络适配器

上代码&#xff1a; 1. #include <sys/socket.h> 2. #include <stdio.h> 3. 4. #include <netdb.h> 5. #include <ifaddrs.h> 6. 7. int main() { 8. struct ifaddrs *addresses; 9. if(getifaddrs(&addresses) -1) { 10. printf("…

贰[2],Xamarin生成APK

1&#xff0c;生成改为Release版本 2&#xff0c;选中****.Android项目 3&#xff0c;点击生成&#xff0c;选择存档 4&#xff0c;点击分发 5&#xff0c;选择临时 6&#xff0c;添加签名标识 7&#xff0c;选择对应的签名标识&#xff0c;点击另存为

Oracle 几种行转列的方式 sum+decode sum+case when pivot

目录 原始数据&#xff1a; 方式一&#xff1a; 方式二&#xff1a; 方式三&#xff1a; unpivot的使用&#xff1a; 原始数据&#xff1a; 方式一&#xff1a; select t_name,sum(decode(t_item, item1, t_num, 0)) item1,sum(decode(t_item, item2, t_num, 0)) item2,s…

appears to be hung in Auto SQL Tuning task

appears to be hung in Auto SQL Tuning task Oracle 自动定时优化任务执行失败分析 错误现象&#xff1a; Sat Feb 10 03:10:57 2024 Process 0x0x00007FFB81BE44A8 appears to be hung in Auto SQL Tuning task Current time 1707505857, process death time 1707505803 …

centos7编译安装redis

一、环境 系统&#xff1a;CentOS Linux release 7.9.2009 (Core) redis版本&#xff1a;redis 6.0.6 二、安装及部署 当前最新稳定版本是redis 6.0.6 国内网址&#xff1a;http://www.redis.cn redis下载列表&#xff1a;http://download.redis.io/releases/ 下载 wge…

GEE数据集——美国地质调查局历史地形图(更新)

美国地质调查局历史地形图 美国地质调查局地形图的历史可追溯到 19 世纪末&#xff0c;当时美国地质调查局开始着手绘制整个美国的详细地图。1:24,000 比例尺&#xff0c;也称为 7.5 分钟四边形地图&#xff0c;成为最广泛使用的比例尺之一。每张地图覆盖 7.5 分经纬度的区域&a…

openresty (nginx)快速开始

文章目录 一、什么是openresty&#xff1f;二、openresty编译安装1. 编译安装命令1.1 编译完成后路径1.2 常用编译选项解释 2. nginx配置文件配置2.1 nginx.conf模板 3. nginx常见配置一个站点配置多个域名nginx配置中location匹配规则 三、OpenResty工作原理OpenResty工作原理…

尚硅谷 Vue3+TypeScript 学习笔记(下)

目录 五、组件通信 5.1. 【props】 5.2. 【自定义事件】 5.3. 【mitt】 5.4.【v-model】 5.5.【$attrs】 5.6. 【$refs、$parent】 5.7. 【provide、inject】 5.8. 【pinia】 5.9. 【slot】 1. 默认插槽 2. 具名插槽 3. 作用域插槽 六、其它 API 6.1.【shallowR…

耳机壳UV树脂制作耳机壳的工艺流程是什么?

使用耳机壳UV树脂制作耳机壳的工艺流程如下&#xff1a; 获取耳模&#xff1a;首先&#xff0c;需要获取用户的耳模。这通常是通过使用一种柔软的材料注入到用户的耳朵中&#xff0c;然后取出并用来制作耳机的内芯。选择UV树脂&#xff1a;接下来&#xff0c;需要选择合适的UV…

2024图像消除相关论文大集合

28篇图像填充/Inpainting相关论文 1 CR-Fill: Generative Image Inpainting with Auxiliary Contextual Reconstruction ICCV2021 吐槽DeepFillv2 with CA layer&#xff0c;由于缺乏对缺失区域与已知区域之间对应关系的监督信号&#xff0c;可能无法找到合适的参考特征&…

如何在 Windows 上恢复已删除的 Excel 文件

许多公司和个人在 Excel 电子表格中保存有价值的信息。当会议需要某个重要的 Excel 文件时&#xff0c;突然意识到您已删除或丢失该文件可能会造成严重问题。不用担心。我们将向您展示在 Windows 计算机上恢复已删除的 Excel 文件的多种方法。 如何在 Windows 上恢复已删除的 E…

《动手学深度学习(PyTorch版)》笔记8.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

MongoDB存储引擎发展及WiredTiger深入解析(二)

在现代的数据管理领域中&#xff0c;MongoDB作为一个高性能、开源的NoSQL数据库系统&#xff0c;已经在全球范围内被广泛应用。而MongoDB背后的存储引擎&#xff0c;作为其数据管理的核心组件&#xff0c;也经历了不断的发展和优化。本文将对MongoDB的存储引擎发展进行简要回顾…

机器学习2--逻辑回归(案列)

糖尿病数据线性回归预测 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_diabetes diabetesload_diabetes() datadiabetes[data] targetdiabetes[target] feature_namesdiabetes[feature_names] data.shape df …

第66讲管理员登录功能实现

项目样式初始化 放assets目录下&#xff1b; border.css charset "utf-8"; .border, .border-top, .border-right, .border-bottom, .border-left, .border-topbottom, .border-rightleft, .border-topleft, .border-rightbottom, .border-topright, .border-botto…

华为机考入门python3--(9)牛客9-提取不重复的整数

分类&#xff1a;列表 知识点&#xff1a; 从右往左遍历每一个字符 my_str[::-1] 题目来自【牛客】 def reverse_unique(n): # 将输入的整数转换为字符串&#xff0c;这样可以从右向左遍历每一位 str_n str(n) # 创建一个空列表来保存不重复的数字 unique_digits []…

TS学习与实践

文章目录 学习资料TypeScript 介绍TypeScript 是什么&#xff1f;TypeScript 增加了什么&#xff1f;TypeScript 开发环境搭建 基本类型编译选项类声明属性属性修饰符getter 与 setter方法static 静态方法实例方法 构造函数继承 与 super抽象类接口interface 定义接口implement…

C++笔记之regex(正则表达式)

C++笔记之regex(正则表达式) ——2024-02-10 ——《C++标准库》(第2版,侯捷译) Page 717 code review! 文章目录 C++笔记之regex(正则表达式)例1:使用正则表达式进行搜索(`std::regex_search`)例2:使用正则表达式进行全文匹配(`std::regex_match`)例3:使用正则表达式…

文件包含漏洞的应用与绕过技巧、防御方法

目录 包含日志文件 包含session 绕过技巧 指定前缀绕过 一、目录遍历 二、编码绕过 指定后缀绕过 一、利用URL 二、利用协议 三、长度截断 四、%00截断 文件包含漏洞防御 上一篇文章和大家介绍了一下文件包含漏洞和PHP伪协议的基本知识和利用PHP伪协议进行文件包含…