Rsa 加密的使用
概述:AES 和 DES 都是對(duì)稱(chēng)加密算法,加密和解密的時(shí)候都是相同的密鑰;非對(duì)稱(chēng)加密算法加密和解密的密鑰是不相同的,分為公鑰和私鑰;最常見(jiàn)的非對(duì)稱(chēng)加密算法是RSA加密算法!
公鑰: 公開(kāi)的密鑰,對(duì)數(shù)據(jù)進(jìn)行加密
私鑰: 私密的密鑰,對(duì)數(shù)據(jù)進(jìn)行解密
非對(duì)稱(chēng)加密算法在使用的時(shí)候,通常會(huì)將公鑰發(fā)送給客戶端,客戶端將數(shù)據(jù)進(jìn)行加密之后發(fā)送給服務(wù)端,服務(wù)端使用私鑰進(jìn)行解密,獲取傳遞的數(shù)據(jù)信息;因此非對(duì)稱(chēng)加密相對(duì)于對(duì)稱(chēng)加密的算法安全性更高,即使公鑰被獲取之后,信息仍舊是安全的;
常見(jiàn)的非對(duì)稱(chēng)加密的算法有:RSA
,DSA
,RSA是使用比較廣泛的非對(duì)稱(chēng)加密算法;
1.RSA 加密解密
安裝:
pip install pycryptodome
RSA 在加密之前,需要首先創(chuàng)建公鑰和私鑰;
1.1 獲取密鑰信息
密鑰分為公鑰和私鑰,在數(shù)據(jù)加密之前進(jìn)行獲取,通常會(huì)存儲(chǔ)在.pem
文件中進(jìn)行保存,特別注意要保護(hù)私鑰的安全;
# -*- coding: utf-8 -*-
"""使用 RSA 加密算法
"""
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
from Crypto import Random
gen_random = Random.new # 隨機(jī)標(biāo)志,類(lèi)似算法的隨機(jī)種子;
# 生成密鑰
rsa_key = RSA.generate(1024) # 生成密鑰的長(zhǎng)度; 1024,2048,3072三個(gè)長(zhǎng)度的值
# print(rsa_key.public_key().export_key())
with open("rsa_key.pem", 'wb') as fp:
# 將公鑰寫(xiě)入文件,公鑰的值是字節(jié)的類(lèi)型
fp.write(rsa_key.public_key().export_key())
with open("pri_key.pem", 'wb') as fp:
# 將私鑰寫(xiě)入二進(jìn)制文件;
fp.write(rsa_key.export_key())
1.2 數(shù)據(jù)加密
數(shù)據(jù)加密的主要步驟是加載公鑰信息,實(shí)例化加密器,進(jìn)行數(shù)據(jù)加密;
# -*- coding: utf-8 -*-
""" 數(shù)據(jù)實(shí)現(xiàn) RSA 加密解密;
"""
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
data = "現(xiàn)在已經(jīng)十點(diǎn)多了,有點(diǎn)困"
with open("rsa_key.pem", mode="r") as fp:
public_key = fp.read() # 讀取公鑰信息
rsa_key = RSA.importKey(public_key) # 返回公鑰對(duì)象;
# 創(chuàng)建 rsa 加密的加密器
rsa = PKCS1_v1_5.new(rsa_key)
# 進(jìn)行數(shù)據(jù)的加密
result = rsa.encrypt(data.encode("utf-8"))
# 將加密后的字節(jié)信息處理成 base64 的字符串信息;
b64_result = base64.b64encode(result).decode("utf-8")
print(b64_result)
1.3 數(shù)據(jù)解密
與加密方式相似;
# -*- coding: utf-8 -*-
""" 數(shù)據(jù)實(shí)現(xiàn) RSA 加密解密;
"""
import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
data = "JA6PCrJCj7Hw2/szF3SOoCcPqpx6A32JCShYq9HpAL59DTy0hjuPs65zxj3gVeKiibQ9efX0A7o6tbFEkdfhPz9TK8GfraN8oMHbjQMBA9Tbw4EDFHIc/F+TCJLrCBtY156jF+QSjL8y2IcWgQsYBZ90LxFcbtE6RVPgqRdn7b4="
with open("pri_key.pem", 'r') as fp:
# 讀取私鑰
pri_key = fp.read()
# 加載私鑰對(duì)象
rsa_key = RSA.importKey(pri_key)
# 構(gòu)建解密器
rsa = PKCS1_v1_5.new(rsa_key)
# 進(jìn)行數(shù)據(jù)解密,解密前需要現(xiàn)將base64進(jìn)行解碼;
result = rsa.decrypt(base64.b64decode(data), None)
print(result.decode("utf-8"))
1.4 rsa 加密的封裝
# -*- coding: utf-8 -*-
""" 封裝 RSA 算法的加密流程信息;
"""
import os
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
class RsaUtil(object):
"""封裝 RSA 加密算法的常用方法;
"""
SECRET_KEY_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'key')
@classmethod
def get_secret_key(cls, key_length: int, public_key_name: str, private_key_name: str):
"""
獲取加密使用的公鑰和私鑰信息;
:param key_length: 獲取迷密鑰的長(zhǎng)度信息,限制取值: 1024,2048,3072;
:param public_key_name: 存放公鑰信息的文件名稱(chēng), 建議使用 .pem 形式的文件;
:param private_key_name: 存放私鑰文件的名稱(chēng), 建議使用 .pem 形式的文件;
:return: None
"""
rsa_key = RSA.generate(key_length)
file_public = os.path.join(cls.SECRET_KEY_PATH, public_key_name)
file_private = os.path.join(cls.SECRET_KEY_PATH, private_key_name)
# 將公鑰寫(xiě)進(jìn)文件中
with open(file_public, "wb") as fp:
fp.write(rsa_key.public_key().export_key())
# 將私鑰寫(xiě)進(jìn)文件中
with open(file_private, "wb") as fp:
fp.write(rsa_key.export_key())
@classmethod
def encrypt_data(cls, public_key_name: str, data: bytes) -> bytes:
"""
rsa 的數(shù)據(jù)加密;
:param public_key_name: 數(shù)據(jù)加密使用的公鑰文件的名稱(chēng);
:param data: 被加密的字節(jié)信息;
:return: bytes; 加密返回的字節(jié)信息;
"""
file_name = os.path.join(cls.SECRET_KEY_PATH, public_key_name)
with open(file_name, "r") as fp:
# 讀取公鑰信息,創(chuàng)建密鑰對(duì)象
public_key = fp.read()
rsa_key = RSA.importKey(public_key)
# 創(chuàng)建 rsa 加密器
rsa = PKCS1_v1_5.new(rsa_key)
# 進(jìn)行數(shù)據(jù)的加密;
result = rsa.encrypt(data)
return result
@classmethod
def decrypt_data(cls, private_key_name: str, data: bytes) -> bytes:
"""
數(shù)據(jù)信息的解密;
:param private_key_name: 解密使用的私鑰文件名稱(chēng);
:param data: 被加密后的字節(jié)信息;
:return: bytes; 返回解密后的信息;
"""
file_name = os.path.join(cls.SECRET_KEY_PATH, private_key_name)
with open(file_name,'r') as fp:
# 讀取私鑰信息,實(shí)例化私鑰對(duì)象
private_key = fp.read()
rsa_key = RSA.importKey(private_key)
# 構(gòu)建解密器
rsa = PKCS1_v1_5.new(rsa_key)
# 進(jìn)行數(shù)據(jù)的解密
result = rsa.decrypt(data, None)
return result
if __name__ == '__main__':
# 1. 數(shù)據(jù)加密測(cè)試;
v = RsaUtil.encrypt_data("public_key.pem", "吃了嗎?".encode("utf-8"))
print(v) # 前后端傳輸中的時(shí)候可以使用base64將字節(jié)信息進(jìn)行編碼
# 2. 數(shù)據(jù)解密測(cè)試;
sv = RsaUtil.decrypt_data("private_key.pem", v)
print(sv.decode())
2.RSA在前后端的使用
在前后端交互中,RSA 通常是在前端完成數(shù)據(jù)的加密,將公鑰放置在前端中,即使公鑰暴露數(shù)據(jù)信息仍然是無(wú)法被解密得到;
2.1 RSA 在前端的使用
參考文章:https://blog.csdn.net/gkf6104/article/details/125848597
使用的第三方庫(kù):https://github.com/travist/jsencrypt
,依賴(lài)于jsencrypt
import JSEncrypt from 'jsencrypt';
const encryptor = new JSEncrypt();
const pubKey = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArBYpsjeeE7RG8XBsCbxf
Ra38w/ktBkqQvwDdkYCNt4M6w24AiEgIKRHeKti4abEf+xRESWmKADkaeiX2lX4D
1R2TiTtFAEpOsubfcndJD1hEYYM9MBjya9nS+6OtZV40R3emevXUbjyQsmCWN2Pc
M3dPvawRDgRj+BEtTHSY7VORhDTcvWfKWgvkc98IGxPVbCB2XEwwBBfRSUapl/pp
lhkefnfPZutv+SOXbGFYdImAeJozQYfVeMBdHlTvJP7nFvowCuM5YkCLq7X8L6cX
1FiaoEzM7oXia3tkrtUnCH4ar1tHjQbZnXn4m63gtEKnEgFsKo1IWDdAK4dXCMO/
8wIDAQAB
-----END PUBLIC KEY-----';
encryptor.setPublicKey(pubKey);
const enPassword = encryptor.encrypt(password)
2.2 RSA 在后端的使用
RSA 在后端主要是使用私鑰,加密前端傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行處理,解密之后數(shù)據(jù)進(jìn)行一系列的操作;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-443939.html
# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify
from utils.rsa_utils import RsaUtil
app = Flask(__name__)
@app.route('/home')
def index():
data = request.args.get("data")
data_decrypt = RsaUtil.decrypt_data("private_key.pem", data.encode())
# 解密后可以進(jìn)行數(shù)據(jù)的校驗(yàn)與存儲(chǔ)等操作
print(data_decrypt)
return "請(qǐng)求成功執(zhí)行"
if __name__ == '__main__':
app.run()
繼續(xù)努力,終成大器;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-443939.html
到了這里,關(guān)于Rsa 加密的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!