python中pycryto实现数据加密


Posted in Python onApril 29, 2022

一、安装

  • pycryto能实现大致3种类型的数据加密(单向加密、对称加密 和非对称加密),产生随机数,生成密钥对,数字签名
  • 单向加密:Crypto.Hash,其中中包含MD5、SHA1、SHA256等
  • 对称加密:Crypto.Cipher如常见的DES等
  • 非对称加密:Crypto.Cipher如常见的AES加密等
  • 随机数操作:Crypto.Random也可以使用Python内置的random模块和secrets模块产生
  • 数字签名与验签:可能需要使用到 Crypto.PublicKey,Crypto.Hash,Crypto.Signature
pip install pycryto

二、AES 加密解密

  • 可以使用 AES.new(key, Mode, IV) 进行加密设置
  • key:长度必须是16、24、或32位
  • VI:长度只能是16位
  • 解密时必须要知道加密时使用的key和IV,再通过decrypt()方法进行解密
from Crypto.Cipher import AES
# 加密
aes = AES.new('this is a key 11', AES.MODE_CBC, 'this is a iv 222')
string = 'autofelix is god'
# encrypt()方法要求被加密的字符串必须也是16、24或32位的长度;所以一般要对被加密串进行处理
result = aes.encrypt(string)
# 解密
aes.decrypt(result)

三、SHA加密

from Crypto.Hash import SHA256
hash = SHA256.new()
hash.update('Hello, World!')
# 使用digest()方法加密
digest = hash.digest()
# 使用hexdigest()方法加密,该方法加密后是16进制的
hexdigest = hash.hexdigest()
print(digest, hexdigest)

四、RSA算法生成密钥对

  • RSA是一种公钥密码算法
  • RSA的密文是对代码明文的数字的 E 次方求mod N 的结果。也就是将明文和自己做E次乘法,然后再将其结果除以 N 求余数,余数就是密文。RSA是一个简洁的加密算法。E 和 N 的组合就是公钥
  • 对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文。D 和 N 的组合就是私钥
from Crypto import Random
from Crypto.PublicKey import RSA
# 获取一个伪随机数生成器
random_generator = Random.new().read
# 获取一个rsa算法对应的密钥对生成器实例
rsa = RSA.generate(1024, random_generator)
# 生成私钥并保存
private_pem = rsa.exportKey()
with open('rsa.key', 'w') as f:
f.write(private_pem)
# 生成公钥并保存
public_pem = rsa.publickey().exportKey()
with open('rsa.pub', 'w') as f:
f.write(public_pem)
# 私钥 rsa.key 结果大概如下
# -----BEGIN RSA PRIVATE KEY-----
# MIICXQIBAAKBgQDR4Wq9l44lw/thTPyFmSi2hII92EPh90yGXQNL5e7zJPD16j6Q
# # tr+tIPNSQaVrnmNwrtqyEC2x4Meyp3tdCWPYUF11r2GgDgxKfUByetNG4XqJeUKk
# kJ6D6C706mTf/2zsm8KFoNYCYPX1GhvpiTOikHcNlHLCnOD7jbMAovJg/QIDAQAB
# AoGBAIz8V6+0NxC3bg4WoSs9j1PL/5F7zV3lucoogSZi9vjuP89x40Vi/a9XCxye
# bHi2lSYEz3P92jQ7QuqIBx6gSCi3p2HLjD5LyQeSSMbPe8KSlf52dBUaPthbBceA
# IJSBDrE8MKGpulTQKAJ7K3zQUOP2ZZgcKxq2jcQgS6iTENIBAkEA5r7emvwuL0Ob
# Maav4o1Ovb5c6OL7bSm1tuLPSKl05WuNYfE6LkqiwOOn5lPvsqhwyI1dJeywVeQz
# E+PvcTUR7QJBAOjZ8PxnP5T14fuhbfko4d24Ev+iiTBdq3pMXWvobEFL1ljV6aYE
# 2JAiMjO/Fzd1WgZhWPa3P+diyTs9mART6VECQQC0LeEXdsn9oDYEbFu1dZBB++8C
# 75NTJ5m8iJlB7QjZyMUq8Ln0wdUa9+n4ohxvDraa9EADSDJdr4bvBjLH3J/1AkBr
# 9QfO7kvDU5DXqoujVnoJ4xsj3IbAnt0vEZLKwfLW/0M84si2SU7i3IfsB+/KraT0
# ilPF50ZAkEN+LNt7PjBRAkAHBBPME7IbFqxi5Cc/6R12DOMiJbOLDTS12b1J1cwG
# p8WMIERsvwWdJw+4NdqjbJcjzeGrXhDBi//JU902TAwy
# -----END RSA PRIVATE KEY-----
# 公钥 rsa.pub 结果大概如下
# -----BEGIN PUBLIC KEY-----
# # MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR4Wq9l44lw/thTPyFmSi2hII9
# 2EPh90yGXQNL5e7zJPD16j6Qtr+tIPNSQaVrnmNwrtqyEC2x4Meyp3tdCWPYUF11
# r2GgDgxKfUByetNG4XqJeUKkkJ6D6C706mTf/2zsm8KFoNYCYPX1GhvpiTOikHcN
# lHLCnOD7jbMAovJg/QIDAQAB
# -----END PUBLIC KEY-----

五、使用密钥对加密解密

  • 通常通信的时候,发送者使用接受者的公钥加密,接受者使用接受者私钥解密
import cgi, base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
import hashlib

# 要加密的字符串
message = 'autofelix is god'

# 使用公钥对内容进行 rsa 加密
with open('rsa.pub') as f:
key = f.read()
rsakey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
cipher_text = base64.b64encode(cipher.encrypt(message))
print(cipher_text)

# 使用私钥对内容进行 rsa 解密
with open('rsa.key') as f:
key = f.read()
rsakey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(rsakey)
text = cipher.decrypt(base64.b64decode(encrypt_text), random_generator)
print(text)

六、加签和验签

import datetime, random
import requests
import hashlib
import json, base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from Crypto.Cipher import AES

# 加签
def sign(signflag,keypath,baseRequest):
# http请求body
print(baseRequest)
# 加签标志
if not signflag:
return baseRequest
else:
# 取请求体中的业务数据
businessdata = json.dumps(baseRequest["data"])
# 读取私钥(.key格式,可使用openssl或java.keytools产生)
with open(keypath,'r') as rsaKeyFile:
rsaKey = rsaKeyFile.read().replace("\n",'')
print(rsaKey)
rsaKeyBytes = base64.b64decode(rsaKey)
print(rsaKeyBytes)
# SHA256摘要,RSA加密
priKey = RSA.importKey(rsaKeyBytes)
signer = PKCS1_v1_5.new(priKey)
hash_obj = SHA256.new(business_data.encode('utf-8'))
signature = base64.b64encode(signer.sign(hash_obj))
print(signature)
# 把签名加进请求体并返回
baseRequest['sign'] = signature.decode()
print(baseRequest)
return baseRequest

# 验签
def validata(signflag,cerpath,res):
if not signflag:
return res
else:
# 取业务数据和签名
data = res['data']
sign = res['sign']
# 此处cer已转换成pem格式,使用openssl工具
# openssl x509 -inform der -pubkey -noout -in xxxxx.cer>xxxxx.pem
cert = open(cerpath).read().replace("-----BEGIN PUBLIC KEY-----\n","").replace("-----END PUBLIC KEY-----\n","").replace("\n","")
print(cert)
# 验签逻辑同加签
pubBytes = base64.b64decode(cert)
pubKey = RSA.importKey(pubBytes)
signer = SHA256.new(json.dumps(data).encode("utf-8"))
verifier = PKCS1_v1_5.new(pubKey)
return verifier.verify(signer,base64.b64decode(sign))

到此这篇关于python 中的pycrypto 算法加密的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
Python中的类与对象之描述符详解
Mar 27 Python
python实现读取命令行参数的方法
May 22 Python
在Python的Django框架中包装视图函数
Jul 20 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
python实现随机森林random forest的原理及方法
Dec 21 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
django页面跳转问题及注意事项
Jul 18 Python
python如何通过pyqt5实现进度条
Jan 20 Python
使用python的pyplot绘制函数实例
Feb 13 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
通过实例解析python and和or使用方法
Nov 14 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 #Python
Python如何让字典保持有序排列
Apr 29 #Python
Python按顺序遍历并读取文件夹中文件
Apr 29 #Python
Python保存并浏览用户的历史记录
Apr 29 #Python
python解析json数据
Apr 29 #Python
python的html标准库
Apr 29 #Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 #Python
You might like
输出控制类
2006/10/09 PHP
PHP一些有意思的小区别
2006/12/06 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
举例讲解如何在Python编程中进行迭代和遍历
2016/01/19 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
django缓存配置的几种方法详解
2018/07/16 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
Python如何爬取qq音乐歌词到本地
2020/06/01 Python
python中id函数运行方式
2020/07/03 Python
Python基于内置函数type创建新类型
2020/10/22 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
linux面试题参考答案(10)
2016/10/26 面试题
应届行政管理专业个人自我评价
2013/12/28 职场文书
企业总经理职责
2014/02/02 职场文书
竞选村长演讲稿
2014/04/28 职场文书
淘宝活动总结范文
2014/06/26 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
2016年春季运动会加油稿
2015/07/22 职场文书
Vue-Element-Admin集成自己的接口实现登录跳转
2021/06/23 Vue.js