Skip to main content

moregeek program

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 加密解密

  • 可以使用 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))


# yyds干货盘点 # 如何使用Python实现两表对应列相加,尽管有的表头不一样?-多极客编程

大家好,我是我是Python进阶者。一、前言前几天Python铂金群有个叫【LEE】的粉丝问了一个数据处理的问题,这里拿出来给大家分享下。一开始以为只是一个简单的sum()函数求和而已,后来有粉丝发现其实没有想的这么简单。二、实现过程针对这个问题,【🌑(这是月亮的背面)】大佬这里给出两个解决方法,一起来看看吧。方法一第一个方法是将data2的列名更改为data1的列名,再相加,实现过程和代码如下图

Python 树表查找_千树万树梨花开,忽如一夜春风来(二叉排序树、平衡二叉树)-多极客编程

什么是树表查询? 借助具有特殊性质的树数据结构进行关键字查找。 本文所涉及到的特殊结构性质的树包括: 二叉排序树。 平衡二叉树。 使用上述树结构存储数据时,因其本身对结点之间的关系以及顺序有特殊要求,也得益于这种限制,在查询某一个结点时会带来性能上的优势和操作上的方便。 树表查询属于动态查找算法。 所谓动态查找,不仅仅能很方便查询到目标结点。而且可以根据需要添加、删除结点,而不影响树的整体结构,也

# yyds干货盘点 #Python中的and和or,结果让人出乎意料之外-多极客编程

大家好,我是皮皮。一、前言前几天在Python最强王者交流群有个叫【Chloe】的粉丝问了一个Python基础的问题,关于​​and​​和​​or​​,这里拿出来给大家分享下,一起学习下。二、解决过程这里【杰】给出了解答,其实Python中,除括号外,and优先级较高,那么这里的话【瑜亮老师】也给出了解答,确实没有括号,表达式从左往右运算,and比or优先级高,先算and,再算or。首先计算​​a

python 包之 blinker 信号库教程-多极客编程

一、安装一个基于Python的强大的信号库,它既支持简单的对象到对象通信,也支持针对多个对象进行组播支持注册全局命名信号,支持自定义命名信号支持匿名信号,线程安全支持与接收者之间的持久连接与短暂连接通过弱引用实现与接收者之间的自动断开连接支持发送任意大小的数据,支持收集信号接收者的返回值pip install blinker二、创建发送信号信号通过 signal() 方法进行创建信号通过 sen

【Python技能树共建】Python爬虫模拟登录-多极客编程

Python 爬虫模拟登录 Python 爬虫模拟登录是使用脚本实现自动登录,部分站点需要逆向加密逻辑,更多的站点会采用验证码进行鉴权验证。 本文为大家带来最简单的登录,其核心用到的是 requests 模拟 POST 请求。 本次练习使用的站点是 https://www.lanqiao.cn/,可以提前注册一个账号。 因该站点无验证码,所以不需要解决验证码逻辑。 怎么用 上手案例 通过浏览器

Python <算法思想集结>之初窥基础算法-多极客编程

1. 前言 数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机。 什么是数据结构? 指数据在计算机中的存储方式,数据的存储方式会影响到获取数据的便利性。 现实生活中,如果把春夏秋冬的衣物全部堆放在一起,当需要某一季节的衣服时,寻找起来是困难的。 如果分门别类、有条理地存放,则寻找起来会方便很多。 同理,编写程序时,如果对程序所依赖的数据有条理、易于查找的方式进行

满屏的if-else,看我怎么消灭你!-多极客编程

技巧一:提取方法,拆分逻辑技巧二:分支逻辑提前return技巧三:枚举技巧四:函数式接口技巧五:设计模式其他技巧写在最后在实际的业务开发当中,经常会遇到复杂的业务逻辑,可能部分同学实现出来的代码并没有什么问题,但是代码的可读性很差。本篇文章主要总结一下自己在实际开发中如何避免大面积的 if-else 代码块的问题。补充说明一点,不是说 if-else 不好,而是多层嵌套的 if-else 导致代码

# yyds干货盘点 # 如何使用Python实现两表对应列相加,尽管有的表头不一样?-多极客编程

大家好,我是我是Python进阶者。一、前言前几天Python铂金群有个叫【LEE】的粉丝问了一个数据处理的问题,这里拿出来给大家分享下。一开始以为只是一个简单的sum()函数求和而已,后来有粉丝发现其实没有想的这么简单。二、实现过程针对这个问题,【🌑(这是月亮的背面)】大佬这里给出两个解决方法,一起来看看吧。方法一第一个方法是将data2的列名更改为data1的列名,再相加,实现过程和代码如下图

#yyds干货盘点# 解决剑指offer:树的子结构-多极客编程

1.简述:描述输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构数据范围:0 <= A的节点个数 <= 100000 <= B的节点个数 <= 10000示例1输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9

SSM框架整合的配置-多极客编程

SSM框架整合的配置pom.xml(需要配置,以及资源到处问题)<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation

redis的CLUSTER ADDSLOTS命令-多极客编程

@[TOC] redis的CLUSTER ADDSLOTS命令 这个命令是用来建立集群的 redis群集有16384个时隙位,使用CLUSTER MEET命令构建群集时未分配时隙位。 可以通过发送CLUSTER ADDSLOTS命令将时隙位分配给当前节点 数据结构   群集节点的slots属性用于记录节点负责哪个槽位。 slots是一个二进制位数组,如果数组索引的二进制位值为1,则表示当前节

【架构视角】一篇文章带你彻底吃透Spring-多极客编程

框架的意义对于程序员来说,我们通常知道很多概念,例如组件、模块、系统、框架、架构等,而本文我们重点说 框架。框架,本质上是一些实用经验集合。即是前辈们在实际开发过程中积攒下来的实战经验,累积成一套实用工具,避免你在开发过程中重复去造轮子,特别是帮你把日常中能遇到的场景或问题都给屏蔽掉,框架的意义在于屏蔽掉开发的基础复杂度、屏蔽掉此类共性的东西,同时建立严格的编码规范,让框架使用者开箱即用,并且只需