RSA加密
1.1 RSA加密原理
非对称加密的一种。
所谓的非对称加密,加密秘钥和解密秘钥不一样。
根据数论,寻求两个大的素数比较简单,但是把它们的乘积进行因式分解却极其困难,因此,可以将乘积公开作为加密秘钥。
非对称加密一般用来做身份验证和端数据加密(非对称加密加密速度,加密数据大小有限)
1.2 RSA库
- 安装
pip install rsa
- 使用
# 生成秘钥对
import rsa
pub, pri = rsa.newkeys(1024)
print(pub)
PublicKey(116308441139083577876157766248745833179967747901846507416595813990199342503462594660347616002313121632810925952593865864943639914938330483050483584606533608782756061411525819545781619361567454572833959557870861076026031268593353966696612026141092181598777033352851699891932171227194324855047825969171482077269, 65537)
print(pri)
PrivateKey(116308441139083577876157766248745833179967747901846507416595813990199342503462594660347616002313121632810925952593865864943639914938330483050483584606533608782756061411525819545781619361567454572833959557870861076026031268593353966696612026141092181598777033352851699891932171227194324855047825969171482077269, 65537, 61301649050555029174332690873310932293245738255116683082595367606839887220266489841734094510763383240620641839792747832627114606127833308597125326148143893920294887461021330211253959497007343944186201963266225852224192388755240384507953577780376651340580793278942579060402934814213057298957100845605139428777, 42837935774961484388279765551600265000598506992169151065321761561502872335981777864293843463598590806801192583926530272172222974901527411630998148154819045349716183, 2715080431281312150476471084253311429987757187834481444213286099681552767626583562417088850641154058312803528888629807558190124397045603405745843)
# 加密
# 消息加密之前,需要转换成字节数据
message = 'zlf'.encode('utf-8')
res = rsa.encrypt(message, pub)
print(res)
b'!5\x1a}\x8eLm\xab\xdck\xe2\x0b\xbc|\x9d}(mSA\x00\x17\x15\xc3s\xc6R]"\xbb?\xc8\x98\xe1\xc8f\xda\\y\xc8\xaeZd\xc9\xe0Vel79\x83\x10\xf67\xbeyy\x9f\xe9\x12\x08,\x01\xbc/\t\xde>\xcf\x87\xf8\xab\x9e\xc4\x02\x9f\x10\x8d\x9c\xa7DK`T\xdd\xe80\xd5x1\xc9v\xfc\xd0\xe3\xda\x03\xd2\xa1\xbdM\x1c\\\xa8\x95\xc0;\xc85?\tQ\x85\x14\xa5u\xc2.\xdeT\x1d\x99\xe2\xccom\x7fW'
# 一般加密的密文会以base64编码的方式输出
# a-z A-Z 0-9 += 26+26+10+2 64
import base64
b_res = base64.b64encode(res).decode()
b_res
'ITUafY5Mbavca+ILvHydfShtU0EAFxXDc8ZSXSK7P8iY4chm2lx5yK5aZMngVmVsNzmDEPY3vnl5n+kSCCwBvC8J3j7Ph/irnsQCnxCNnKdES2BU3egw1XgxyXb80OPaA9KhvU0cXKiVwDvINT8JUYUUpXXCLt5UHZnizG9tf1c='
base64.b64decode(b_res.encode())
b'!5\x1a}\x8eLm\xab\xdck\xe2\x0b\xbc|\x9d}(mSA\x00\x17\x15\xc3s\xc6R]"\xbb?\xc8\x98\xe1\xc8f\xda\\y\xc8\xaeZd\xc9\xe0Vel79\x83\x10\xf67\xbeyy\x9f\xe9\x12\x08,\x01\xbc/\t\xde>\xcf\x87\xf8\xab\x9e\xc4\x02\x9f\x10\x8d\x9c\xa7DK`T\xdd\xe80\xd5x1\xc9v\xfc\xd0\xe3\xda\x03\xd2\xa1\xbdM\x1c\\\xa8\x95\xc0;\xc85?\tQ\x85\x14\xa5u\xc2.\xdeT\x1d\x99\xe2\xccom\x7fW'
# 解密
# 注意解密的数据是二进制数据
# base64编码的数据要转换成二进制数
rsa.decrypt(base64.b64decode(b_res.encode()), pri)
b'zlf'
读取现有的公钥
pub_key = """
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE
O3F7gs+7bzrgPsMl29LX8UoPYvIG8C604CprBQ4FkfnJpnhWu2lvUB0WZyLq6sBr
tuPorOc42+gLnFfyhJAwdZB6SqWfDg7bW+jNe5Ki1DtU7z8uF6Gx+blEMGo8Dg+S
kKlZFc8Br7SHtbL2tQIDAQAB
-----END PUBLIC KEY-----
"""
# 一般提供的公钥的格式都是pem格式
# 1. 转换成字节数据
pub_key = pub_key.encode()
# 2. 调用方法加载
pub = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key)
pub
PublicKey(146108729746987381736834158701459520580739497972013422621519958953375798933355627739500199234753023982343910387697136163975815556804841172178573058935486832130715154287652170649213576078798069230216422090889080187686092667825252542151372336410071790576887605716209248483695097952444145927616731433244959110837, 65537)