【Python】AES.MODE_CBC和 AES.MODE_ECB 加解密

news/2024/4/25 12:29:34/文章来源:https://www.cnblogs.com/phoenixy/p/16831159.html

AES加解密MODE_CBCMODE_ECB两种模式的完整实现

 

import jsonfrom Crypto.Cipher import AES
import base64
import binascii# 数据类
class MData():def __init__(self,  data=b"", characterSet='utf-8'):# data肯定为bytesself.data = dataself.characterSet = characterSetdef saveData(self, FileName):with open(FileName, 'wb') as f:f.write(self.data)def fromString(self, data):self.data = data.encode(self.characterSet)return self.datadef fromBase64(self, data):self.data = base64.b64decode(data.encode(self.characterSet))return self.datadef fromHexStr(self, data):self.data = binascii.a2b_hex(data)return self.datadef toString(self):return self.data.decode(self.characterSet)def toBase64(self):return base64.b64encode(self.data).decode()def toHexStr(self):return binascii.b2a_hex(self.data).decode()def toBytes(self):return self.datadef __str__(self):try:return self.toString()except Exception:return self.toBase64()# 封装类
class AEScryptor():def __init__(self, key, mode, iv='', paddingMode="NoPadding", characterSet="utf-8"):"""构建一个AES对象:param key: 秘钥,字节型数据:param mode: 使用模式,只提供两种,AES.MODE_CBC,  AES.MODE_ECB:param iv: iv偏移量,字节型数据:param paddingMode: 填充模式,默认为NoPadding,  可选NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding:param characterSet: 字符集编码"""self.key = keyself.mode = modeself.iv = ivself.characterSet = characterSetself.paddingMode = paddingModeself.data = ""def __ZeroPadding(self, data):"""用b’\x00’进行填充,这里的0可不是字符串0,而是字节型数据的b’\x00’:param data::return:"""data += b'\x00'while len(data) % 16 != 0:data += b'\x00'return datadef __StripZeroPadding(self, data):data = data[:-1]while len(data) % 16 != 0:data = data.rstrip(b'\x00')if data[-1] != b"\x00":breakreturn datadef __PKCS5_7Padding(self, data):needSize = 16-len(data) % 16if needSize == 0:needSize = 16return data + needSize.to_bytes(1, 'little')*needSizedef __StripPKCS5_7Padding(self, data):paddingSize = data[-1]return data.rstrip(paddingSize.to_bytes(1, 'little'))def __paddingData(self, data):if self.paddingMode == "NoPadding":if len(data) % 16 == 0:return dataelse:return self.__ZeroPadding(data)elif self.paddingMode == "ZeroPadding":return self.__ZeroPadding(data)elif self.paddingMode == "PKCS5Padding" or self.paddingMode == "PKCS7Padding":return self.__PKCS5_7Padding(data)else:print("不支持Padding")def __stripPaddingData(self, data):if self.paddingMode == "NoPadding":return self.__StripZeroPadding(data)elif self.paddingMode == "ZeroPadding":return self.__StripZeroPadding(data)elif self.paddingMode == "PKCS5Padding" or self.paddingMode == "PKCS7Padding":return self.__StripPKCS5_7Padding(data)else:print("不支持Padding")def setCharacterSet(self, characterSet):"""设置字符集编码:param characterSet: 字符集编码:return:"""self.characterSet = characterSetdef setPaddingMode(self, mode):"""设置填充模式:param mode: 可选NoPadding,ZeroPadding,PKCS5Padding,PKCS7Padding:return:"""self.paddingMode = modedef decryptFromBase64(self, entext):"""从base64编码字符串编码进行AES解密:param entext: 数据类型str:return:"""mData = MData(characterSet=self.characterSet)self.data = mData.fromBase64(entext)return self.__decrypt()def decryptFromHexStr(self, entext):"""从hexstr编码字符串编码进行AES解密:param entext:数据类型str:return:"""mData = MData(characterSet=self.characterSet)self.data = mData.fromHexStr(entext)return self.__decrypt()def decryptFromString(self, entext):"""从字符串进行AES解密:param entext: 数据类型str:return:"""mData = MData(characterSet=self.characterSet)self.data = mData.fromString(entext)return self.__decrypt()def decryptFromBytes(self, entext):"""从二进制进行AES解密:param entext: 数据类型bytes:return:"""self.data = entextreturn self.__decrypt()def encryptFromString(self, data):"""对字符串进行AES加密:param data: 待加密字符串,数据类型为str:return:"""self.data = data.encode(self.characterSet)return self.__encrypt()def __encrypt(self):if self.mode == AES.MODE_CBC:aes = AES.new(self.key, self.mode, self.iv)elif self.mode == AES.MODE_ECB:aes = AES.new(self.key, self.mode)else:print("不支持这种模式")  return           data = self.__paddingData(self.data)enData = aes.encrypt(data)return MData(enData)def __decrypt(self):if self.mode == AES.MODE_CBC:aes = AES.new(self.key, self.mode, self.iv)elif self.mode == AES.MODE_ECB:aes = AES.new(self.key, self.mode)else:print("不支持这种模式")  return           data = aes.decrypt(self.data)mData = MData(self.__stripPaddingData(data), characterSet=self.characterSet)return mDataif __name__ == '__main__':# https://blog.csdn.net/chouzhou9701/article/details/122019967key = b"1234567812345678"iv =  b"0000000000000000"aes = AEScryptor(key, AES.MODE_CBC, iv, paddingMode="ZeroPadding", characterSet='utf-8')data = '{"name": "张三", "age": "18", "phone": "13212345678"}'enrData = aes.encryptFromString(data)print("密文:", enrData.toBase64())denrData = aes.decryptFromBase64(enrData.toBase64())print("明文:", denrData)print("明文:", type(eval(str(denrData))))

 

 

 

 

 源码地址:https://blog.csdn.net/chouzhou9701/article/details/122019967

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410239.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构】顺序表

我们不过是普通人,只不过在彼此眼中闪闪发光 目录 1.模拟实现顺序表 1.1 顺序的结构 1.2 顺序表的成员属性 1.3 顺序表的构造方法 1.4 顺序表的成员方法 1.4.1 扩容 1.4.2 打印顺序表 1.4.3 尾插 1.4.4 在指定位置插入 1.4.5 判断数组中是否有这个元素…

SSH婴幼儿产品销售系统电商购物系统(含源码+论文+答辩PPT等)

该项目采用技术JSP、strust2、Spring、Hibernate、Tomcat服务器、MySQL数据库 ,项目含有源码、论文、配套开发软件、软件安装教程、项目发布教程 本系统结构如下: 1,游客访问 |–系统首页,查看所有的商品信息和相关的菜单信息 |–…

每日一记:笔记工具使用、计算机基础知识、编程语言认识

1、笔记工具的使用 我现在使用的是typora这个文档工具 markdown语法 常见操作有:标题、代码块、引用、列表等 typora工具的主页面 我们可以编辑内容 做笔记 。。。 标题分类: 和html(超文本标记语言 前端部分一样)分为六级标题…

拉卡拉第三季营收13.45亿:净利8372万 同比降73%

雷递网 雷建平 10月31日拉卡拉支付股份有限公司(证券代码:300773,证券简称:拉卡拉)日前发布财报,财报显示,拉卡拉2022年前三季营收43.55亿元,同比降11.83%;拉卡拉2022年前…

Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)

文章目录Shell字符串单引号双引号拼接字符串获取字符串长度提取子字符串查找子字符串Shell数组定义数组读取数组获取数组的长度Shell注释流程控制if判断case语句for 循环while 循环read 读取控制台输入Shell字符串 字符串是shell编程中最常用最有用的数据类型(除了…

【DDR3 控制器设计】(5)DDR3 的仲裁读写操作设计

写在前面 本系列为 DDR3 控制器设计总结,此系列包含 DDR3 控制器相关设计:认识 MIG、初始化、读写操作、FIFO 接口等。通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等,附上汇总博客直达链接。 【DDR3 控制器设计】系列…

爆破校园网的宽带

前提:学校的手机号前7位相同,宽带密码都是手机号后六位。仅供学习。 准备工作:电脑一台,把校园网的宽带水晶头插在电脑上, 步骤: winR输入Rasphone点击新建,宽带,输入宽带名称&am…

Kubernetes(31):kubeasz单主机模式

前言 有时候,我们只需要k8s集群进行项目测试,能够使用的主机可能只有一台,那么如何构建一台单机的k8s集群? 单机版的k8s集群可以用于本地测试,或者内部测试环境,或者个人电脑上的项目测试。 那么我们可以使…

Html保留空格和换行

效果&#xff1a; 代码&#xff1a; <pre> 这是一段文本这是一段文本这是一段文 本这是一 段文本这是一段文本 </pre>

会话技术(Session、Cookie)详细介绍

会话技术 request&#xff1a;接收请求 接收请求行 接收请求方式&#xff1a;request.getMethod()接收项目路径&#xff1a;request.getContextPath() 接收请求头 request.getHeader(String name) 接收请求参数 中文参数&#xff1a; get方式&#xff1a;不乱码。因为tomcat8.…

NIO Buffer类的重要方法

1 allocate()创建缓冲区 在使用Buffer&#xff08;缓冲区&#xff09;之前&#xff0c;我们首先需要获取Buffer子类的实例对象&#xff0c;并且分配内存空间。为了获取一个Buffer实例对象&#xff0c;这里并不是使用子类的构造器new来创建一个实例对象&#xff0c;而是调用子类…

带你走入C++动态多态的底层

多态按字面的意思就是多种形态&#xff0c;相同的方法调用&#xff0c;但是有不同的实现方式。多态性可以简单地概括为“一个接口&#xff0c;多种方法&#xff0c;实现接口与实现的分离。 C有两种多态形式&#xff1a; 静态多态动态多态而本文主要介绍动态多态的应用。 动态…

力扣1662(javapython)-检查两个字符串数组是否相等(简单)

题目: 给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。示例 1: 输入:word1 = ["ab", "c"], word2 = ["a", "bc…

SpringBoot:ssm和springboot整合

目录 一、整合Mybatis 因为要使用逆向生成代码 pom.xml generatorConfig.xml application.yml 测试 BookController SpringbootmybatisApplication jdbc.properties 二、整合mybatisplus 简介 application.yml MPGenerator SpringbootmpApplication 三、使用my…

ensp华为配置NAT

ensp华为配置NAT 文章目录ensp华为配置NAT1 对PC进行地址、掩码及网关配置2 对路由器进行初始配置3 ART配置3.1 静态NAT配置3.2 动态NAT配置3.3 端口NAT (NAPT) 的配置3.4 Easy IP的配置3.5 NAT Server的配置4 总结拓扑图如图&#xff1a;1 对PC进行地址、掩码及网关配置 略 …

计算机毕设(附源码)JAVA-SSM佳音大学志愿填报系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

计算机毕设(附源码)JAVA-SSM蓟县农家乐网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

通俗易懂!一文看懂手机Root的操作与防护

Root&#xff0c;对于任何手机发烧友、玩机客、从事移动设备研发的人员来说&#xff0c;并不陌生&#xff0c;它代表绝大部分移动设备的使用者能够掌握到的最高权限。 从技术层次来讲&#xff0c;用户拥有了修改系统文件的权限&#xff0c;甚至可以控制账户、增加或删除硬件等…

java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统

基于javaJSPsqlserver的智能在线考试信息管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaJSPsqlserver的智能在线考试信息管理系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&a…

内部财务经营分析该怎么做?

对于日常在企业工作的财务人员来说&#xff0c;做对外财务报表分析的机会并不多&#xff0c;我们在网上经常看到的对上市公司财务报表的分析&#xff0c;是基于投资人的角度来对这家公司披露的财务及经营信息所做的分析。 实际工作当中&#xff0c;大家应用到更多的其实是内部…