iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python学习笔记——AES 加密/解密
  • 236
分享到

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

学习安全python 2023-09-06 19:09:24 236人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

前言: AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。 AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。 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

--结束END--

本文标题: Python学习笔记——AES 加密/解密

本文链接: https://www.lsjlt.com/news/397381.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python学习笔记——AES 加密/解密
    前言: AES,高级加密标准。目前比较流行的对称加密算法。是一种对称加密算法,即加密和解密都用相同的密钥。 AES只是个基本算法,实现AES有几种模式,主要有ECB、CBC、CFB等几种模式。CBC模式中还有一个偏移量参数IV。 AES加密...
    99+
    2023-09-06
    学习 安全 python
  • AES加密解密python实现
    1.前言         关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客         AES的细节知识,可以查阅 AES加密算法的详细介绍与实现_Tim...
    99+
    2023-09-20
    python 开发语言 密码学 非对称加密 AES
  • PHP AES 加密解密
    PHP 有一个使用 PHP 的 AES 方法加密和解密字符串的内置扩展。 函数 openssl_encrypt() 用于加密字符串,openssl_decrypt() 用于解密字符串。 在 P...
    99+
    2024-02-27
  • python aes 加密
    python 进行aes 加密报错,windows pip install pycryptodome 安装Crypto linux pip install pycrypto 1 import base64 2 3 from Cr...
    99+
    2023-01-31
    python aes
  • php对称加密AES加密解密
    AES-128-ECB和AES-256-CBC是两种常见的AES加密模式,它们在加密方式和安全性上有以下区别: 加密方式: AES-128-ECB:ECB(Electronic Codebook)模式是最简单的AES加密模式,它将数据...
    99+
    2023-09-01
    php 开发语言 同态加密 hash-index 哈希算法
  • jquery实现aes加密解密
    随着互联网技术的发展,网络安全问题变得越来越突出。许多网站都要求用户输入敏感信息,如密码等。这些信息往往需要进行加密处理,以保证安全性。AES(Advanced Encryption Standard)是一种流行的加密算法,具有高效、安全、...
    99+
    2023-05-24
  • AES 加密解密示例(walker)
    AES 简介 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption St...
    99+
    2023-01-31
    示例 加密解密 AES
  • JAVA实现AES加密,解密
    java提供了加解密工具,可以将字节转成加密字节. 因此在加解密前需要对内容进行转换. 一般情况我们希望以字符串的形式展示加密串 可以将byte[] 转换为base64字符串 也可以转换为16进制字符串 这里提供两个工具类 加密串为base...
    99+
    2023-08-24
    java 数据库 mysql
  • Java实现加密(一)AES加解密
    目录 1.背景知识2.AES简介3.AES的加密过程(AES处理单位:字节)4.Java实现4.1 生成密钥和偏移量4.2 AESUtil.java 源码4.3 执行结果4.4 线上验证 1.背景知识 在密码学中,加...
    99+
    2023-08-18
    java
  • PHP AES加解密示例
    PHP 有两种方式调用AES加解密,一种是使用mcrypt库,示例如下: 还有一种是使用openssl,示例如下: 测试运行效果如下: sc7ubaY39/e3gxJCRqfn9jJWJkeH1pZHMlZW5/Cw==ecuyhasd...
    99+
    2023-09-14
    php android 开发语言
  • python实现AES算法及AES-CFB8加解密源码
    目录Python实现AES算法生成轮密钥加密解密完整代码如下测试测试程序Python实现AES-CFB8加解密Python实现AES算法 密码学课程老师留的作业,我觉得用python...
    99+
    2024-04-02
  • 使用Java实现加密之AES加解密
    目录1.背景知识2.AES简介3.AES的加密过程(AES处理单位:字节)4.Java实现4.1 生成密钥和偏移量4.2 AESUtil.java 源码4.3 执行结果4.4 线上验...
    99+
    2023-05-18
    Java AES AES 加解密
  • Python学习笔记
    Python介绍 Python是一种解释型、面向对象的语言。 官网:www.python.org Python环境 解释器:www.python.org/downloads 运行方式: 交互模式。在IDLE中运行。 脚本模式。文件的后缀...
    99+
    2023-01-30
    学习笔记 Python
  • Python 学习笔记
    rs=Person.objects.all() all返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。 print rs.query 会打印出原生sql语句 rs=Pe...
    99+
    2023-01-31
    学习笔记 Python
  • 前端CryptoJS-AES加解密 对应php的AES-128-CBC加解密踩坑(java也相同加解密)
     前端部分注意看填充是pkcs7 有个前提,要看前端有没有转成hex格式,如果没转,php那边就不需要调用特定函数转hex格式的 const keyStr = '5hOwdHxpW0GOciqZ'; const iv = '01020...
    99+
    2023-09-26
    前端 javascript AES 加密解密AES php的AES加解密
  • Vue+php 使用AES进行加密解密
    php 代码 public function encrypt($data, $key, $iv) { return base64_encode(openssl_enc...
    99+
    2023-09-28
    1024程序员节 php vue.js aes加密解密
  • python AES对称加密示例
    基本概念: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES) 注意点: 1.字符集处理 2.秘钥的生成,建议按照某种规则产生,比如对用户id进行一定规则加工后,进行md5计算,再从中取出1...
    99+
    2023-01-31
    示例 对称 python
  • python学习笔记--趣学Python
    由反弹球和球拍构成的游戏。球会在屏幕上飞过来,玩家要用球拍把它弹回去 画布和画弹球 引入模块 #Tkinter -- Python的标准GUI库,Tk 接口,是python 内置的安装包 from tkinter import * i...
    99+
    2023-01-31
    学习笔记 python Python
  • Python Paste 学习笔记
    一、写在前面 这篇文章主要介绍了Python的Paste库的使用,学习过程中主要参考官网文档以及自己的理解,整理成笔记以便后续自己查阅。 如果转载,请保留作者信息。 邮箱地址:jpzhang.ht@gmail.com ...
    99+
    2023-01-31
    学习笔记 Python Paste
  • python OpenCV学习笔记
    目录图像翻转图像轮廓排序图像轮廓排序颜色识别基础颜色识别根据BGR获取HSV阈值编辑器图像翻转 使用Python的一个包,imutils。使用下面的指令可以安装。 pip in...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作