AES加密解密python实现

这篇具有很好参考价值的文章主要介绍了AES加密解密python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.前言

        关于现代密码学算法,可以查看以下博客全面了解

CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客

        AES的细节知识,可以查阅

AES加密算法的详细介绍与实现_TimeShatter的博客-CSDN博客

         AES 加密最常用的模式就是 ECB模式 和 CBC 模式,当然还有很多其它模式,他们都属于AES加密。ECB模式和CBC 模式俩者区别就是 ECB 不需要 iv偏移量,而CBC需要。

AES加解密算法的参数
参数 作用及数据类型
秘钥 加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来; 数据类型为bytes
明文 需要加密的参数; 数据类型为bytes
模式  aes 加密常用的有 ECB 和 CBC 模式(这两个模式最常见,还有其他模式);数据类型为aes类内部的枚举量
iv 偏移量 这个参数在 ECB 模式下不需要,在 CBC 模式下需要;数据类型为bytes


 

2. ECB模式 

针对ECB模式的加密解密,参数中有几个限制:

  1. 秘钥必须为16字节或者16字节的倍数的字节型数据。
  2. 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全

2.1 短字符串加解密

如果需要加解密的是很短的额字符串,直接使用以下代码

from Crypto.Cipher import AES

password = b'1234567812345678' #秘钥,b就是表示为bytes类型
text = b'abcdefghijklmnhi' #需要加密的内容,bytes类型
aes = AES.new(password,AES.MODE_ECB) #创建一个aes对象
# AES.MODE_ECB 表示模式是ECB模式
en_text = aes.encrypt(text) #加密明文
print("密文:",en_text) #加密明文,bytes类型
den_text = aes.decrypt(en_text) # 解密密文
print("明文:",den_text)

自测输出

密文: b'WU\xe0\x0e\xa3\x87\x12\x95\\]O\xd7\xe3\xd4 )'
明文: b'abcdefghijklmnhi'

Process finished with exit code 0

如果是BASE64编码的密文需要解密呢?

使用如下代码

from Crypto.Cipher import AES
import base64

password = b'1234567812345678'
aes = AES.new(password,AES.MODE_ECB)
# en_text = b"Pd04a4bt7Bcf97KEfgLGQw=="
en_text = "Pd04a4bt7Bcf97KEfgLGQw==".encode() #将字符串转换成bytes数据
en_text = base64.decodebytes(en_text) #将进行base64解码,返回值依然是bytes
den_text = aes.decrypt(en_text)
print("明文:",den_text.decode("gbk"))

因为无论是 utf8 和 gbk 编码,针对英文字符编码都是一个字符对应一个字节,所以这里**encode()**函数主要作用就是转换成bytes数据,然后使用base64进行解码。

自测输出

明文: 好好学习天天向上

Process finished with exit code 0

        有一些AES加密,所用的秘钥,或者IV向量是通过 base64编码或者 hexstr编码后的。针对这种,首先要进行的就是进行解码,都转换回 bytes数据,再次强调,python实现 AES加密解密传递的参数都是 bytes(字节型) 数据。

        hexstr,base64编码解码例子:

import base64
import binascii
data = "hello".encode()
data = base64.b64encode(data)
print("base64编码:",data)
data = base64.b64decode(data)
print("base64解码:",data)
data = binascii.b2a_hex(data)
print("hexstr编码:",data)
data = binascii.a2b_hex(data)
print("hexstr解码:",data)

自测输出:

base64编码: b'aGVsbG8='
base64解码: b'hello'
hexstr编码: b'68656c6c6f'
hexstr解码: b'hello'

Process finished with exit code 0

2.2 对二进制格式的密文进行解密

如果需要解密的是一个很长的二进制文件,那么可以使用以下代码(代码用chatgpt获得的,质量不错)

密钥要转为bytes格式

输入文件: xxx.zip.enc

输出文件:xxx.zip

from Crypto.Cipher import AES  
import os  
  
secret_key = b'xxxxxx' # Convert the secret key to bytes  
input_file = 'xxx.zip.enc'  
output_file = 'xxx.zip'  
  
# Initialize the AES cipher with the secret key and ECB mode  
cipher = AES.new(secret_key, AES.MODE_ECB)  
  
# Get the size of the input file  
file_size = os.path.getsize(input_file)  
  
# Open the input and output files  
with open(input_file, 'rb') as in_file, open(output_file, 'wb') as out_file:  
    # Read and decrypt the input file in chunks  
    while True:  
        chunk = in_file.read(AES.block_size)  
        if len(chunk) == 0:  
            break  
        out_chunk = cipher.decrypt(chunk)  
        out_file.write(out_chunk)  
  
    # Remove any padding from the output file  
    out_file.truncate(file_size - AES.block_size + len(out_chunk))  

自测结果(考虑填充,AES的输出和输入长度一样)

AES加密解密python实现

3.CBC 模式

CBC模式与ECB模式的区别:AES.new() 解密和加密重新生成了aes对象,加密和解密不能调用同一个aes对象,否则会报错。为了防止这类错误,写代码无论是什么模式都重新生成AES对象。

代码

from Crypto.Cipher import AES
password = b'1234567812345678' #秘钥,b就是表示为bytes类型
iv = b'1234567812345678' # iv偏移量,bytes类型
text = b'abcdefghijklmnhi' #需要加密的内容,bytes类型
aes = AES.new(password,AES.MODE_CBC,iv) #创建一个aes对象
# AES.MODE_CBC 表示模式是CBC模式
en_text = aes.encrypt(text) 
print("密文:",en_text) #加密明文,bytes类型
aes = AES.new(password,AES.MODE_CBC,iv) #CBC模式下解密需要重新创建一个aes对象
den_text = aes.decrypt(en_text)
print("明文:",den_text)

自测结果

密文: b'\x93\x8bN!\xe7~>\xb0M\xba\x91\xab74;0'
明文: b'abcdefghijklmnhi'

Process finished with exit code 0

4. 填充模式

        前面使用秘钥,还有明文,包括IV向量,都是固定16字节,也就是数据块对齐了。而填充模式就是为了解决数据块不对齐的问题,使用什么字符进行填充就对应着不同的填充模式。

填充模式
模式 意义
ZeroPadding 用b’\x00’进行填充,这里的0可不是字符串0,而是字节型数据的b’\x00’
PKCS7Padding 当需要N个数据才能对齐时,填充字节型数据为N、并且填充N个
PKCS5Padding 与PKCS7Padding相似
no padding 当为16字节数据时候,可以不进行填充,而不够16字节数据时同ZeroPadding一样

如果你写的python代码需要考虑填充模式,可以参考这一篇博客的代码。

python实现AES加密解密_python aes_Hello_wshuo的博客-CSDN博客

5.最后

        AES是常见非对称加密算法。文章来源地址https://www.toymoban.com/news/detail-450053.html

到了这里,关于AES加密解密python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python对AES进行加密和解密的多种方法

    前言 本文是该专栏的第24篇,后面会持续分享python的各种干货知识,值得关注。 做过爬虫项目的同学,对AES加解密都有遇到过。 在密码学中,加密算法也分为双向加密和单向加密。单向加密包括MD5、SHA等摘要算法,它们是不可逆的。而双向加密包括 对称加密 和 非对称加密

    2023年04月14日
    浏览(37)
  • 关于怎么使用python实现 3DES 加密/解密

    3DES (Triple DES) 是一种对称加密算法,其特点是使用三次密钥加密来提高安全性。 3DES的原理是:对明文进行三次加密,每次加密的密钥不同。加密时,首先使用第一个密钥对明文进行加密,然后使用第二个密钥对加密后的数据进行解密,最后再使用第三个密钥对解密后的数据

    2024年02月15日
    浏览(38)
  • 前端使用AES密码加密、解密,使用详细(crypto加密解密,前后端分离,AES加密解密)

    1、 首先安装 crypto-js插件,安装命令如下:    -S等同于--save,保存在package.json文件中,是在dependencies 下, --save安装包信息将加入到dependencies(生产环境)中,生产阶段的依赖,也就是项目运行时的依赖,就是程序上线后仍然需要依赖; -D等同于--save-dev,也保存在package.j

    2024年02月11日
    浏览(59)
  • php对称加密AES加密解密

    AES-128-ECB和AES-256-CBC是两种常见的AES加密模式,它们在加密方式和安全性上有以下区别: 加密方式: AES-128-ECB:ECB(Electronic Codebook)模式是最简单的AES加密模式,它将数据分成固定大小的块,每个块独立加密。这意味着相同的明文块将始终加密为相同的密文块,因此ECB模式不

    2024年02月09日
    浏览(61)
  • 前端AES加密解密

    前端经常会遇到这种接口和参数需要加密的情况,目前用的最多的就是aes加密了。以下就是操作步骤。以下方式适用各个前端框架,请自行根据框架修改对应语法 1.安装 CryptoJS 这个库就是用来加密的核心,直接打开项目终端,输入 npm install crypto-js --save 2. 新建 crypto.js 在 @/

    2024年02月13日
    浏览(58)
  • uniapp AES加密解密

    uniapp里我知道的有两种aes加密解密方式。 一、引入crypto-js 1.需要在uniapp项目根目录里,打开命令行,执行如下命令: 2.在项目根目录,创建一个utils文件夹,并创建一个aes_endecrypt.js文件  3.在main.js文件中,引入方法,并注册为全局方法 4.在页面中使用aes加密,解密 二、第二

    2024年02月13日
    浏览(46)
  • kotlin aes 加密解密

    aes算法对key的字节数有要求 所以对输入的key要做填充处理

    2024年02月07日
    浏览(50)
  • Android AES加密解密

     AES算法全称Advanced Encryption Standard。它是典型的“对称加密算法”,主要作用是保证私密信息不被泄露。 一、密钥 密钥是AES算法实现加密和解密的根本,因为 它对明文的加密和解密需要使用同一个密钥 。 AES支持三种长度的密钥:128位,192位,256位。 二、填充 AES算法在对明

    2024年02月04日
    浏览(57)
  • Golang里的AES加密、解密

    CBC/ECB/CFB 解密方法 输出结果: 输出结果: 输出结果: 首先使用openssl生成公私钥

    2024年02月11日
    浏览(49)
  • java:AES加密和解密

    1 前言 对称加密,即单秘钥加密,指加密和解密的过程中,使用相同的秘钥,相比于非对称加密,因仅有一把钥匙,故而速度更快,更适合解密大文件(常见于如视频文件的加密解密中)。AES算法就属于对称加密中的一种。 2 使用 依赖引入: AES加密与解密的工具类封装: 执

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包