# RSA加密的python实现
# RSA库安装
在python中,有一个库已经了RSA加解密的功能,就是rsa库库如其名
使用pip安装rsa库:
pip install rsa
# RSA库使用
# 生成密钥
import rsa
(pubKey,privKey) = rsa.newkeys(2048)
使用rsa.newkeys
生成密钥对,括号内的参数为RSA位数
不建议使用RSA1024及位以下的密钥,因为RSA1024及以下已被破解(或较易被破解)
可以加入参数poolsize=int
来使用多线程计算,概率出现程序循环的问题
3072位以上的RSA秘钥生成可能需要1分钟或更长,请确保你有足够的耐心
# 保存与加载秘钥
import rsa
(pubKey,privKey) = rsa.newkeys(2048)
with open("pubkey.pem", "wb") as f:
f.write(pubKey.save_pkcs1())
with open("privkey.pem", "wb") as f:
f.write(privKey.save_pkcs1())
使用wb
、rb
等方法读取出来的都是bytes格式,无需二次转换
将pub/privkey对象转换为bytes的方法为key.save_pkcs1
import rsa
with open("pubkey.pem", "rb") as f:
pubKey = rsa.PublicKey.load_pkcs1(f.read())
with open("privkey", "rb") as f:
privKey = rsa.PrivateKey.load_pkcs1(f.read())
使用rsa.PublicKey(或PrivateKey).load_pkcs1
方法可以加载字节内的秘钥
# 加密和解密
import rsa
(pubKey,privKey) = rsa.newkeys(2048)
text = b"hello world"
print(rsa.encrypt(text, pubKey))
会输出一串bytes,这个就是加密后的结果
公钥加密,私钥解密
RSA库加密必须使用bytes格式,str可以用str.encode("utf-8")
转换为bytes
import rsa
(pubKey,privKey) = rsa.newkeys(2048)
text = b"加密后的内容"
print(rsa.decrypt(text, privKey))
python中RSA库的加密是有长度上限的,一般为: RSA位数/8/3(或者2)个中文字符
RSA 4.0后已经删除了bigfile模块,后续可能会出一篇解决方案
# RSA与其他算法
# RSA加密流程
首先,加密双方必须生成一对秘钥对(长度最好一致)
然后互相交换publickey文件:
但假如现在出现了一个中间人,他会保存所有监听到的东西:
然后双方使用对方的秘钥进行加密,将密文发送给对方,对方使用自己的私钥解密:
此时,双方可以顺利的解密对方发来的数据并进行解密,但中间人呢?
中间人手里只有密文和公钥,并无法进行解密,且不可能暴力破解
这样就实现了信息的安全传输,且私钥并没有外泄
# AES算法
首先,AES算法是对称加密算法,这意味着它加解密使用同一个秘钥
现在有用户A、B,他们会通过网络交换密文:
然后熟悉的中间人又出现了,他还是会监听并保存所有内容:
交换秘钥和密文:
这时中间人已经可以解密双方的密文了,所以AES并不适合在不安全网络下传播
算法各有优点,见总结部分
# 总结
AES(对称加密)算法更适用于在安全环境下加密大量数据
RSA(非对称加密)算法适用于在不安全环境下加密少量数据
RSA加密大量数据太慢了,大量数据可以试试ECC(假如真的不想用AES)
RSA加密原理、大文件下一篇再说