Python中RSA加解密與數(shù)字簽名技術(shù)的使用
RSA加解密與數(shù)字簽名技術(shù)詳解
- 在互聯(lián)網(wǎng)通信中,數(shù)據(jù)的安全性至關(guān)重要。
- 為了防止數(shù)據(jù)在傳輸過程中被篡改或偽造,數(shù)字簽名技術(shù)應(yīng)運(yùn)而生。
- RSA 是一種廣泛使用的非對稱加密算法,它不僅可以用于數(shù)據(jù)加密和解密,還可以用于數(shù)字簽名和認(rèn)證。
一、RSA 數(shù)字簽名概述
1. 什么是數(shù)字簽名?
- 數(shù)字簽名是一種用于驗(yàn)證數(shù)據(jù)完整性和來源的技術(shù)。
- 它類似于現(xiàn)實(shí)生活中的簽名,但具有更高的安全性和不可抵賴性。
- 通過數(shù)字簽名,接收方可以確認(rèn)數(shù)據(jù)在傳輸過程中未被篡改,并且確實(shí)來自聲稱的發(fā)送方。
2. RSA 數(shù)字簽名的原理
RSA 數(shù)字簽名基于非對稱加密算法,使用一對密鑰:公鑰和私鑰。
- 私鑰:用于簽名數(shù)據(jù),只有擁有私鑰的人才能生成有效的簽名。
- 公鑰:用于驗(yàn)證簽名,任何人都可以使用公鑰驗(yàn)證簽名的有效性。
簽名過程:
- 發(fā)送方使用私鑰對數(shù)據(jù)的哈希值進(jìn)行加密,生成簽名。
- 發(fā)送方將數(shù)據(jù)和簽名一起發(fā)送給接收方。
驗(yàn)證過程:
- 接收方使用公鑰對簽名進(jìn)行解密,得到數(shù)據(jù)的哈希值。
- 接收方重新計(jì)算數(shù)據(jù)的哈希值,并與解密得到的哈希值進(jìn)行比較。
- 如果兩個(gè)哈希值相同,則簽名有效,數(shù)據(jù)未被篡改。
二、安裝 rsa 庫
- 在 Python 中,我們可以使用
rsa
庫來實(shí)現(xiàn) RSA 加解密和數(shù)字簽名。 - 首先,需要安裝該庫:
pip install rsa
三、生成 RSA 公鑰和私鑰
- 在使用 RSA 數(shù)字簽名之前,需要生成一對公鑰和私鑰。
- 以下是生成公鑰和私鑰的示例代碼:
import rsa from pathlib import Path # 定義存儲(chǔ)路徑 BASE_DIR = Path(__file__).parent # 生成公鑰、私鑰對象 public_key, private_key = rsa.newkeys(2048) # 獲取公鑰對應(yīng)的流數(shù)據(jù) bpub_key = public_key.save_pkcs1() # 獲取私鑰對應(yīng)的流數(shù)據(jù) bpri_key = private_key.save_pkcs1() # 將公鑰存儲(chǔ)到文件中 with open(BASE_DIR / 'rsa/public.pem', "wb") as f: f.write(bpub_key) # 將私鑰存儲(chǔ)到文件中 with open(BASE_DIR / 'rsa/private.pem', "wb") as f: f.write(bpri_key)
代碼說明
生成密鑰對:
rsa.newkeys(2048)
:生成 2048 位的公鑰和私鑰。
保存密鑰:
save_pkcs1()
:將密鑰對象轉(zhuǎn)換為 PKCS#1 格式的字節(jié)流。- 將公鑰和私鑰分別保存到
public.pem
和private.pem
文件中。
四、使用 RSA 私鑰進(jìn)行數(shù)字簽名
- 生成密鑰對后,可以使用私鑰對數(shù)據(jù)進(jìn)行簽名。
- 以下是簽名的示例代碼:
import rsa from pathlib import Path # 定義存儲(chǔ)路徑 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" # 簽名,并獲取簽名后的流數(shù)據(jù) sign_bytes = rsa.sign(message.encode(), private_key, "SHA-1") # 獲取簽名字符串表示形式 sign_text = sign_bytes.hex() print(f"簽名: {sign_text}")
代碼說明
加載私鑰:
rsa.PrivateKey.load_pkcs1()
:從文件中加載私鑰。
簽名數(shù)據(jù):
rsa.sign()
:使用私鑰對數(shù)據(jù)進(jìn)行簽名。- 簽名算法為
SHA-1
,可以根據(jù)需要選擇其他哈希算法。
獲取簽名字符串:
sign_bytes.hex()
:將簽名字節(jié)流轉(zhuǎn)換為十六進(jìn)制字符串表示。
五、使用 RSA 公鑰進(jìn)行數(shù)字認(rèn)證
- 接收方收到數(shù)據(jù)和簽名后,可以使用公鑰驗(yàn)證簽名的有效性。
- 以下是認(rèn)證的示例代碼:
import rsa from pathlib import Path # 定義存儲(chǔ)路徑 BASE_DIR = Path(__file__).parent # 加載公鑰 with open(BASE_DIR / 'rsa/public.pem', 'rb') as f: public_key = rsa.PublicKey.load_pkcs1(f.read()) # 定義要認(rèn)證的字符串 message = "pwd=123&pk=1" # 獲取數(shù)字簽名(上一步返回的結(jié)果) sign_text = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 替換為實(shí)際的簽名 # 使用公鑰進(jìn)行認(rèn)證 try: hasher = rsa.verify(message.encode(), bytes.fromhex(sign_text), public_key) if hasher == "SHA-1": print("認(rèn)證成功") except rsa.VerificationError: print("認(rèn)證失敗")
代碼說明
加載公鑰:
rsa.PublicKey.load_pkcs1()
:從文件中加載公鑰。
驗(yàn)證簽名:
rsa.verify()
:使用公鑰驗(yàn)證簽名的有效性。- 如果簽名有效,返回使用的哈希算法(如
SHA-1
)。 - 如果簽名無效,拋出
rsa.VerificationError
異常。
六、數(shù)字簽名的應(yīng)用場景
數(shù)字簽名在以下場景中具有重要作用:
- 數(shù)據(jù)完整性驗(yàn)證:確保數(shù)據(jù)在傳輸過程中未被篡改。
- 身份認(rèn)證:驗(yàn)證數(shù)據(jù)的來源,防止偽造。
- 不可否認(rèn)性:發(fā)送方無法否認(rèn)其發(fā)送的數(shù)據(jù)。
七、注意事項(xiàng)
密鑰管理:
- 私鑰必須妥善保管,避免泄露。
- 公鑰可以公開分發(fā)。
哈希算法選擇:
- 示例中使用了
SHA-1
算法,但在實(shí)際應(yīng)用中,建議使用更安全的哈希算法,如SHA-256
。
異常處理:
- 在驗(yàn)證簽名時(shí),應(yīng)捕獲
rsa.VerificationError
異常,以處理認(rèn)證失敗的情況。
總結(jié)
本文介紹了 RSA 數(shù)字簽名的原理、實(shí)現(xiàn)步驟,以及如何通過 Python 的 rsa
庫完成公鑰私鑰生成、數(shù)字簽名和認(rèn)證。
RSA 數(shù)字簽名是一種強(qiáng)大的安全工具,可以有效保障數(shù)據(jù)的完整性和來源的真實(shí)性。
在實(shí)際應(yīng)用中,我們應(yīng)結(jié)合具體需求,選擇合適的密鑰長度和哈希算法,并妥善管理密鑰,以確保系統(tǒng)的安全性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)手繪圖效果實(shí)例分享
在本篇文章里小編給大家整理了關(guān)于Python實(shí)現(xiàn)手繪圖效果,有需要的朋友們可以學(xué)習(xí)下。2020-07-07python連接遠(yuǎn)程ftp服務(wù)器并列出目錄下文件的方法
這篇文章主要介紹了python連接遠(yuǎn)程ftp服務(wù)器并列出目錄下文件的方法,實(shí)例分析了Python使用pysftp模塊的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04python實(shí)現(xiàn)登錄密碼重置簡易操作代碼
這篇文章主要介紹了python實(shí)現(xiàn)登錄密碼重置簡易操作,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-08-08關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解
這篇文章主要介紹了關(guān)于python函數(shù)的建立、調(diào)用、傳參、返回值詳解,Python?還支持自定義函數(shù),即將一段有規(guī)律的、可重復(fù)使用的代碼定義成函數(shù),從而達(dá)到一次編寫多次調(diào)用的目的,需要的朋友可以參考下2023-07-07Python操作word文檔插入圖片和表格的實(shí)例演示
這篇文章主要給大家介紹了關(guān)于Python操作word文檔插入圖片和表格的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Python使用reportlab將目錄下所有的文本文件打印成pdf的方法
這篇文章主要介紹了Python使用reportlab將目錄下所有的文本文件打印成pdf的方法,涉及reportlab模塊操作pdf文件的相關(guān)技巧,需要的朋友可以參考下2015-05-05python+pyqt5實(shí)現(xiàn)KFC點(diǎn)餐收銀系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+pyqt5實(shí)現(xiàn)KFC點(diǎn)餐收銀系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01