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

速通python加密之AES加密

AES加密

AES加密(Advanced Encryption Standard,高级加密标准)是目前全球公认的最安全、应用最广泛的对称加密算法之一,于2001年被美国国家标准与技术研究院(NIST)确定为替代DES的标准加密算法,目前在金融、通信、军事等安全敏感领域被广泛采用。

AES加密的核心特点:

  1. 对称加密特性
    加密和解密使用同一把密钥,密钥管理相对简单(但需确保密钥安全传输和存储)。

  2. 密钥长度可选
    支持3种密钥长度:128位、192位、256位(对应加密强度依次提升),其中128位AES已能满足绝大多数场景的安全需求,256位则常用于高安全级别场景(如金融、军事)。

  3. 分组加密模式
    AES是分组加密算法,将明文按固定长度(128位,即16字节)分成若干组,逐组加密。实际应用中需结合加密模式(如CBC、GCM、ECB等)处理长文本,其中ECB模式因安全性缺陷(相同明文分组加密后结果相同)不推荐,GCM模式因支持认证加密(同时保证机密性和完整性)被广泛使用。

  4. 安全性与效率平衡
    至今未被发现有效的数学破解方法,且加密/解密速度快,适合处理大量数据(如文件加密、数据库加密),兼顾安全性和性能。

加密流程(简化):

  1. 将明文按128位分组(最后一组不足16字节时需填充,如PKCS#7填充)。
  2. 每组明文与密钥通过多轮(128位密钥10轮、192位12轮、256位14轮)复杂运算(替换、移位、混合、加密钥)生成密文分组。
  3. 拼接所有密文分组,得到最终密文。
    解密过程则是加密的逆操作,使用相同密钥和模式还原明文。

应用场景:

  • 数据加密存储:如用户敏感信息(身份证、银行卡号)在数据库中的加密。
  • secure通信:如HTTPS协议中对称加密阶段(AES常作为数据传输的加密算法)、VPN加密通道。
  • 文件加密:如压缩包加密、本地文件加密(如加密硬盘)。

示例(加密):

"""
@File    :03AES.py
@Editor  : 百年
"""
'''
pip install pycrypto 
pip install pycryptodome
对称加密
所谓对称加密就是加密和解密用的是同一个密钥
条件:加密和解密用的是同一个密钥,那么两边就必须拥有相同的钥匙才可以打开
常见的对称加密有aes,des,3des(3des)
'''
# AES'''
长度:
16:AES-128
24:AES-192
32:AES-256
'''
# 导入包 Cipher里边是各种加密器
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad# step1:创建加密器
aes = AES.new(key=b'0123456789abcdef', mode=AES.MODE_CBC, iv=b'0123456789123456')
'''For ``MODE_CBC``, ``MODE_CFB``, and ``MODE_OFB`` it must be 16 bytes long.'''
'''
MODE_ECB 不需要IV
而MODE_CBC需要IV
IV长度为16
'''# step2:加密一段数据
s = '你好,世界,hello world'bs = s.encode('utf-8')  # important:注意传入的是字节
bs = pad(bs, 16)  # 进行填充
bs = aes.encrypt(bs)
try:print(bs)# b' A\x84\x9dG\x02\xb5\xb1\xed\xc9\xb5jt\x85T}\xd9\x81{.tG\xf4Ag\xfam\xda\\\xb80\x01'# 加密后的结果是杂乱无章的字节
except BaseException as e:print(e)# ValueError: Data must be padded to 16 byte boundary in CBC mode# 数据必须是16的倍数,所以需要填充到16的倍数# 加密完的字节也是不能够直接发送给服务器的,所以要将字节转换为服务器能够识别的字符串
# 也就用到了base64编码
import base64res = base64.b64encode(bs).decode()
print(res)
# IEGEnUcCtbHtybVqdIVUfdmBey50R/RBZ/pt2ly4MAE=

示例(解密)

"""
@File    :AES解密.py
@Editor  : 百年
"""
#因为是对称加密所以密钥模式以及iv都得是一样的
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad #有补长度就有反操作raw = 'IEGEnUcCtbHtybVqdIVUfdmBey50R/RBZ/pt2ly4MAE='#将数据还原成之前的字符串格式
aes = AES.new(key=b'0123456789abcdef',mode=AES.MODE_CBC,iv=b'0123456789123456')#注意如果想还原那么就得将其转换为字节
import base64
b64s = base64.b64decode(raw)#解密之后unpaddecs = aes.decrypt(b64s)res = unpad(decs,16)
print(res.decode('utf-8'))
# 你好,世界,hello world
'''
解密和加密的步骤刚好是反着来的'''#important:
'''
有时候有的网页会把IV写成16进制的数字以0x开头  
例如0xadifeabb1aifuoaea2
这时候就需要
import binascii
a2b_hex()可以将16进制数字转换为字节
binascii.a2b_hex(去掉0x的剩余段adifeabb1aifuoaea2)
b2a_hex()可以将字节转换为16进制数字
binascii.b2a_hex()
其实区分iv到底是16进制还是base64字符串有很好的办法
就是看组成,因为0x的字母是a-f,所以绝对不可能有大于f的出现'''
http://www.lryc.cn/news/600259.html

相关文章:

  • 【AcWing 835题解】滑动窗口
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现沙滩小人检测识别(C#代码UI界面版)
  • CT、IT、ICT 和 DICT区别
  • Day 22: 复习
  • Python 面向对象基础
  • 【Android】相对布局应用-登录界面
  • 基于 Claude Code 与 BrowserCat MCP 的浏览器自动化全链路构建实践
  • Android 修改系统时间源码阅读
  • 各种前端框架界面
  • 【GoLang#3】:数据结构(切片 | map 映射)
  • SAP ABAP的数据通过调用泛微Restful API同步数据到OA建模表
  • 《基于雅可比矢量近似的EIT触觉传感灵敏度非均匀校正》论文解读
  • Yocto 项目直播教学|今天晚上 21:30 直播!
  • python---字典(dict)
  • OpenCV图像梯度、边缘检测、轮廓绘制、凸包检测大合集
  • 【Linux手册】操作系统如何管理存储在外设上的文件
  • 2025牛客暑期多校第4场——G
  • MCP协议深度解析:客户端-服务器架构的技术创新
  • CMakeLists.txt 怎么写
  • 电脑开机后网络连接慢?
  • @PathVariable与@RequestParam的区别
  • 【洛谷】单向链表、队列安排、约瑟夫问题(list相关算法题)
  • 刷题日记0725
  • 二开----02
  • 【前端工程化】前端项目开发过程中如何做好通知管理?
  • Model Control Protocol 三层架构设计,三种传输方式,完成MCP项目构建实现工具调试,多维度评价指标检测多工具多资源调用的鲁棒性和稳健性
  • 从零本地部署使用Qwen3-coder进行编程
  • Web开发传参的四种常见方式介绍
  • 太极生两仪,两仪生四象,四象生八卦
  • 智慧电视:开启养老新时代