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中实现对list做减法操作介绍
Jan 09 Python
python列表操作实例
Jan 14 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
python 正则表达式参数替换实例详解
Jan 17 Python
python判断变量是否为列表的方法
Sep 17 Python
python基于tkinter实现gif录屏功能
May 19 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 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
农民和部队如何穿矿
2020/03/04 星际争霸
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
JQuery扩展插件Validate 2通过参数设置验证规则
2011/09/05 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
js实现网页自动刷新可制作节日倒计时效果
2014/05/27 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
详解Vue.js 响应接口
2020/07/04 Javascript
jQuery实现带进度条的轮播图
2020/09/13 jQuery
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
前台文员岗位职责
2013/12/28 职场文书
药品促销活动方案
2014/02/14 职场文书
教师新年寄语
2014/04/03 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
公司保洁员管理制度
2015/08/04 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
Python中22个万用公式的小结
2021/07/21 Python