常见加密解密 -- pycryptodomex库
程序员文章站
2022-03-25 18:07:20
安装 windows pip install pycryptodomex ubuntu pip install pycryptodome 加密方式 单向加密:MD5 只能对数据进行加密,而不能解密 对称加密:DES、AES 数据加密与解密使用相同的密钥 非对称加密:RSA 比对称加密更安全、但速度慢 ......
安装
- windows
- pip install pycryptodomex
- ubuntu
- pip install pycryptodome
- pip install pycryptodome
加密方式
- 单向加密:md5
- 只能对数据进行加密,而不能解密
- 对称加密:des、aes
- 数据加密与解密使用相同的密钥
- 非对称加密:rsa
- 比对称加密更安全、但速度慢千倍、通常用来做身份认证
- 什么是非对称加密:
md5
des
from cryptodome.cipher import des import binascii # des加密数据的长度须为8的的倍数,不够可以用其它字符填充 text = 'welcome to des' if len(text) % 8 != 0: text = text + "+" * (8 - len(text) % 8) # 密钥:必须为8字节 key = b'12345678' # 使用 key 初始化 des 对象,使用 des.mode_ecb 模式 des = des.new(key, des.mode_ecb) # 加密 result = des.encrypt(text.encode()) print('加密后的数据:', result) # 转为十六进制 binascii 的 b2a_hex 或者 hexlify 方法 print('转为十六进制:', binascii.b2a_hex(result)) # 解密 print('解密后的数据:', des.decrypt(result))
aes
from cryptodome.cipher import aes from cryptodome import random import binascii text = 'welcome to aes' # 密钥key 长度必须为16(aes-128)、24(aes-192)或 32(aes-256)的bytes长度 key = b'1234567890abcdef' # 生成长度等于aes块大小的不可重复的密钥向量 iv = random.new().read(aes.block_size) # 使用 key 和 iv 初始化aes对象,使用 aes.mode_cfb 模式 aes = aes.new(key, aes.mode_cfb, iv) # 加密 result = aes.encrypt(text.encode()) # 解密 # 不能在encrypt()之后调用decrypt() # 需要用相同的key和iv初始化新的aes对象 decrypt_aes = aes.new(key, aes.mode_cfb, iv) print('密钥:', key) print('iv:', iv) print('十六进制的iv:', binascii.b2a_hex(iv)) print('加密后的数据:', result) print('转为十六进制:', binascii.b2a_hex(result)) print('解密后的数据:', decrypt_aes.decrypt(result))
rsa
- 公钥加密、私钥解密
import rsa text = 'welcome to rsa' # 生成密钥对 pubkey, prikey = rsa.newkeys(1024) # 加密:使用公钥 result = rsa.encrypt(text.encode(), pubkey) print('加密后的数据:',result) # 解密:使用私钥 print('解密后的数据:',rsa.decrypt(result, prikey))
- 创建公钥
import rsa text = 'welcome to rsa' # 公钥有两个值 n,e public_n = "e0b509f62a8fc9" * 4 public_e = '010001' # n、e必须为整数 # 将16进制的字符串转为整数 rsa_n = int(public_n, 16) rsa_e = int(public_e, 16) print('n:{}\ne:{}'.format(rsa_n, rsa_e)) # 创建公钥 rsa.publickey(n,e) pubkey = rsa.publickey(rsa_n, rsa_e) print('公钥类型:', type(pubkey)) print('公钥:', pubkey) print('n:{}\ne:{}'.format(pubkey.n, pubkey.e)) print('加密后的数据:', rsa.encrypt(text.encode(), pubkey))
- 加签、验签
import rsa pubkey, prikey = rsa.newkeys(1024) # 加签 rsa.sign(原信息,私钥,加密方式) 生成加签过后的信息 signmessage = rsa.sign('投资房地产'.encode(), prikey, 'md5') print(signmessage) # 验签 rsa.verify(需要验证的信息,加签过后的信息,公钥) # 如果需要验证的信息,是原信息,返回加密方式 veri_1 = rsa.verify('投资房地产'.encode(),signmessage, pubkey) print('投资房地产:',veri_1) # 如果需要验证的信息,不是原信息(表示信息被篡改过),则验证失败报错:verification failed veri_2 = rsa.verify('投资互联网'.encode(),signmessage, pubkey) print('投资互联网,',veri_2)
上一篇: Redis demo
下一篇: java递归调用 return的问题