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使用稀疏矩阵节省内存实例
Jun 27 Python
python数组复制拷贝的实现方法
Jun 09 Python
快速入手Python字符编码
Aug 03 Python
Python使用剪切板的方法
Jun 06 Python
python+pygame简单画板实现代码实例
Dec 13 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
python调用xlsxwriter创建xlsx的方法
May 03 Python
使用Python进行目录的对比方法
Nov 01 Python
Python通用函数实现数组计算的方法
Jun 13 Python
Python搭建Spark分布式集群环境
Jul 05 Python
使用python socket分发大文件的实现方法
Jul 08 Python
Python SSL证书验证问题解决方案
Jan 13 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
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
浅谈javascript 函数属性和方法
2015/01/21 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
jQuery操作cookie
2016/08/08 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
angular学习之ngRoute路由机制
2017/04/12 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
Vue源码分析之Vue实例初始化详解
2019/08/25 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
python中zip()方法应用实例分析
2016/04/16 Python
Python中操作符重载用法分析
2016/04/29 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python验证身份证信息实例代码
2019/05/06 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
电子工程求职信
2014/07/17 职场文书
网吧消防安全责任书
2014/07/29 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
搬迁通知
2015/04/20 职场文书
三下乡活动心得体会
2016/01/23 职场文书
车位出租协议书范本
2016/03/19 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
JavaScript实现两个数组的交集
2022/03/25 Javascript