基于Python实现AES加密与解密

2024-09-02 23:44
文章标签 python aes 实现 解密 加密

本文主要是介绍基于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)

这篇关于基于Python实现AES加密与解密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131412

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1