python的rsa库的使用

1、rsa算法

详细解释我们这里不做详细解释,自行搜索,理解起来也不难。

2、rsa库的使用

注意这里不是使用的pycryto,仅仅使用了rsa,安装也很简单pip install rsa
2.1 生成pubkey和privkey

import rsa
(pubkey, privkey) = rsa.newkeys(512)  # 512这个数字表示可以加密的字符串长度,可以是1024,4096等等,
(pubkey, privkey) = rsa.newkeys(512, poolsize=8)  # 使用多进程加速生成

不过数字越大生成的速度越慢,下面给出一个简单的对比
在这里插入图片描述
2.2 从文件中读取公钥或者私钥

with open('private.pem', mode='rb') as privatefile:
	keydata = privatefile.read()
privkey = rsa.PrivateKey.load_pkcs1(keydata)

2.3 加密数据
加密数据使用pubkey,解密数据使用privkey

message = 'hello Bob!'.encode('utf8')

# 加密数据
crypto = rsa.encrypt(message, pubkey)

# 解密数据
message = rsa.decrypt(crypto, privkey)

我们在2.1中生成的公钥和私钥可以用来加密的数据长度只有512bits,只有64个字节,其实还不到64个字节,还有11个字节被用作别用(具体的话会在下面给出链接,可以自行查看原文)。

那么问题来了,怎么加密大数据文件呢,来看下面的方法。

import rsa
from rsa.bigfile import *
(pub_key, priv_key) = rsa.newkeys(512)

# 加密数据
with open('inputfile', 'rb') as infile, open('outputfile', 'wb') as outfile:
	encrypt_bigfile(infile, outfile, pub_key)

# 解密数组
with open('inputfile', 'rb') as infile, open('outputfile', 'wb') as outfile:
	decrypt_bigfile(infile, outfile, priv_key)

2.4 数字签名
签名使用privkey,验证使用pubkey。刚好和加密相反。
对字符串的签名和验证

(pubkey, privkey) = rsa.newkeys(512)
message = 'Go left at the blue tree'
# 签名
signature = rsa.sign(message, privkey, 'SHA-1')
# 验证
rsa.verify(message, signature, pubkey)

对文件的签名和验证

# 签名
with open('somefile', 'rb') as msgfile:
	signature = rsa.sign(msgfile, privkey, 'SHA-1')

# 验证
with open('somefile', 'rb') as msgfile:
	rsa.verify(msgfile, signature, pubkey)

3、总结

我们常说,非对称加密使用pubkey加密数据,privkey解密数据。
服务器公开pubkey,让我们来向服务器发送数据,那么如果服务器向我们发送数据怎么办呢?这个问题还没搞明白,有路过的大神还望不吝赐教。