程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(5)

2023-06(3)

常见加密解密 -- pycryptodomex库

发布于2020-01-20 18:43     阅读(921)     评论(0)     点赞(9)     收藏(3)


安装

  • windows
    • pip install pycryptodomex
  • ubuntu
    • pip install pycryptodome

加密方式

  • 单向加密:MD5
    • 只能对数据进行加密,而不能解密
  • 对称加密:DES、AES
    • 数据加密与解密使用相同的密钥
  • 非对称加密:RSA

MD5  

https://www.cnblogs.com/jiyu-hlzy/p/11788091.html


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)






所属网站分类: 技术文章 > 博客

作者:怪兽爸爸

链接:https://www.pythonheidong.com/blog/article/229445/e815be26a6a8a0ff4c13/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)