Python中RSA加解密與數字簽名技術的使用
更新時間:2025年03月18日 08:55:44 作者:jay丿
本文將詳細介紹 RSA 數字簽名的原理、實現步驟,以及如何通過 Python 的 rsa 庫完成公鑰私鑰生成、數字簽名和認證,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
RSA加解密與數字簽名技術詳解
- 在互聯網通信中,數據的安全性至關重要。
- 為了防止數據在傳輸過程中被篡改或偽造,數字簽名技術應運而生。
- RSA 是一種廣泛使用的非對稱加密算法,它不僅可以用于數據加密和解密,還可以用于數字簽名和認證。
一、RSA 數字簽名概述
1. 什么是數字簽名?
- 數字簽名是一種用于驗證數據完整性和來源的技術。
- 它類似于現實生活中的簽名,但具有更高的安全性和不可抵賴性。
- 通過數字簽名,接收方可以確認數據在傳輸過程中未被篡改,并且確實來自聲稱的發(fā)送方。
2. RSA 數字簽名的原理
RSA 數字簽名基于非對稱加密算法,使用一對密鑰:公鑰和私鑰。
- 私鑰:用于簽名數據,只有擁有私鑰的人才能生成有效的簽名。
- 公鑰:用于驗證簽名,任何人都可以使用公鑰驗證簽名的有效性。
簽名過程:
- 發(fā)送方使用私鑰對數據的哈希值進行加密,生成簽名。
- 發(fā)送方將數據和簽名一起發(fā)送給接收方。
驗證過程:
- 接收方使用公鑰對簽名進行解密,得到數據的哈希值。
- 接收方重新計算數據的哈希值,并與解密得到的哈希值進行比較。
- 如果兩個哈希值相同,則簽名有效,數據未被篡改。
二、安裝 rsa 庫
- 在 Python 中,我們可以使用
rsa庫來實現 RSA 加解密和數字簽名。 - 首先,需要安裝該庫:
pip install rsa
三、生成 RSA 公鑰和私鑰
- 在使用 RSA 數字簽名之前,需要生成一對公鑰和私鑰。
- 以下是生成公鑰和私鑰的示例代碼:
import rsa
from pathlib import Path
# 定義存儲路徑
BASE_DIR = Path(__file__).parent
# 生成公鑰、私鑰對象
public_key, private_key = rsa.newkeys(2048)
# 獲取公鑰對應的流數據
bpub_key = public_key.save_pkcs1()
# 獲取私鑰對應的流數據
bpri_key = private_key.save_pkcs1()
# 將公鑰存儲到文件中
with open(BASE_DIR / 'rsa/public.pem', "wb") as f:
f.write(bpub_key)
# 將私鑰存儲到文件中
with open(BASE_DIR / 'rsa/private.pem', "wb") as f:
f.write(bpri_key)代碼說明
生成密鑰對:
rsa.newkeys(2048):生成 2048 位的公鑰和私鑰。
保存密鑰:
save_pkcs1():將密鑰對象轉換為 PKCS#1 格式的字節(jié)流。- 將公鑰和私鑰分別保存到
public.pem和private.pem文件中。
四、使用 RSA 私鑰進行數字簽名
- 生成密鑰對后,可以使用私鑰對數據進行簽名。
- 以下是簽名的示例代碼:
import rsa
from pathlib import Path
# 定義存儲路徑
BASE_DIR = Path(__file__).parent
# 加載私鑰
with open(BASE_DIR / 'rsa/private.pem', 'rb') as f:
private_key = rsa.PrivateKey.load_pkcs1(f.read())
# 定義要簽名的字符串
message = "pwd=123&pk=1"
# 簽名,并獲取簽名后的流數據
sign_bytes = rsa.sign(message.encode(), private_key, "SHA-1")
# 獲取簽名字符串表示形式
sign_text = sign_bytes.hex()
print(f"簽名: {sign_text}")代碼說明
加載私鑰:
rsa.PrivateKey.load_pkcs1():從文件中加載私鑰。
簽名數據:
rsa.sign():使用私鑰對數據進行簽名。- 簽名算法為
SHA-1,可以根據需要選擇其他哈希算法。
獲取簽名字符串:
sign_bytes.hex():將簽名字節(jié)流轉換為十六進制字符串表示。
五、使用 RSA 公鑰進行數字認證
- 接收方收到數據和簽名后,可以使用公鑰驗證簽名的有效性。
- 以下是認證的示例代碼:
import rsa
from pathlib import Path
# 定義存儲路徑
BASE_DIR = Path(__file__).parent
# 加載公鑰
with open(BASE_DIR / 'rsa/public.pem', 'rb') as f:
public_key = rsa.PublicKey.load_pkcs1(f.read())
# 定義要認證的字符串
message = "pwd=123&pk=1"
# 獲取數字簽名(上一步返回的結果)
sign_text = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 替換為實際的簽名
# 使用公鑰進行認證
try:
hasher = rsa.verify(message.encode(), bytes.fromhex(sign_text), public_key)
if hasher == "SHA-1":
print("認證成功")
except rsa.VerificationError:
print("認證失敗")代碼說明
加載公鑰:
rsa.PublicKey.load_pkcs1():從文件中加載公鑰。
驗證簽名:
rsa.verify():使用公鑰驗證簽名的有效性。- 如果簽名有效,返回使用的哈希算法(如
SHA-1)。 - 如果簽名無效,拋出
rsa.VerificationError異常。
六、數字簽名的應用場景
數字簽名在以下場景中具有重要作用:
- 數據完整性驗證:確保數據在傳輸過程中未被篡改。
- 身份認證:驗證數據的來源,防止偽造。
- 不可否認性:發(fā)送方無法否認其發(fā)送的數據。
七、注意事項
密鑰管理:
- 私鑰必須妥善保管,避免泄露。
- 公鑰可以公開分發(fā)。
哈希算法選擇:
- 示例中使用了
SHA-1算法,但在實際應用中,建議使用更安全的哈希算法,如SHA-256。
異常處理:
- 在驗證簽名時,應捕獲
rsa.VerificationError異常,以處理認證失敗的情況。
總結
本文介紹了 RSA 數字簽名的原理、實現步驟,以及如何通過 Python 的 rsa 庫完成公鑰私鑰生成、數字簽名和認證。
RSA 數字簽名是一種強大的安全工具,可以有效保障數據的完整性和來源的真實性。
在實際應用中,我們應結合具體需求,選擇合適的密鑰長度和哈希算法,并妥善管理密鑰,以確保系統的安全性。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

