JavaScript逆向之RSA算法(转)
原文地址:https://www.cnblogs.com/sbhglqy/p/18057320
RSA算法
简介
RSA算法属于非对称加密,加密的密钥称为公钥,解密的密钥称为私钥,公钥和私钥不是同一个。公钥是可以放在外面的,给谁都可以;但是私钥不可以放在外面,只能服务器自己保留,如果私钥泄露了,数据安全将有极大的风险。
RSA的公钥和私钥是成对的,不能拆开。
python中的RSA
在python中主要有两个库支持rsa加密,只需要掌握一个就可以了,本文采用的是 Crypto 库(需要安装 pycryptodome 库)中的RSA加密逻辑。
在网页的前端js处,RSA的加密逻辑有两种。
(1)No Padding:这种不推荐直接用python去搞,推荐直接用js库干。
(2)PKCS Padding:这种加密逻辑跟python中实现RSA的逻辑一致,可以直接用python搞。
在网页的前端js处,如果采用的是RSA算法,会有以下4种明显的特征:
(1)出现了十进制的65537,大概率是No Padding,建议选择用js来干。
(2)出现了十六进制的010001,其转换成十进制也是65537,大概率是No Padding,建议选择用js来干。
(3)出现了JSEncrypt关键词,这是js的一个第三方加密库,专门用来做RSA加密的,大概率是PKCS Padding,可以直接用python来干。
(4)出现了PublicKey关键词,这一定是RSA加密,如果传递的参数是一个base64字样的字符串,大概率是PKCS Padding,可以直接用python来干。
python实现RSA算法
如何生成公钥和私钥
from Crypto.PublicKey import RSA # 这个rsa我们看到的样子是帮我们生成和管理公钥和私钥的
# 如何生成公钥和私钥
key = RSA.generate(bits=1024) # bits最小是1024,还可以是2048,3072
# 生成的key是私钥
with open("private.pem", mode="wb") as f:
f.write(key.exportKey())
# 默认导出的格式是pem
# 用私钥可以生成公钥
with open("public.pem", mode="wb") as f:
f.write(key.public_key().exportKey())
如何加密
import base64
from Crypto.Cipher import PKCS1_v1_5 # 导包
from Crypto.PublicKey import RSA
# 如何加密
s = "我喜欢每天早上起来看NBA"
# 处理成字节
ming_bs = s.encode("utf-8")
# 加载公钥
f = open("public.pem", mode="rb")
pub_key = RSA.importKey(f.read())
f.close()
# 创建加密器
rsa = PKCS1_v1_5.new(pub_key)
# 加密
mi_bs = rsa.encrypt(ming_bs)
# 加密结果处理成base64
mi_s = base64.b64encode(mi_bs).decode()
print(mi_s)
改进的函数:
import base64
from Crypto.Cipher import PKCS1_v1_5 # 导包
from Crypto.PublicKey import RSA
def RSAEncrypt(rsa, str):
# 处理成字节
ming_bs = str.encode("utf-8")
mi_bs = rsa.encrypt(ming_bs)
# 加密结果处理成base64
mi_s = base64.b64encode(mi_bs).decode()
return mi_s
# 从外部文件加载公钥
f = open("public.pem", mode="rb")
pub_key = RSA.importKey(f.read())
f.close()
# 加载保存成Base64字符串的公钥
StrPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVb88MiqXubW88a+/0NdiBfebw9RKV5y+bVP+ri8zHrVA2TF4gFhwzLdIfn6mn9eYlfPj5dzYUV+Jqhetg8Y3BjyD4eAZmkTKKjLLbue15R6wUGYV4XQl9nhHSIWwt56aCsyOqVncJZFCTy0pUzJf6jrsiFYdJJQy+QFnh7XZy7QIDAQAB"
pub_key = RSA.importKey(base64.b64decode(StrPublicKey))
# 创建加密器
rsa = PKCS1_v1_5.new(pub_key)
# 加密
print(RSAEncrypt(rsa, "我喜欢每天早上起来看NBA"))
如何解密
我们在网页上最常见的是RSA的加密逻辑,解密逻辑看看就行了,因为一般解密逻辑都在服务器处执行。
import base64
from Crypto.Cipher import PKCS1_v1_5 # 导包
from Crypto.PublicKey import RSA
mi_str = "hz3uWcGAadmJA2478FxrcQJBdxUDk+3ys+ZjmxdxVhqUdb/nIS4OyNAnvrIxwL+rXTSs77P1CrtAoWf0FzYt/pJMzJcFShD3W3RnJ4mR0/iKQle5r75QqAMFQiaEhmvL6gYjfxsNSzEMmt1okmZdtiLhXgexpzRSCl74rx5378E="
# 创建解密器
# 获取私钥
f = open("private.pem", mode="rb")
pri_key = RSA.importKey(f.read())
# print(pri_key.public_key().export_key()) # 可以通过私钥计算出公钥
f.close()
rsa = PKCS1_v1_5.new(pri_key)
ming_bs = rsa.decrypt(base64.b64decode(mi_str), None)
print(ming_bs.decode("utf-8"))

浙公网安备 33010602011771号