我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python学习笔记——AES 加密/解密

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python学习笔记——AES 加密/解密

AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。

AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。

AES加密有AES-128、AES-192和AES-256三种,分别对应三种密钥长度128位(16字节)、192位(24字节)和256位(32字节)。密钥越长,安全性越高,加密和解密时间也会更长。一般默认是128位,其安全性完全够用。

加密时:

因为密钥是16字节,所以明文加密时,字符串不足16字节的倍数,则要补充个数,例如:少4个,要补chr(4)chr(4)chr(4)chr(4),少2个,要补chr(2)chr(2)。chr(参数)中的参数是缺少的字节,要补全。这里为什么要补充chr(缺少位的ASCII码作为参数)。是因为这样能更好的读取字符串最后字符时,知道有几个填充字符,从而能采用字符串切片操作而逆向清除填充字符,为自己理解这点,兴奋。

实现方法:明文字符串 + chr(16-len(明文字符串)%16) * (16 - len(明文字符串)%16) 

自定义函数实现:

def pad(data):    text = data + chr(16 - len(data) % 16) * (16 - len(data) % 16)    return text

 2、 用lambda匿名函数:(因为只有一个表达式,lambda语法自行查阅) 

pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16)

解密时:

加密时字符串不足16字节倍数时,填充的字符是chr(缺少的字节数作为参数的),所以逆向清除填充的字符串,利用最后字符的ASCII码进行切片得出所需字符串。

自定义函数实现:

def unpad(s):    last_num = s[-1]    text = s[:-last_num]    return text    

 用lambda匿名函数:

unpad = lambda s: s[:-s[-1]]

Cryptodome和base64库,听爬虫课时,UP说的Crytodo库安装出现了问题,查了建议用Cryptodome库,安装方法:pip install Cryptodome 安装正常,base64为内置。

base64在这里起什么作用呢?

Base64是网络上最常见的用于传输8Bit字节码的编码方式,能实现二进制与字符之间编码的互转。所以说Base64就是把字符串以二进制编码/解码。其中,b64encode为编码,b64decode为解码

ECB模式加密:

def aes_ECB_Encrypt(data,key):   # ECB模式的加密函数,data为明文,key为16字节密钥    key = key.encode('utf-8')    data = pad(data)             # 补位    data = data.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_ECB)  #创建加密对象    #encrypt AES加密  B64encode为base64转二进制编码    result = base64.b64encode(aes.encrypt(data))    return str(result,'utf-8')        # 以字符串的形式返回

CBC模式加密:

def aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函数,data为明文,key为16字节密钥,iv为偏移量    key = key.encode('utf-8')    iv = iv.encode('utf-8')      # CBC 模式下的偏移量    data = pad(data)             # 补位    data = data.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  #创建加密对象    #encrypt AES加密  B64encode为base64转二进制编码    result = base64.b64encode(aes.encrypt(data))    return str(result,'utf-8')        # 以字符串的形式返回

解密为逆向:

def aes_ECB_Decrypt(data,key):   # ECB模式的解密函数,data为密文,key为16字节密钥    key = key.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_ECB)  # 创建解密对象    #decrypt AES解密  B64decode为base64 转码    result = aes.decrypt(base64.b64decode(data))    result = unpad(result)            # 除去补16字节的多余字符    return str(result,'utf-8')        # 以字符串的形式返回def aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函数,data为密文,key为16字节密钥    key = key.encode('utf-8')    iv = iv.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  # 创建解密对象    #decrypt AES解密  B64decode为base64 转码    result = aes.decrypt(base64.b64decode(data))    result = unpad(result)            # 除去补16字节的多余字符    return str(result,'utf-8')        # 以字符串的形式返回
import base64from Crypto.Cipher import AESstr_a = 'This is a book, that is a pen'pad = lambda s: s + chr(16 - len(s) % 16) * (16 - len(s) % 16)unpad = lambda s: s[:-s[-1]]key = 'sdf46asdfs54hgjg'iv = '0102030405060708'def aes_ECB_Encrypt(data,key):   # ECB模式的加密函数,data为明文,key为16字节密钥    key = key.encode('utf-8')    data = pad(data)             # 补位    data = data.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_ECB)  #创建加密对象    #encrypt AES加密  B64encode为base64转二进制编码    result = base64.b64encode(aes.encrypt(data))    return str(result,'utf-8')        # 以字符串的形式返回def aes_CBC_Encrypt(data,key,iv):   # CBC模式的加密函数,data为明文,key为16字节密钥,iv为偏移量    key = key.encode('utf-8')    iv = iv.encode('utf-8')      # CBC 模式下的偏移量    data = pad(data)             # 补位    data = data.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  #创建加密对象    #encrypt AES加密  B64encode为base64转二进制编码    result = base64.b64encode(aes.encrypt(data))    return str(result,'utf-8')        # 以字符串的形式返回def aes_ECB_Decrypt(data,key):   # ECB模式的解密函数,data为密文,key为16字节密钥    key = key.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_ECB)  # 创建解密对象    #decrypt AES解密  B64decode为base64 转码    result = aes.decrypt(base64.b64decode(data))    result = unpad(result)            # 除去补16字节的多余字符    return str(result,'utf-8')        # 以字符串的形式返回def aes_CBC_Decrypt(data,key,iv):   # CBC模式的解密函数,data为密文,key为16字节密钥    key = key.encode('utf-8')    iv = iv.encode('utf-8')    aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)  # 创建解密对象    #decrypt AES解密  B64decode为base64 转码    result = aes.decrypt(base64.b64decode(data))    result = unpad(result)            # 除去补16字节的多余字符    return str(result,'utf-8')        # 以字符串的形式返回b = aes_ECB_Encrypt(str_a,key)b1 = aes_ECB_Decrypt(b,key)c = aes_CBC_Encrypt(str_a,key,iv)c1 = aes_CBC_Decrypt(c,key,iv)print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},ECB加密后字符串:{}\n解密后长度:{},解密后字符串:{}\n".format(len(str_a),str_a,len(b),b,len(b1),b1))print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},CBC加密后字符串:{}\n解密后长度:{},解密后字符串:{}".format(len(str_a),str_a,len(c),c,len(c1),c1))

运行结果:

PS D:\python> & "C:/Program Files/Python311/python.exe" d:/python/Crypto_Cipher.py加密前长度:29,加密前字符串为:This is a book, that is a pen加密后长度:44,ECB加密后字符串:Y9OEJM1wcv1OwUYmvAEt2cFAPC2Gh1Gk5ts5d+HSngo=解密后长度:29,解密后字符串:This is a book, that is a pen加密前长度:29,加密前字符串为:This is a book, that is a pen加密后长度:44,CBC加密后字符串:FJ7cEn3uKW7aacuC755xkzs4e3T68+bNEVE0SS1emkE=解密后长度:29,解密后字符串:This is a book, that is a penPS D:\python> 

来源地址:https://blog.csdn.net/dxhklck/article/details/128200165

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python学习笔记——AES 加密/解密

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript学习 -AES加密算法

在实际应用中,我们必须小心处理AES密钥,以防止密钥泄露。一种常见的方法是将密钥保存在前端代码之外,例如服务器端,通过安全的通信渠道获取。另外,可以使用一些安全存储技术,如Web Storage或HttpOnly Cookie,将密钥保存在

Android手势密码view学习笔记(二)

我们还是接着我们上一篇博客中的内容往下讲哈,上一节 Android手势密码view笔记(一)我们已经实现了我们的IndicatorView指示器view了:下面我们来实现下我们的手势密码view:实现思路: 1、我们照样需要拿到用户需要显示
2022-06-06

Android手势密码view学习笔记(一)

刚接触Android的时候看到别人写的手势密码view,然后当时就在想,我什么时候才能写出如此高端的东西?? 没关系,不要怕哈,说出这样话的人不是你技术不咋地而是你不愿意花时间去研究它,其实也没有那么难哦(世上无难事,只怕有心人!),下面我
2022-06-06

python如何实现对AES加密的视频数据流解密

这篇文章主要介绍“python如何实现对AES加密的视频数据流解密”,在日常操作中,相信很多人在python如何实现对AES加密的视频数据流解密问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python如何实
2023-07-05

python实现的AES双向对称加密解密与用法分析

本文实例讲述了python实现的AES双向对称加密解密与用法。分享给大家供大家参考,具体如下: 高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种
2022-06-04

python实现对AES加密的视频数据流解密的方法

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,这篇文章主要介绍了用python实现对AES加密的视频数据流解密,需要的朋友可以参考下
2023-02-21

Python编程密码学文件加密与解密的方法

本文小编为大家详细介绍“Python编程密码学文件加密与解密的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python编程密码学文件加密与解密的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。本章要点o
2023-06-30

密码危机:深度学习正在加速密码破解!

信息安全专家们一直在探索“生成式对抗网络”(GAN)如何提高我们的在线安全性,并取得了令人鼓舞的结果。近日,新泽西州史蒂文斯理工学院和纽约理工学院的研究人员开发了使用GAN猜测密码的方法。该小组开发了一个实验,通过其被称为“PassGan”
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录