一. 简介
与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)
和私有密钥(privatekey)
。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
注意:
- 使用时都是使用公钥加密使用私钥解密,公钥可以公开,私钥自己保留。
- 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使加密解密速度慢于对称加密
二. 非对称特征
常见JavaScript调试算法
- 搜索关键词
new JSEncrypt()
,JSEncrypt
等,一般会使用JSEncrypt
库,会有 new 一个实例对象的操作; - 搜索关键词
setPublicKey
、setKey
、setPrivateKey
、getPublicKey
等,一般实现的代码里都含有设置密钥的过程。
三. python使用rsa加密
- 安装对应的模块
pip install pycryptodome
- 生成对应的私钥文件和公钥文件
from Crypto.PublicKey import RSA
import os
# 未知原因,需要用绝对路径才能创建文件
dirname = os.path.dirname(os.path.abspath(__file__))
# # rsa算法生成实例,中能给1024,2048,3072,建议不要给3072,默认拿到的是私钥
rsa_key = RSA.generate(1024)
# 私钥写入文件
with open(os.path.join(dirname, 'rsa.private.pem'), mode='wb') as f:
# 输出私钥,把私钥写入文件
f.write(rsa_key.exportKey())
# 把公钥写入文件
with open(os.path.join(dirname, 'rsa.public.pem'), mode='wb') as f:
# 用私钥生成公钥,输出公钥,写入文件
f.write(rsa_key.public_key().exportKey())
2.1 公钥为
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqAI9lhpnWlzqU/yk0o3owQPC1
GURWu7KEZ4ZLOEfLcuMJ7kU/MMitZeP/RAXWFZN2TtAPeT9SUDGopsKfBrVT6DjX
9JHQgfs4rrOwaJ5Fx3baC5nR2ujTs+wnMA9yw8HmJdHBmg5gip56xtGl66vdQaSr
x58pAmv6L7F7D0JORQIDAQAB
-----END PUBLIC KEY-----
2.2 私钥为
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCqAI9lhpnWlzqU/yk0o3owQPC1GURWu7KEZ4ZLOEfLcuMJ7kU/
MMitZeP/RAXWFZN2TtAPeT9SUDGopsKfBrVT6DjX9JHQgfs4rrOwaJ5Fx3baC5nR
2ujTs+wnMA9yw8HmJdHBmg5gip56xtGl66vdQaSrx58pAmv6L7F7D0JORQIDAQAB
AoGABhEMeq4FH6u4d5q1KLsDBNM8cXxJxZlx/GrAMxqxeui37/025ff0/Met6MiG
gMrbdd6jj4wV+kBup4Q4gp5KPMLiBFGYS2TQGxUJSLUJqJ7lRpN8rVHaodBz39Qo
PtW2dpj6ZMOUzO+GNZASD4ZydhSnuLwnEXG80XpkoNfdN4ECQQC5X/ceubPYiYpC
M+DTDo/1brEJeTKpR5hG4QpA5tyFuIVWy2muSetg5t1PvzL8kmGj31xq/h4Sf8Sa
Fd/Gu9lhAkEA6sVDNLI1R2/I+epIZRee/d/3or4omqvq4k+m+lDGoQkkElRC+Dct
/iq2aE3+WTNqGvRF+j6SONerX52pFYprZQJBAJVmBDHdFFbFsoncaatvpxH0nfW2
md/X9Z/aKntYFA4pQj1LPubaaDr2lRJ6U8s+5jY+A6uvFelu07IjQvBV4MECQQCx
beg+2Tg/BxLDHfccv99fS3ciPcj+LFPWOhCeOZIEfp4OZDRA16Mg5jL5XYiO7baR
LG/+km98GjLgjo0NRJGpAkAv3p1e/+31D7R/lDKcT6J/KD/rmg3DgYrhqhZTkrdK
x914St005ZsGzfzRu3zZ/NBX2+gUNZiLBimA77oGFMXF
-----END RSA PRIVATE KEY-----
- 使用python加密和解密
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 # 加密器
from Crypto import Random
import base64
# 用公钥加密
```python
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 # 加密器
import base64
# 用公钥加密
def encrypt_rsa(data: str):
"""加密"""
# 直接读取二进制
with open('rsa.public.pem', mode='rb') as f:
# 读取公钥
pk = f.read()
# 将公钥进行加载,加载成rsa类型的东西
rsa_pk = RSA.importKey(pk) # <Crypto.Cipher.PKCS1_v1_5.PKCS115_Cipher object at 0x0000018B41BD0FD0>
# 用公钥生成加密器
rsa_ = PKCS1_v1_5.new(key=rsa_pk)
# 生成密文
result = rsa_.encrypt(data.encode('utf-8'))
# 生成base64字符串方便传输
b64_result = base64.b64encode(result).decode("utf-8")
return b64_result
def decrypt_rsa(data: str):
"""解密"""
# 直接读取二进制
with open('rsa.private.pem', mode='rb') as f:
# 读取私密文件
pri_key_bytes = f.read()
# 把字节的秘钥处理成RSA_KEY
pri_key = RSA.import_key(pri_key_bytes)
# 创建加密对象解密对象
rsa_ = PKCS1_v1_5.new(key=pri_key)
# 先把b64类型的字符串转换为字节,然后解密成字节类型,然后解码为明文
mingwen = rsa_.decrypt(base64.b64decode(data), None).decode("utf-8")
return mingwen
if __name__ == '__main__':
# 明文
data = '今天又是充满七万的一天'
# 加密
data_rsa = encrypt_rsa(data)
print(data_rsa) # 不是固定的
# 解密
data_mingwen = decrypt_rsa(data_rsa)
print(data_mingwen) # 今天又是充满七万的一天