前端使用js, 后端django
1.安装
pip install pycryptodomex
2. python后端内容
create_rsa_key.py
"""
create_rsa_key() - 创建RSA密钥
"""
from Cryptodome import Random
from Cryptodome.PublicKey import RSA
def create_rsa_key():
"""
创建RSA密钥
步骤说明:
1、从 Crypto.PublicKey 包中导入 RSA,创建一个密码
2、生成 1024/2048 位的 RSA 密钥
3、调用 RSA 密钥实例的 exportKey 方法,传入口令、使用的 PKCS 标准以及加密方案这三个参数。
4、将私钥写入磁盘的文件。
5、使用方法链调用 publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。
"""
# 利用伪随机数来生成私钥和公钥
random_generator = Random.new().read
key = RSA.generate(2048,random_generator) #生成 1024/2048 位的 RSA 密钥
encrypted_key = key.exportKey() #密钥实例
with open("my_private_rsa_key.bin", "wb") as f:#私钥写入磁盘
f.write(encrypted_key)
with open("my_rsa_public.pem", "wb") as f: #公钥写入磁盘
f.write(key.publickey().exportKey())
if __name__ == '__main__':
create_rsa_key()
decrypt_key.py
import os
from Cryptodome.PublicKey import RSA
from Cryptodome.Cipher import PKCS1_v1_5
import base64
from urllib import parse
from django.shortcuts import render
from django.http import *
# 当前路径钥匙地址
curr_dir = os.path.dirname(os.path.realpath(__file__))
private_key_file = os.path.join(curr_dir, "my_private_rsa_key.bin") #密钥
public_key_file = os.path.join(curr_dir, "my_rsa_public.pem") #公钥
#解码
def decrypt_data(inputdata):
# URLDecode
data = parse.unquote(inputdata)
# base64decode
data = base64.b64decode(data)
# 读取密钥
private_key = RSA.import_key(
open(curr_dir + "/my_private_rsa_key.bin").read())
# 使用 PKCS1_v1_5解密
cipher_rsa = PKCS1_v1_5.new(private_key)
# 当解密失败,会返回 sentinel
sentinel = None
ret = cipher_rsa.decrypt(data, sentinel)
return ret.decode() #解码
#自定义注解 过滤GET和POST请求解码 。
def ouou_decode(fun):
def check(request,*args,**kwargs):
if "GET" == request.method:
request.GET = request.GET.copy() #request设置可以修改
for i in list(request.GET):
request.GET[i] = decrypt_data(request.GET[i])#解码
elif "POST" == request.method:
request.POST = request.POST.copy()
for i in list(request.POST):
request.POST[i] = decrypt_data(request.POST[i])
return fun(request, *args, **kwargs)
return check
3.生成的私钥(my_private_rsa_key.bin) ,公钥(my_rsa_public.pem)
私钥:my_private_rsa_key.bin
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAycZ2UfsZhU6pNfkAXqQyp6QHSKapyDK/6eQk2nsY2cMlJWMf
PJBA3Y3aXkRzdK3B7eFBQ9EAILNY2fKiIszBb5I9YOuhHWkD1kUOY8O8Bc7/dhsj
26aNcDvS7d6KoyuxjIYBiWiEYeVyLJevivPMu/VpUREjv9FwyfHHKwLEb1zdJS1F
yb0D/XDjzNsGR6/oyXoRmk4KgHSKEYDlgrao/01pZcNnvJDvqJIqlZJWyvfNPUiz
7mlGPPq7hUt+xPNiCOBKfaK2u6D/v/vF79kPkbbWLDNfZNVQMou0Ib0e37CZABr7
tHjgRglLfyvz4Uj4S1j0gIzn1CkhfLZuWlxvPwIDAQABAoIBABnsJl1SmNfDNa1a
cngLjk/H8gDycH4+OYuvT3tw3yNy6mh1kJjI9kcV0gfUXCTnAd2G1/Ss0DW4n4yj
Rb3vd6vW1OMzwnzdy1a8LnoWC9I54stl9zhhRcCKibHHqnYGHLGvXFkulVC3wpsE
rdJ4j0VX5RI7f8/v9MFCZP0bRj4BgfSxqcXUqEVK8Ch26Fvojw4pENmdOaulu6PR
evt3gZ9uWQoXA6SwN+srMAHr1p62DngFQvEPRIG663aDP4IAIfCrFtZIJX/qBuZp
KFEvPZOMR37ep1WqQnWqmCCWv4TyZTswuVDk0Y6k37w+SgeeL4C4hM2zdMPlruF+
qEdmh7kCgYEA0R38UAQ1zks77XTWGZpS0+IfvEn4bG94ylTklO0OGDR/HDdbm2SY
QGCeuWUY5M5Us8m2NBJhrLEIGQIFL1wnTrbM+hOVYuIHz3NdQy8ClK2e2y6Zm5U/
Q+iYEK1UtwU+fziWBMqhs2aOhbyZn6H4tVVz1gqSk0XzbWnuVEbgbK0CgYEA9wMZ
IOvqpru6OU29h1+R4EAz5qjSIza2wFP+U4kWGhplnOZnn7fXtQvWR0SGr3WOuPvy
aHp5U+ONSgA1HEfmVknirl/tfXEztmmfsdcY+6mhFd02+6KJyn6kVqA3ELEBm14y
pIw6xLOU+FccA9GbEHiGPUuDsjEyhxvtZTmy/RsCgYBfOHo1rVUa1KM7IyKCkgT5
OlQdFsmqBrBH4ZQcRD1QxEbFAGgUQCAb4GMmJGTLezCSlV0EJQKY8huv132o7Rtw
+kgn71bsqePIkM181CEmtlBJmdSURceDEpx7q5GRrS+iGpAlKmerGx32w8RoLgbj
+z89zZ6ktQt9XOkLMyLqGQKBgQDBm8QOcduyZGJKmAx+FwKX6rrDiH9s6m3DwhIO
F90jCJ2spUuDfO2uEmEZ6zRGQrZjd9dA3P5MKoeMAS2fxRtddvweAUJ8mEYYLCHn
mtkSKJsCMCnwgi3OcgUNgPaoNpUz2lmHcAKAOuIA5QYoWBpahp1xXccT3EvmapVg
SiFpEQKBgEvaNFPs2dksZ8D71wdKX8V/tUU2wH9nI9KV94OSd95p0ZvPRKYHAQyj
jnLO396K3wEzFKZVp+G5GI0ETDXyX/JG01zKqje331mgKxR4SVOtgqt8G0F8z/+E
Bqoc4rKb9mmOnsEocFYW9OUEq/1BuTNPKB/FdcrTdruxqeU8BWjd
-----END RSA PRIVATE KEY-----
公钥:my_rsa_public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAycZ2UfsZhU6pNfkAXqQy
p6QHSKapyDK/6eQk2nsY2cMlJWMfPJBA3Y3aXkRzdK3B7eFBQ9EAILNY2fKiIszB
b5I9YOuhHWkD1kUOY8O8Bc7/dhsj26aNcDvS7d6KoyuxjIYBiWiEYeVyLJevivPM
u/VpUREjv9FwyfHHKwLEb1zdJS1Fyb0D/XDjzNsGR6/oyXoRmk4KgHSKEYDlgrao
/01pZcNnvJDvqJIqlZJWyvfNPUiz7mlGPPq7hUt+xPNiCOBKfaK2u6D/v/vF79kP
kbbWLDNfZNVQMou0Ib0e37CZABr7tHjgRglLfyvz4Uj4S1j0gIzn1CkhfLZuWlxv
PwIDAQAB
-----END PUBLIC KEY-----
4.前端html-js
test.html
<!doctype html>
<html>
<head>
<title>JavaScript RSA Encryption</title>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="http://passport.cnblogs.com/scripts/jsencrypt.min.js"></script>
<script type="text/javascript">
$(function () {
$('#testme').click(function () {
// 用公钥加密
var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val()); // 获取输入的公钥
var encrypted = encrypt.encrypt($('#input').val()); // 获取输入 (需要进行加密内容)
alert('加密成功!!' + encrypted);
console.log("加密成功密钥:");
console.log(encrypted);
// 使用私钥解密
var decrypt = new JSEncrypt();
decrypt.setPrivateKey($('#privkey').val()); // 获取输入的私钥
var uncrypted = decrypt.decrypt(encrypted); // 输入加密后的内容
if (uncrypted == $('#input').val()) {
alert('前台 解密成功!!' + uncrypted);
} else {
alert('解密失败!!');
}
// 模拟发起请求,发送加密后的内容到后端
// encryptRequest('/json', encrypted);
});
});
// 使用jsencrypt类库加密js方法,
// function encryptRequest(reqUrl, data) {
// $.ajax({
// url: reqUrl,
// type: 'get',
// data: {"data":data},
// success: function (data) {
// alert("后台!解密成功 !!!"+data);
// },
// error: function (xhr) {
// {#//console.error('出错了');#}
// }
// });
// }
</script>
</head>
<body style="width: 1080px;margin: 0 auto">
<label for="privkey">密钥</label><br />
<textarea id="privkey" rows="15" cols="65">{{ private_key }}</textarea><br />
<label for="pubkey">公钥</label><br />
<textarea id="pubkey" rows="15" cols="65">{{ public_key }}</textarea><br />
<label for="input">Text to encrypt:</label><br />
<textarea id="input" name="input" type="text" rows=4 cols=70>This is a test!</textarea><br />
<input id="testme" type="button" value="Test Me!!!" /><br />
</body>
</html>