关于AES加密的思考与总结 | 内容详细

news2024/11/7 15:27:09

今天心血来潮,想把AES加密的内容做一个总结,方便日后观看查阅。

学艺不精,如有错误,欢迎各位老师批评指正!

AES简介

AES是目前广泛应用的对称加密算法,主要用于保护电子数据。

  • 对称加密:加密与解密使用相同的密钥
  • 块加密算法:AES将数据分成固定大小的块(128位),并对每个数据块进行加密
  • 密钥长度:AES支持三种密钥长度:128位、192位和256位。密钥的长度越长,数据加密就越安全。

如上图所示:这个就是AES加密与解密的基本逻辑。在爬虫的学习中我们只需要知道AES的工作流程,而它内部的加密逻辑并不在我们的学习范围之内。

下面对上面流程图进行解释说明:

明文:等待被加密的数据。

密钥:目标网站对数据加密和解密时所使用的密码,这个密钥是前端与后端协商之后的结果,不会通过网络进行传输,在写网络爬虫时,需要获取到密钥即可对数据进行加解密的操作。

加密函数/解密函数:C=E(K, P),C代表明文/密文,E代表加密/解密函数,K代表密钥,P代表密文/明文。其实需要加密或解密的话,需要创建AES函数,将待加密/解密的数据以及密钥传入即可实现加解密的过程。

AES有以下几种模式:

1、电子密码本模式(ECB)

  • 特点:每个块独立加密,相同的明文块会被加密成相同的数据
  • 优点:容易实现
  • 缺点:安全性差,容易遭到攻击譬如(频率分析),不推荐用于实际应用

2、密码块链接模式(CBC)

  • 特点:每个块的加密结果依赖于前一个块,第一块与初始向量异或。
  • 优点:比ECB更加的安全,因为相同的明文块不会加密成相同的数据。
  • 缺点:加密过程不能并行,必须等待上一个明文块结束后才能继续下一个。

3、计数器模式(CTR)

  • 特点:将一个计数器的值(通常是一个递增的值)与密钥进行加密,然后与明文异或。
  • 优点:支持并行加密和解密,速度块,且安全性较高。
  • 缺点:如果同一个密钥被使用多次而不及时更改的话,依然还是会有危险。

4、加密分组链接模式(CFB)

  • 特点:将前一个明文块加密后与当前的明文异或。
  • 优点:适用于流式数据,可以处理不完整的输入数据
  • 缺点:与CBC类似,解密过程依赖于前一个密文块

5、输出反馈模式(OFB)

  • 特点:将初始向量(IV)与密钥进行加密,然后将结果与明文异或。每次输出后,将前一次的加密结果作为下一次的输入
  • 优点:支持并行加密和解密,速度块,且安全性较高。
  • 缺点:如果同一个密钥被使用多次而不及时更改的话,依然还是会有危险。

加密模式CBC

CBC加密模式是目前网站用于传输文件或者是传输数据比较常见的加密模式,它的安全性比EBC要高上许多,由于它的每一块的加密结果都依赖于前一块的加密块,并且为了避免数据重复,在第一块的使用中需要添加初始向量iv。

下面我来写一个CBC加密模式的demo,给大家做一个参考:

加密

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64


# AES加密函数
def encrypt(text, key):
    # 使用静态iv,在实际开发中大多使用随机生成
    iv = b'this is an iv456'  # 16字节的iv值
    # 创建AES对象
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 填充明文并加密
    cipher_text = cipher.encrypt(pad(plain_text.encode(), AES.block_size))
    # 返回密文
    return base64.b64encode(cipher_text).decode('utf-8')


if __name__ == '__main__':
    key = b'this is a key123'  # 16字节密钥
    # 明文
    plain_text = 'hello'
    # 加密
    cipher_text = encrypt(plain_text, key)
    print('密文: ', cipher_text)

注:一个字节是8位,一个英文字母和一个空格就是一个字节

运行结果如下:

yVuSCyVMjJjFzBvQ1TatEQ==

解密

def decrypt(cipher_text, key):
    # 解码密文
    decode_data = base64.b64decode(cipher_text)
    # 使用相同的iv
    iv = b'this is an iv456'  # 16字节的iv值
    # 创建AES对象
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 解密并去除填充
    plain_text = unpad(cipher.decrypt(decode_data), AES.block_size)
    return plain_text.decode()

if __name__ == '__main__':
    key = b'this is a key123'  # 16字节密钥
    plain_text = decrypt(cipher_text, key)
    print('明文:', plain_text)

运行结果如下:

hello

大家认真去看上述两份代码,就会发现对称加密模式的加密与加密每一步都是一一对应的,我对代码的每一个作用都做了详细的说明,因此操作起来并不会有太大的难度。

另外注意,CBC模式的加密与解密时使用的iv和key是一样的。

加密模式EBC

EBC模式的加密安全性较低,在实际开发过程中慎用!

加密

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64


# 加密
def encrypt(plain_text, key):
    # 创建AES对象,使用EBC模式
    cipher = AES.new(key, AES.MODE_ECB)
    # 填充明文并加密
    cipher_text = cipher.encrypt(pad(plain_text.encode(), AES.block_size))
    # 返回密文的base64编码
    return base64.b64encode(cipher_text).decode()


if __name__ == '__main__':
    key = b'this is a key123'
    plain_text = 'hello'
    ciphter_text = encrypt(plain_text, key)
    print('密文:', ciphter_text)

运行结果如下:

密文: KcAGhxWuObJj30hBZY+buA==

解密

def decrypt(cipher_text, key):
    # 解码密文
    decode_data = base64.b64decode(cipher_text)
    # 创建AES对象,使用EBC模式
    cipher = AES.new(key, AES.MODE_ECB)
    # 去除填充
    plain_text = unpad(cipher.decrypt(decode_data), AES.block_size)
    return plain_text.decode()


if __name__ == '__main__':
    key = b'this is a key123'
    decrypt_text = decrypt(cipher_text, key)
    print('明文:', decrypt_text)

运行结果如下:

明文: hello

小节

除了上述讲解的两种加密模式之外,我还介绍了其余的加密模式,不过CBC和EBC的加密是最常见的,其余的加密模式在遇到了可以自行搜索解决就好。

实战案例

目标地址:aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55

从数据中无法看出是什么加密,猜测就是由CryptoJS模块加密生成,因而可以在全局搜索CryptoJSdecrypt这类关键字,或者搜索加密算法中常常用到的偏移量iv、模式mode、填充方式padding等,现在也可以比较明显的发现,此类数据是XHR中的json数据被加密,也可以直接搜索JSON.parse

发现app.7c192126.js文件比较可疑,当然也不一定就是它,先进去分析看看

这里可以看到有一个返回数据,可以打个断点看看,返回的数据是什么

可以明显看到e就是解密后的数据,那么var e = JSON.parse(b(t.data));这行代码不容小觑。

下面直接跟进b函数,很明显可以看到是AES的加密

 f = d.a.enc.Utf8.parse("jo8j9wGw%6HbxfFn")
 m = d.a.enc.Utf8.parse("0123456789ABCDEF");
function b(t) {
            var e = d.a.enc.Hex.parse(t)
              , n = d.a.enc.Base64.stringify(e)
              , a = d.a.AES.decrypt(n, f, {
                iv: m,
                mode: d.a.mode.CBC,
                padding: d.a.pad.Pkcs7
            })
              , r = a.toString(d.a.enc.Utf8);
            return r.toString()

从中可以发现加密模式为CBC,填充方式是Pkcs7,另外偏移量m,f在b函数的上方,往上滑动一些些就能看到。

到这里已经分析完毕了,代码就不再提供了。

欢迎关注:小志Codings

今天的文章到这里就结束了,如果各位老师有任何意见和建议,请不吝赐教。

路漫漫其修远兮,吾将上下而求索。

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

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

相关文章

航顺芯片HK32MCU版图再扩张,深圳南山新基地助力集成电路核心圈突破

【中国,深圳,2024年10月24日】深圳市南山区,作为中国高新技术产业的重要聚集地,一直是集成电路企业的必争之地。近期,深圳市航顺芯片技术研发有限公司(下文简称“航顺芯片”)随着高精尖人才团队…

qt配置https请求

qt应用版本 windows 32位 先说下心理路程,你能遇到的我都遇到了,你能想到的我都想到了,怎么解决看这一篇就够了,从上午12点到晚上12点几乎没离开电脑(除了吃饭),对于openssl这种用的时候无感&am…

LVGL-从入门到熟练使用

LVGL简介 LVGL( Light and Versatile Graphics Library )是一个轻量、多功能的开源图形库。 1、丰富且强大的模块化图形组件:按钮 、图表 、列表、滑动条、图片等 2、高级的图形引擎:动画、抗锯齿、透明度、平滑滚动、图层混合等…

【判断推理】翻译推理

7.1 等价推出 等价推出指的是将题干逻辑关系和选项逻辑关系分别翻译后,二者完全一致。考察的是对翻译规则的掌握,常用知识点有命题的传递和原命题、逆否命题等价。 题干中无逻辑关联词的部分不需要关注,直接寻找带有逻辑关联词的语句即可。 …

圣麟易安中医:微搭助力中医诊所实现数字化问诊接诊

“只用了下班时间,每天写一点点,2个月就基于微搭搭建出来了现在问诊小程序和接诊管理后台,大概节约70%的工作量吧” ——项目负责人 邓小静 私人中医诊所也能定制小程序,传统中医诊所如何实现服务流程的智能化和个性化&#x…

基于SSM校园生活电子商城管理系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,餐厅信息管理,菜品类型管理,闲置物品管理,订单管理,系统管理 用户账号功能包括:系统首页,个人中心&#xf…

python mac vscode 脚本文件的运行

切换到脚本文件的目录下 路径的修改 当前文件组织形式: 脚本文件在文件夹下: 赋予权限:chmod x ./scripts/fscd_test.sh 运行:./scripts/fscd_test.sh

Python画图3个小案例之“一起看流星雨”、“爱心跳动”、“烟花绚丽”

源码如下: import turtle # 导入turtle库,用于图形绘制 import random # 导入random库,生成随机数 import math # 导入math库,进行数学计算turtle.setup(1.0, 1.0) # 设置窗口大小为屏幕大小 turtle.title("流星雨动画&…

【大数据学习 | kafka】kafka的整体框架与数据结构

1. kafka的整体框架 首先kafka启动以后所有的broker都会向zookeeper进行注册,在/brokers/ids中以列表的形式展示所有的节点,在/controller节点中使用独享锁实现broker的选举,其中一个机器为主节点。其他的为从节点,选举的根本原则…

SpringBoot获取resources目录下的文件

在 Spring Boot 项目中,获取 resources 目录中的文件路径通常涉及到访问类路径资源(classpath resources)。Spring Boot 提供了一些工具类和方法,可以方便地访问这些资源。以下是一些常见的方法: 首先,我们…

Mybatis-plus-扩展功能

Mybatis-plus-扩展功能 一:代码生成器 AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。 功能的演示&#xff1a…

数据可视化工具深入学习:Seaborn 与 Plotly 的详细教程

数据可视化工具深入学习:Seaborn 与 Plotly 的详细教程 数据可视化是数据分析中不可或缺的一部分,能够有效地帮助我们理解数据、发现模式和传达信息。在众多可视化工具中,Seaborn 和 Plotly 是两个非常流行且强大的库。本文将深入探讨这两个…

DAY14|二叉树Part02|LeetCode: 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

目录 LeetCode: 226.翻转二叉树 基本思路 C代码 LeetCode: 101. 对称二叉树 基本思路 C代码 LeetCode: 104.二叉树的最大深度 基本思路 C代码 LeetCode: 111.二叉树的最小深度 基本思路 C代码 LeetCode: 226.翻转二叉树 力扣题目链接 文字讲解:LeetCode…

区块链国赛题目--食品溯源(模块三)

区块链国赛题目–食品溯源(模块三) 任务 3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功 能完整性,示例页面如下: 具体要求如下: (1)有明…

学习笔记:Netty网络编程框架

学习视频:Java网络编程教程——Netty深入浅出 参考笔记:网络编程 Netty 前言一、NIO 基础1. NIO三大核心组件1.1 缓冲区 Buffer1.1.1 创建Buffer的方式1.1.2 HeapByteBuffer与DirectByteBuffer1.1.3 Buffer初体验1.1.4 Buffer三个重要参数 1.2 通道 Chan…

牛客网剑指Offer-树篇-JZ27 二叉树的镜像

题目 来源:JZ27 二叉树的镜像 描述 操作给定的二叉树,将其变换为源二叉树的镜像。 数据范围:二叉树的节点数 0≤n≤1000 , 二叉树每个节点的值 0≤val≤1000 要求: 空间复杂度 O(n) 。本题也有原地操作,即…

Axure设置文本——元件动作三

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:设置文本 主要内容:掌握文本框的类型、属性、设置文本赋值的过程 应用场景:各种输入框、数据的重复赋值;多种小…

关于前端程序员使用Idea快捷键配置的说明

相信很多前端程序员 转到后端第一件事就是安装Idea然后学习java,在这里面最难的不是java的语法,而是关于快捷键的修改,前端程序员用的最多的估计就是VsCode或者Webstorm,就拿我自己举例我经常使用Vscode,当我写完代码下…

11-Dockerfile

11-Dockerfile Dockerfile Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤: 编写Dockerfile文件docker build命令构建镜像docker run依据镜像运行容器实例 构建过程 Dockerfile编写&#xff1a…

【零售和消费品&存货】食品分类检测系统源码&数据集全套:改进yolo11-RepNCSPELAN_CAA

改进yolo11-goldyolo等200全套创新点大全:食品分类检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.30 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视…