一,pycrypto / pycryptodome模块
1. 模块安装说明
crypto这个模块的安装有点小坑,需要注意。
crypto,pycrypto,pycryptodome的功能是一样的。crypto与pycrypto已经没有维护了
所以,直接都用 pycryptodome 就行了,安装命令如下
pip install pycryptodome
2. 公钥私钥的生成
from Crypto import Random
from Crypto.PublicKey import RSA
"""
generate(bits, randfunc=None, e=65537) 有三个参数,
bits 是一个字节大小的值,通常是1024,2048, 3072这三个。
randfunc 是一个随机函数,默认是 Crypto.Random.get_random_bytes ,可以自己设置,也可以保持默认。
e=65537 是公共 RSA 指数
"""
random_generator = Random.new().read #实例化一个随机生成值的对象
rsa = RSA.generate(1024, random_generator) #实例化一个对象 rsa
private_key = rsa.exportKey() # 生成私钥
print(private_key.decode('utf-8'))
public_key = rsa.publickey().exportKey() # 生成公钥
print(public_key.decode('utf-8'))
公钥指数是可以随意选取的,但是为了提高RSA的加密速度,实际使用中公钥指数最长用的三个值是3、17、65537(爬虫逆向时经常遇到,作为偏移量在JS代码中经常以二进制方(”10001“)式出现 , 如 setPublic(me.rsaPubkey, "10001"))。
PEM建议用3。PKCS#1建议用3或65537。X.509建议用65537。这样选取主要是为了提高加密或签名验证的性能,因为3、17或65537分别只需要2或17次模乘运算,而一个随机选择的e(假设n是1024-bit)则大约需要1000次模乘运算。这种方法刻意把公钥指数选的小一点,其对应私钥指数就会很大,这么做的目的是节约公钥运算的时间。因为正常使用中都是用公钥加密,所以需要节约大部分人的时间。而极少部分人也会选用私钥解密,那么就只能少数服从多数了。
3. 使用 公钥加密 和 使用私钥解密
import Crypto.PublicKey.RSA
import Crypto.Cipher.PKCS1_v1_5
import Crypto.Random
def encrypt(msg):
public_key = " " # 逆向时找到的公钥
cipher = PKCS1_cipher.new(public_key) # 生成一个加密的类
encrypt_text = base64.b64encode(cipher.encrypt(msg.encode())) # 对数据进行加密
return encrypt_text.decode() # 对文本进行解码码
def decrypt_data(encrypt_msg):
private_key = get_key('rsa_private_key.pem') # 读取私钥信息
cipher = PKCS1_cipher.new(private_key) # 生成一个解密的类
back_text = cipher.decrypt(base64.b64decode(encrypt_msg), 0) # 进行解密
return back_text.decode() # 对文本内容进行解码
二,rsa 模块使用
1, 安装命令如下
pip install rsa
2 , 公钥私钥的生成
import rsa
public, private = rsa.newkeys(1024) # 生成公钥、私钥
with open("./private.pem", "wb") as x: # 保存私钥
x.write(private.save_pkcs1())
with open("./public.pem", "wb") as x: # 保存公钥
x.write(public.save_pkcs1())
3. 使用 公钥加密 和 使用私钥解密
import rsa
str = b"yaogepachong"
with open("public.pem", 'rb') as x:
public_key = rsa.PublicKey.load_pkcs1(x.read())
cipher_text = rsa.encrypt(str, public_key) # 使用公钥加密
with open("private.pem", 'rb') as x:
private_key = rsa.PrivateKey.load_pkcs1(x.read())
text = rsa.decrypt(cipher_text, private_key) # 使用私钥解密
三,微博 和 某宝 登录 加密 可以用如下代码 实现
import rsa
import binascii
import base64
def get_password(message, e='10001'):
"""
RSA加密用户密码
e 是偏移量 ,RSA默认的指数(65537的二进制就是10001)
binascii.b2a_hex(crypto).decode() 把加密得到的二进制结果转为16进制字符串
"""
n = ' ' # 逆向找到的公钥
pub_key = rsa.PublicKey(int(n, 16), int(e, 16))
crypto = rsa.encrypt(message.encode('utf8'), pub_key)
return binascii.b2a_hex(crypto).decode(), # base64.b64encode(crypto)
print(get_password('1675154786\t3497B2\n嘟嘟嘟231dyu'))