【Python】PyCryptodome模块实现多种加密算法

PyCryptodome是python一个强大的加密算法库,可以实现常见的单向加密、对称加密、非对称加密、非对称加密算法签名和流加密算法。
直接pip安装即可:pip install pycryptodome
官网地址:https://pypi.org/project/pycryptodome/

一、base64编码简单介绍

原理:将要编码的内容按3字节为一组进行分组,最后一组不够3位的则补0(显然最多补两个0)
每组中每字节最高2位改成0不使用,原先各位的内容保持原有顺序往后移;最后在上一步中补了几个0就加几个等号以供解码时按等号个数删除0(经此操作原先3节字就变成了只使用低6位的4字节)

  • 转换前 10101101,10111010,01110110
  • 转换后 00101011, 00011011 ,00101001 ,00110110

用途:一是SMTP中要以BASE64形式传输二进制文件,二是常用于将二进制数据转成可打印的ASCII码字符进行存储(下文各加密算法的密钥一般使用十六进制字符串形式存储,但也有以base64形式存储)。
其他:本质上讲Base64只能算是一种编码不能算是一种加密算法,PyCryptodome库也不支持。但从”Base64让人一下看不懂原本内容是什么“的角度讲你也不能说他完全不算加密,平时也经常用,我们就顺道讲一讲如何实现。

# 对bytes类型进行再次编码(先将字符串转换为byttes)
def base_info():str = '我喜欢 computer'#e = base64.b64encode(b"123456")       # 结果:b'MTIzNDU2'e = base64.b64encode(str.encode())     # 结果:b'5oiR5Zac5qyiIGNvbXB1dGVy'print("编码过程:",e)d = base64.b64decode(b'5oiR5Zac5qyiIGNvbXB1dGVy')print("解码过程:",d.decode())

二、单向加密算法

别称:单向加密算法,又称哈希函数、散列函数、杂凑函数、摘要算法,英文名One-way encryption algorithm。
原理:单向加密如其名只能加密不能解密(彩虹表攻击不是正经的解密),不能解密的原因是本质上并不是用IV(Initial Vector)去加密M输出M的密文,而是用M去加密IV输出IV的密文。
用途:消息认证摘要、内容或文档的数字指纹、口令存储。
其他:单向加密又可以分为hash和hmac两大类,hmac和hash的算法是一样的,其实可以认为hmac就是hash加盐的形式(不过这盐值不是hash中常用的拼接在最前边或拼接在最后边,具体怎么拼接的我不太确定)。
一般来说标准库就挺好用时我们一般就直接用标准库,python的标准库就能容易地实现单向加密算法,所以单向加密我们使用标准库实现。
python中hash类算法使用hashlib库实现,hmac类算法使用hmac库实现。

import hashlib
import timeprint(hashlib.algorithms_available)     # 支持的单向加密算法encode = 'utf-8'                        # 编码
appkey = 'md5test.'                     # 待加密信息time_span = str(int(time.time()))
o_token = appkey                            # 可以对o_token进行处理appkey+time_span
hl = hashlib.md5()                         # 创建md5对象,也可以hl = hashlib.new("md5")
hl.update(o_token.encode(encoding=encode))  # 转换为bytes
token = hl.hexdigest().upper()              # hexdigest() 加密过程:以十六进制字符串形式输出
print('第一种MD5加密后为 :' + token)# 另一种写法:b前缀代表的就是bytes
str_md5 = hashlib.md5(b'md5test.').hexdigest().upper()
print('第二种MD5加密后为 :' + str_md5)

三、对称加密算法

别名:对称加密算法,又称密钥加密算法、单密钥算法、共享密钥算法,英文名Symmetric Encryption Algorithms。
原理:对称加密算法最关键的就是SP变换,S变换通过代替操作实现混乱(即消除统计信息),P变换通过换位操作实现扩散(即雪崩效应);加解密是使用同一个密钥的逆操作过程。
用途:对称加密可以还原内容,且代替和换位操作运算量不大,适用于大量内容的加解密。对称加密算法的缺点是加解密双方密钥分发困难。
其他:对称加密算法有ECB、CBC、CFB、OFB、CTR等等多种模式,各种模式的加密是有些区别的,比如ECB不需要IV、CBC等则需要IV、EAX则需要nonce和tag等等,所以实现不同模式时写法会有差别需要具体研究,不能完全照搬下边的例子。

def aes_encrypt_cbc(org_str, key,iv):print('--------------->密码分组链接模式CBC加密开始<---------------')aes = AES.new(get_bytes(key), AES.MODE_CBC,get_bytes(iv))encrypt_aes = aes.encrypt(get_bytes(org_str))encrypted_text = str(base64.b64encode(encrypt_aes), encoding='utf-8')print('加密后的数据:', encrypted_text)return (encrypted_text)def aes_decrypt_cbc(secret_str, key,iv):print('--------------->密码分组链接模式CBC解密开始<---------------')aes = AES.new(get_bytes(key), AES.MODE_CBC,get_bytes(iv))base64_decrypted = base64.b64decode(secret_str.encode(encoding='utf-8'))decrypted_text = str(aes.decrypt(base64_decrypted), encoding='utf-8').replace('\0', '')print('解密后的数据:', decrypted_text)# bytes不是count的倍数那就补足为count的倍数
def add_to_count(value):while len(value) % count != 0:value += b'\x00'return value                            # 返回bytes# str转换为bytes超过count位时处理
def get_bytes(org_str):org_bytes = str.encode(org_str)n = int(len(org_bytes) / count)i = 0new_bytes = b''while n >= 1:i = i + 1new_byte = org_bytes[(i-1)*count:count*i-1]new_bytes += new_byten = n - 1if len(org_bytes) % count == 0:all_bytes = org_byteselif len(org_bytes) % count != 0 and n>1:all_bytes = new_bytes + add_to_count (org_bytes[i*count:])else:all_bytes = add_to_count (org_bytes)return all_bytes

四、非对称加密算法:

别称:非对称加密算法,又称公钥加密算法,英文名Asymmetric Cryptographic Algorithm。
原理:非对称加密依赖与明文经过与公钥进行数学运算可得出密文,而密文经过与密钥进行数学运算又可得到明文。
用途:非对称加密算法的优点是密钥分发简单,但缺点也是很明显的,其加解密过程依赖于数学运算运算量大所以加解密速度慢(另外同样的密钥强度其安全性弱于对称加密算法),其只适用于少量内容的加解密,最典型的就是https中用于完成对称密钥的交换。

    def generate_key(self):key = RSA.generate(1024)     # 256倍数并且>= 1024# print(key)# 提取私钥并存入文件private_key = key.exportKey()file_out = open("private_key.pem", "wb")file_out.write(private_key)# 提取公钥存入文件public_key = key.publickey().exportKey()file_out = open("public_key.pem", "wb")file_out.write(public_key)# 加密/过程(无法加密太长的内容,可以分段加密)def RSA_encrypt(self,secret_str):self.generate_key()public_key = RSA.importKey(open("public_key.pem").read())   # 读取文件e_cipher = PKCS1_OAEP.new(public_key)                         # 实例化加密套件encrypted_data = e_cipher.encrypt(secret_str.encode())        # 加密print(encrypted_data)# 解密private_key = RSA.importKey(open("private_key.pem", "rb").read())d_cipher = PKCS1_OAEP.new(private_key)org_data = d_cipher.decrypt(encrypted_data)print(org_data.decode())

五、非对称加密算法签名实现(以RSA为例)

我一直以为私钥加密公钥解密和公钥加密私钥解密没什么两样,但首先一是和一个朋友说用私钥加密发送回来时她疑或说私钥可以加密吗,然后回公司又和领导说私钥加密公钥解密的时候他直接说私钥不能加密只能做签名。
首先说私钥加密公钥解密在数学原理上是可行的,而且所谓的数字签名其本质就是我用你的公钥可以解开这加密的内容说明这些内容就是你的,即数字签名和签名认证本质就是私钥加密公钥解密。
但另一方面,因为公钥是公开的所以私钥加密并不能起加密通信的作用,所以一般没有直接的私钥加密公钥解密的操作----但我不太明白为什么PyCryptodome这些库在程序试图使用私钥加密时直接报错拒绝执行(TypeError: This is not a private key),虽然没什么用,私钥加密也没有什么危害吧?

六、流加密算法实现(以RC4为例)

别称:流加密算法,又称序列加密算法,英文名Stream cipher。
原理:流加密算法加密和解密也使用同一个密钥,所以从咬文嚼字来说他也属于对称加密算法。流加密算法与前边单向加密算法、对称加密算法、非对称加密算法的区别是前三者都是分组加密算法即一个分组使用同一个密钥,而流加密算法每一位都使用不同的密钥。
用途:流加密主要基于异或(xor)操作,运算相对简单,但安全性较低,没有很多的使用场景,最典型的是WEP上的使用但也正由于其安全性问题导致WEP的淘汰。

参考:https://www.cnblogs.com/lsdb/p/10912518.html

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

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

相关文章

阿里云 Ubuntu上的mysql运行sql文件来创建表

1、上传sql文件到指定目录 2、登录数据库 mysql -u root -p 3、查看数据库 show databases; 4、创建数据库 create database wlh; 5、对新创建的数据库操作 use wlh; 6、导入sql文件 7、查看数据库中表格 若有你数据库中的表格则导入成功 8、退出数据库操作 或者用quit; …

linux Ubuntu安装ftp并将本地文件上传到云服务器

确认是否已经安装ftp pgrep vsftpd无结果如下图&#xff1a; 2、执行安装 3、查看ftp是否安装成功 systemctl status vsftpd.service 4、 &#xff08;1&#xff09;新建"/home/uftp"目录作为用户主目录 打开"终端窗口"&#xff0c;输入"sudo mkd…

【Python】PyCryptodome模块中5种AES加密模式介绍

分组密码有五种工作体制&#xff1a; 1.电码本模式&#xff08;Electronic Codebook Book (ECB)&#xff09;&#xff1b; 2.密码分组链接模式&#xff08;Cipher Block Chaining (CBC)&#xff09;&#xff1b; 3.计算器模式&#xff08;Counter (CTR)&#xff09;&#xff1b…

Pyhton随机生成测试数据模块faker

1.什么是Faker Faker是一个Python包&#xff0c;开源的GITHUB项目&#xff0c;主要用来创建伪数据&#xff0c;使用Faker包&#xff0c;无需再手动生成或者手写随机数来生成数据&#xff0c;只需要调用Faker提供的方法&#xff0c;即可完成数据的生成。 2.安装Faker pip insta…

linux常见操作命令

1、创建文件夹test &#xff1a; mkdir test 注&#xff1a;批量创建为mkdir -p file1/log 在此目录下创建file1/log 2、创建文件test touch test 3、删除文件test rm -f test 4、删除文件夹test(包括文件夹汇总的文件也会一起删除) rm -rf test 注&#xff1a;一般用…

营业执照、组织机构代码、统一社会信用代码

统一社会信用代码是营业执照注册号。这个是三证合一,一证一码的工商改革结果。 三证合一&#xff1a;是指营业执照,税务登记证,组织机构代码证合并为一张三证合一的营业执照。 一证一码&#xff1a;是将营业执照注册号,税号,组织机构代码证号合并为统一社会信用代码。 统一社会…

【探索篇】测试人员一直疏忽掉的测试用例点,你中枪了吗?

记得当初上测试课程时&#xff0c;老师就讲到头脑风暴&#xff0c;让我们尽情发挥:想象&#xff0c;讲的就是不局限思维、发散、开拓思维&#xff0c;可能发生的情况都可作为输入条件&#xff0c;实际我们运用到工作中&#xff0c;测试用例的设计是一样的道理&#xff0c;不能局…

阿里云root密码修改

一、root密码修改阿里云linux服务器修改root密码流程&#xff1a; 通过Xshell客户端输入账号root&#xff0c;输入密码&#xff0c;登陆到linux。 输入修改密码的命令 passwd 根据提示输入新密码&#xff0c;输入新密码的时候&#xff0c;软件不会显示*号&#xff0c;输入后…

【Android】Windows环境安装Android Studio教程

Android Studio 是谷歌推出的一个Android集成开发工具&#xff0c;基于IntelliJ IDEA. 类似 Eclipse ADT&#xff0c;Android Studio 提供了集成的 Android 开发工具用于开发和调试。 在IDEA的基础上&#xff0c;Android Studio提供&#xff1a; 基于Gradle的构建支持 Android…

数据库的显示、创建、使用 、用户授权管理及忘记root用户后重置密码

1、显示数据库 show databases; 默认的数据库及大致功能&#xff1a; mysql -- 用户权限 相关数据 test --用于用户测试数据 information_schema -MySQL 本身架构相关的数据 2、创建数据库 create database 数据库名称 default charset utf8 collate utf8_general_ci ; 3、…

【Android】Android Studio打包生成正式签名的APK

Android Studio是谷歌推出一个Android集成开发工具&#xff0c;基于IntelliJ IDEA。它类似于Eclipse ADT&#xff0c;Android Studio 提供了集成的Android开发工具用于开发和调试。 那么今天我们就来讲讲如何通过Android Studio打包APK文件&#xff0c;相信有很多人还不是非常了…

Python实现单例

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中&#xff0c;某个类只能出现一个实例时&#xff0c;单例对象就能派上用场。 我们在使用class创建类的时候, 只…

mysql添加用户及权限

一、增加权限 mysql> grant 权限1,权限2,...权限n on 数据库名称.表名称 to 用户名用户地址 identified by 连接口令; mysql>flush privileges; (刷新系统权限表) 权限1,权限2,...权限n代表select,insert,update,delete,create,drop,index,alter,grant,references,rel…

Python unittest中初始化固件setUp和销毁固件tearDown详解

unittest.TestCase 包含了 setUp() 和 tearDown() 两个方法&#xff0c;其中 setUp() 方法用于初始化测试固件&#xff1b;而 tearDown() 方法用于销毁测试固件。程序会在运行每个测试用例&#xff08;以 test_ 开头的方法&#xff09;之前自动执行 setUp() 方法来初始化测试固…

【Android】Android Studio中新创建的app目录结构

安装Android Studio后&#xff0c;然后创建一个app项目。对于初学者来说&#xff0c;我们希望了解app目录结构&#xff0c;然后更好的进行开发工作。 但是要想了解一个app的目录结构&#xff0c;首先需要明确两个概念 Project Name:工程项目名称 Application Name:当前app发布…

mysql添加用户权限报1064 - You have an error in your SQL syntax问题解决

mysql添加用户及权限报错&#xff1a; 出现这样错的原因有两个&#xff1a; 1、语法有问题 &#xff08;这里没有问题&#xff09; 2、mysql版本是否支持 此种写法 找到一位大神说&#xff1a;你检查下mysql版本是mysql server 8.不支持同时创建用户和授予权限&#xf…

Python Pytest前置setup和后置teardown详解

pytest用例运行级别&#xff1a; ●模块级&#xff08;setup_module/teardown_module&#xff09;开始于模块始末&#xff0c;全局的 ●函数级&#xff08;setup_function/teardown_function&#xff09;只对函数用例生效 ●类级&#xff08;setup_class/teardown_class&#x…

【Python】pandas模块操作大型数据集

pandas 是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的。 Pandas 纳入了大量库和一些标准的数据模型&#xff0c;提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。 Pandas是python的一个数据分析包…

djangohttp://127.0.0.1:8000/media/test.jpg直接显示图片media配置

文件目录如下&#xff1a; 1、在settings中加入&#xff1a; STATIC_URL /static/ STATICFILES_DIRS (os.path.join(BASE_DIR,static),) #MEDIA_DIR &#xff08;主要用于获取路径&#xff09; MEDIA_DIR os.path.join(BASE_DIR,media) # 需要加入的MEDIA_DIR路径变量 #ME…

Python pytest框架之@pytest.fixture()和conftest详解

一、fixture简介 学pytest就不得不说fixture&#xff0c;fixture是pytest的精髓所在&#xff0c;类似unittest中setup/teardown这种前后置东西。但是比它们要强大、灵活很多&#xff0c;它的优势是可以跨文件共享 fixture的目的是提供一个固定基线&#xff0c;在该基线上测试可…