python 包之 pycrypto 算法加密教程

  • 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.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)
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的密文是对代码明文的数字的 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))

Original: https://www.cnblogs.com/sunnyeden/p/16202068.html
Author: sunnyeden
Title: python 包之 pycrypto 算法加密教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/597074/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【求解】pyspark中文编码问题怎么解决?

    最近使用python-spark遇到一个无法解决的中文编码问题。 查了网上的资料和解决方法,都无法使之解决。 不知道哪位大佬可以帮忙指点一二? 问题摘要,python使用UTF8编…

    Python 2023年8月22日
    066
  • Python ❀ 列表与元组

    ​​1、列表概念​​ ​​1.1 访问列表元素​​ ​​1.2 索引(从0开始并非1)​​ ​​1.3 列表中的值​​ ​​2、修改、添加、删除列表元素​​ ​​2.1 修改列表元…

    Python 2023年5月25日
    069
  • Django学习日志三:模型层

    下面我们来学习模型层的使用: 五、模型层 模型层用于和数据交互。可以通过模型和关系型数据库实现持久化的操作。在Django开发中主要以MySQL作为首选数据库,同时使用非关系型数据…

    Python 2023年8月5日
    056
  • python 存储图片 alpha_python – 如何在图片上使用pygame set_alpha()

    您可能遇到的另一个问题(除了猴子所说的)是您可能需要使用surface.convert()将图像转换为可以更改alpha的形式.您可以执行以下任一操作. image = pygam…

    Python 2023年9月21日
    051
  • 基于Python3-Pygame的乒乓球游戏

    游戏界面截图: ; 按键控制: 空格: 暂停/开始W: 上S: 下 游戏玩法说明: 开始游戏之后,按键盘W/S按键控制球拍上下移动,接住球即可继续游戏,没接住的话游戏结束。结束后按…

    Python 2023年9月20日
    077
  • 电脑重装系统win11如何更改默认下载路径

    ​win11如何更改默认下载路径?当大家平日里面,在使用win11系统的时候,如果觉得某一个下载路径的内存空间已经满了的话,那么就必须要及时更改,下面是小编提 供的更改路径的方法。…

    Python 2023年10月24日
    089
  • pytroch取张量数据

    print(‘1111’,loss) print(‘2222’,loss.data) print(‘3333’,loss.cpu()) print(‘4444’,loss.cpu(…

    Python 2023年8月28日
    047
  • Python实现GWO智能灰狼优化算法优化支持向量机分类模型(SVC算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解),如需 数据+代码+文档+视频讲解可以直接到文章最后获取。 1.项目背景 灰狼优化算法(GWO),由澳大利亚格里菲…

    Python 2023年9月2日
    065
  • Anaconda3完全卸载+重新安装(2022.7)全网最新

    目录 完全卸载 原因: 完全卸载步骤: 重新安装 从镜像源安装 新建环境默认在C盘? 参考文献 完全卸载 原因: 1、之前安装的Anaconda3版本过于旧,python版本最新只…

    Python 2023年8月1日
    078
  • 从Spring中学到的【1】–读懂继承链

    最近看了一些 Spring 源码,发现源码分析的文章很多,而底层思想分析的文章比较少,这个系列文章准备总结一下Spring中给我的启示,包括设计模式思想、SOLID设计原则等,涉及…

    Python 2023年10月22日
    055
  • 数据分析——pandas(二)

    pandas DataFrame 创建DataFrame import pandas as pd pd.DataFrame(a) 参数a可以是多种类型,数组列表等 import p…

    Python 2023年8月21日
    053
  • ElasticSearch7.3学习(三十二)—-logstash三大插件(input、filter、output)及其综合示例

    🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡 进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯…

    Python 2023年8月10日
    045
  • pysimpleGui 之table使用

    (class) Table(values, headings=None, visible_column_map=None, col_widths=None, def_col_wid…

    Python 2023年6月12日
    075
  • 大厂必考深度学习算法面试题总结

    目录 一,滤波器与卷积核 二,卷积层和池化输出大小计算 2.1,CNN 中术语解释 2.2,卷积输出大小计算(简化型) 2.3,理解边界效应与填充 padding 参考资料 三,深…

    Python 2023年10月24日
    046
  • Pandas数据重塑与透视

    深入浅出Pandas读书笔记 9.1 数据透视 要实现基础的透视操作, 可以使用df.pivot()返回按给定的索引, 列值重新组织整理后的DataFrame. df.pivot(…

    Python 2023年8月18日
    069
  • Python的张量运算

    目录 1 机器学习中张量的创建 2 索引和切片访问张量中的数据 3 张量的整体操作和逐元素运算 4 张量的变形和转置 * 4.1 变形 4.2 转置 5 Python中的广播 6 …

    Python 2023年8月23日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球