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

基于Python实现AES加密与解密

数据加密概念

数据加密

​ 数据加密是一种将原始数据(明文)转换成看似随机、无法理解的形式(密文)的过程。加密技术主要分为两大类:对称加密和非对称加密。

  • 对称加密如同一把钥匙开一把锁,加密和解密使用的是同一个密钥,就像你和搭档各持一半藏宝图,合在一起才能解读宝藏位置。

  • 非对称加密则更像是一对匹配的锁和钥匙,其中一把钥匙(公钥)可以公开,用于加密;而只有另一把钥匙(私钥)才能解密,确保了信息传递过程中的保密性和身份认证。

哈希函数与消息摘要

​ 哈希函数则更像是指纹提取机,它将任意长度的数据压缩成固定长度的唯一标识,称为消息摘要或哈希值。比如,当你在网上购物输入密码时,网站并不会直接保存你的密码,而是保存密码经过哈希后的唯一印记。这种情况下,即使数据库被攻破,攻击者拿到的也只是无法反向推导出原始密码的哈希值。

下面是一个简单的Python哈希函数使用示例,利用hashlib库计算字符串的SHA-256摘要:

import hashlib# 原始消息
message = "My secret password"# 创建SHA-256哈希对象
hash_object = hashlib.sha256()# 将消息编码并加入到哈希对象中
hash_object.update(message.encode())# 获取哈希摘要
hashed_message = hash_object.hexdigest()
print(f"原始消息:{message}")
print(f"SHA-256摘要:{hashed_message}")

基于Python实现AES加密/解密

一、AES加密算法概述

​ AES,全称Advanced Encryption Standard,即高级加密标准。它是一种对称加密算法,即加密与解密都使用相同的密钥。同时AES是属于分组加密,明文长度每128bit/组,即明文如果明文长度超过了128bit,则需要对明文进行分割,如果明文长度不够则要补齐到128bit。(8bit=1字节,128bit=16字节)

​ AES的密钥常见的长度为128bit/192bit/256bit,使用不同长度的密钥分别会对数据进行10/12/14轮加密。密钥长度越长,加/解密时间和所耗费的资源越多。

详细加/解密原理见:AES加密解密算法_aes解密-CSDN博客

二、AES的不同加密模式

​ AES加密算法的模式主要有五种,它们是ECB模式、CBC模式、CFB模式、OFB模式和CTR模式。它们之间的主要区别在于加密过程中明文和密文的处理方式以及安全性特点:

#ECB模式:
每个明文块被独立加密,相同的明文块得到相同的密文块。
不适合加密大量数据或具有重复模式的数据,容易受到攻击。#CBC模式:
使用前一个密文块对当前明文块进行加密,增加了随机性,相同的明文块在不同位置得到不同密文块。
需要使用初始化向量(IV)来增加安全性。#CFB模式:
使用前一个密文块作为输入生成伪随机密钥流与明文进行异或运算得到密文。
可以支持实时加密和流加密。#OFB模式:
类似于CFB,使用前一个密文块生成伪随机密钥流,然后与明文进行异或运算。
对加密和解密中的错误更加鲁棒,但不支持部分更新。#CTR模式:
使用一个计数器与密钥输入加密算法生成伪随机密钥流,与明文进行异或运算。
可以并行加密和解密,适用于需要高效加密的场景。

​ 选择哪种模式取决于具体应用的需求和安全性要求,例如需要实时加密或流加密的场景可选用CFB模式,而需要高效加密的场景可选用CTR模式。

三、Python代码实现AES数据加密/解密

1、准备工作

安装pycryptodome包

pip install pycryptodome

2、说明

​ 本次加密使用CBC模式进行加密,并使用了PKCS7填充来确保每个块的长度都是16字节的倍数。同时,我们使用Base64编码来处理可能存在的二进制数据,以便可以在文本格式中传输加密后的数据。

3、实现

引用的包
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
加密函数
# 加密函数
def encrypt(plaintext, key):cipher = AES.new(key, AES.MODE_CBC)# 使用PKCS7填充pad_length = 16 - (len(plaintext) % 16)# 这里的bytes([pad_length])表示要填充的字节,即在原文的最后添加了填充长度信息,方便后后续进行解密plaintext += bytes([pad_length]) * pad_lengthciphertext = cipher.encrypt(plaintext)# 这里的iv 是初始化向量,用于初始化加密过程return base64.b64encode(cipher.iv + ciphertext).decode('utf-8')

解密函数

# 解密函数
def decrypt(ciphertext, key):decoded = base64.b64decode(ciphertext)# 获取iv和密文iv = decoded[:16]ciphertext = decoded[16:]cipher = AES.new(key, AES.MODE_CBC, iv)plaintext = cipher.decrypt(ciphertext)# 获取填充长度,移除PKCS7填充pad_length = plaintext[-1]plaintext = plaintext[:-pad_length]return plaintext.decode('utf-8')
使用示例
# 使用示例
# 生成一个随机的256位密钥
key = get_random_bytes(32)
print(f"密钥:", key)# 明文
plaintext = "今天天气好晴朗、处处好风光,啦啦啦,啦啦啦"
print("明文:", plaintext)# 加密
ciphertext = encrypt(plaintext.encode('utf-8'), key)
print("加密后的密文:", ciphertext)# 解密
decrypted_text = decrypt(ciphertext, key)
print("解密后的明文:", decrypted_text)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 《QDebug 2024年8月》
  • 深度学习(二)-损失函数+梯度下降
  • 【数据结构】-----哈希
  • 【科研新手必备】如何高效、高质量、科学的科研?
  • 仿论坛项目--第二部分习题
  • JAVA进阶学习14
  • RuoYi-Cloud 部署与配置 [CentOS7]
  • 《深入浅出WPF》读书笔记.8路由事件
  • 使用pgrs在wsl中为postgres写拓展
  • huggingface.co 无法访问问题换源解决
  • c++修炼之路之C++11
  • Mac/Linux系统matplotlib中文支持问题
  • Java中类的成员介绍
  • 设计模式-结构性模式
  • Elasticsearch 里的父子文档插入和查询
  • #Java异常处理
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • AngularJS指令开发(1)——参数详解
  • centos安装java运行环境jdk+tomcat
  • github从入门到放弃(1)
  • HashMap剖析之内部结构
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Median of Two Sorted Arrays
  • oldjun 检测网站的经验
  • Python爬虫--- 1.3 BS4库的解析器
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 安卓应用性能调试和优化经验分享
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 基于遗传算法的优化问题求解
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 模型微调
  • 使用common-codec进行md5加密
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Java总结 - String - 这篇请使劲喷我
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #数据结构 笔记一
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (13)Hive调优——动态分区导致的小文件问题
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (转)Unity3DUnity3D在android下调试
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .gitignore文件设置了忽略但不生效
  • .net core 6 集成和使用 mongodb
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Reactor简单使用教程
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET企业级应用架构设计系列之结尾篇
  • ::
  • @ModelAttribute 注解
  • [ C++ ] STL---string类的模拟实现