Python中RSA加解密與數(shù)字簽名技術(shù)的使用
RSA加解密與數(shù)字簽名技術(shù)詳解
- 在互聯(lián)網(wǎng)通信中,數(shù)據(jù)的安全性至關(guān)重要。
- 為了防止數(shù)據(jù)在傳輸過(guò)程中被篡改或偽造,數(shù)字簽名技術(shù)應(yīng)運(yùn)而生。
- RSA 是一種廣泛使用的非對(duì)稱加密算法,它不僅可以用于數(shù)據(jù)加密和解密,還可以用于數(shù)字簽名和認(rèn)證。
一、RSA 數(shù)字簽名概述
1. 什么是數(shù)字簽名?
- 數(shù)字簽名是一種用于驗(yàn)證數(shù)據(jù)完整性和來(lái)源的技術(shù)。
- 它類似于現(xiàn)實(shí)生活中的簽名,但具有更高的安全性和不可抵賴性。
- 通過(guò)數(shù)字簽名,接收方可以確認(rèn)數(shù)據(jù)在傳輸過(guò)程中未被篡改,并且確實(shí)來(lái)自聲稱的發(fā)送方。
2. RSA 數(shù)字簽名的原理
RSA 數(shù)字簽名基于非對(duì)稱加密算法,使用一對(duì)密鑰:公鑰和私鑰。
- 私鑰:用于簽名數(shù)據(jù),只有擁有私鑰的人才能生成有效的簽名。
- 公鑰:用于驗(yàn)證簽名,任何人都可以使用公鑰驗(yàn)證簽名的有效性。
簽名過(guò)程:
- 發(fā)送方使用私鑰對(duì)數(shù)據(jù)的哈希值進(jìn)行加密,生成簽名。
- 發(fā)送方將數(shù)據(jù)和簽名一起發(fā)送給接收方。
驗(yàn)證過(guò)程:
- 接收方使用公鑰對(duì)簽名進(jìn)行解密,得到數(shù)據(jù)的哈希值。
- 接收方重新計(jì)算數(shù)據(jù)的哈希值,并與解密得到的哈希值進(jìn)行比較。
- 如果兩個(gè)哈希值相同,則簽名有效,數(shù)據(jù)未被篡改。
二、安裝 rsa 庫(kù)
- 在 Python 中,我們可以使用
rsa庫(kù)來(lái)實(shí)現(xiàn) RSA 加解密和數(shù)字簽名。 - 首先,需要安裝該庫(kù):
pip install rsa
三、生成 RSA 公鑰和私鑰
- 在使用 RSA 數(shù)字簽名之前,需要生成一對(duì)公鑰和私鑰。
- 以下是生成公鑰和私鑰的示例代碼:
import rsa
from pathlib import Path
# 定義存儲(chǔ)路徑
BASE_DIR = Path(__file__).parent
# 生成公鑰、私鑰對(duì)象
public_key, private_key = rsa.newkeys(2048)
# 獲取公鑰對(duì)應(yīng)的流數(shù)據(jù)
bpub_key = public_key.save_pkcs1()
# 獲取私鑰對(duì)應(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)代碼說(shuō)明
生成密鑰對(duì):
rsa.newkeys(2048):生成 2048 位的公鑰和私鑰。
保存密鑰:
save_pkcs1():將密鑰對(duì)象轉(zhuǎn)換為 PKCS#1 格式的字節(jié)流。- 將公鑰和私鑰分別保存到
public.pem和private.pem文件中。
四、使用 RSA 私鑰進(jìn)行數(shù)字簽名
- 生成密鑰對(duì)后,可以使用私鑰對(duì)數(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}")代碼說(shuō)明
加載私鑰:
rsa.PrivateKey.load_pkcs1():從文件中加載私鑰。
簽名數(shù)據(jù):
rsa.sign():使用私鑰對(duì)數(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)證失敗")代碼說(shuō)明
加載公鑰:
rsa.PublicKey.load_pkcs1():從文件中加載公鑰。
驗(yàn)證簽名:
rsa.verify():使用公鑰驗(yàn)證簽名的有效性。- 如果簽名有效,返回使用的哈希算法(如
SHA-1)。 - 如果簽名無(wú)效,拋出
rsa.VerificationError異常。
六、數(shù)字簽名的應(yīng)用場(chǎng)景
數(shù)字簽名在以下場(chǎng)景中具有重要作用:
- 數(shù)據(jù)完整性驗(yàn)證:確保數(shù)據(jù)在傳輸過(guò)程中未被篡改。
- 身份認(rèn)證:驗(yàn)證數(shù)據(jù)的來(lái)源,防止偽造。
- 不可否認(rèn)性:發(fā)送方無(wú)法否認(rèn)其發(fā)送的數(shù)據(jù)。
七、注意事項(xiàng)
密鑰管理:
- 私鑰必須妥善保管,避免泄露。
- 公鑰可以公開(kāi)分發(fā)。
哈希算法選擇:
- 示例中使用了
SHA-1算法,但在實(shí)際應(yīng)用中,建議使用更安全的哈希算法,如SHA-256。
異常處理:
- 在驗(yàn)證簽名時(shí),應(yīng)捕獲
rsa.VerificationError異常,以處理認(rèn)證失敗的情況。
總結(jié)
本文介紹了 RSA 數(shù)字簽名的原理、實(shí)現(xiàn)步驟,以及如何通過(guò) Python 的 rsa 庫(kù)完成公鑰私鑰生成、數(shù)字簽名和認(rèn)證。
RSA 數(shù)字簽名是一種強(qiáng)大的安全工具,可以有效保障數(shù)據(jù)的完整性和來(lái)源的真實(shí)性。
在實(shí)際應(yīng)用中,我們應(yīng)結(jié)合具體需求,選擇合適的密鑰長(zhǎng)度和哈希算法,并妥善管理密鑰,以確保系統(tǒng)的安全性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python非對(duì)稱加密算法RSA實(shí)現(xiàn)原理與應(yīng)用詳解
- RSA加密算法Python實(shí)現(xiàn)方式
- Python?pycryptodome庫(kù)實(shí)現(xiàn)RSA加密解密消息
- 如何用Python實(shí)現(xiàn)RSA加密算法
- Windows11使用Cpython?編譯文件報(bào)錯(cuò)?error:?Unable?to?find?vcvarsall.bat?完美解決方法
- 簡(jiǎn)單的Python解密rsa案例
- Python使用RSA庫(kù)加密和解密
- python密碼學(xué)黑客攻擊RSA密碼
- python密碼學(xué)RSA密碼解密教程
相關(guān)文章
python opencv根據(jù)顏色進(jìn)行目標(biāo)檢測(cè)的方法示例
這篇文章主要介紹了python opencv根據(jù)顏色進(jìn)行目標(biāo)檢測(cè)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
人工智能學(xué)習(xí)Pytorch張量數(shù)據(jù)類型示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)Pytorch張量數(shù)據(jù)類型的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
python利用smtplib實(shí)現(xiàn)QQ郵箱發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了python利用smtplib實(shí)現(xiàn)QQ郵箱發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Python判斷一個(gè)數(shù)是否為質(zhì)數(shù)的3種方法(超詳細(xì))
一個(gè)大于1的自然數(shù),除了1和它本身外,不能被其他自然數(shù)(質(zhì)數(shù))整除(2, 3, 5, 7等),換句話說(shuō)就是該數(shù)除了1和它本身以外不再有其他的因數(shù),下面這篇文章主要給大家介紹了關(guān)于利用Python判斷一個(gè)數(shù)是否為質(zhì)數(shù)的3種方法,需要的朋友可以參考下2024-09-09
Python?第三方opencv庫(kù)實(shí)現(xiàn)圖像分割處理
這篇文章主要介紹了Python?第三方opencv庫(kù)實(shí)現(xiàn)圖像分割處理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
Python面向?qū)ο笾惡蛯?duì)象實(shí)例詳解
這篇文章主要介紹了Python面向?qū)ο笾惡蛯?duì)象,結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο笙嚓P(guān)的繼承、多態(tài)、類及對(duì)象等概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12

