python RSA加密的示例
RSA加密是一種非對稱加密,通常使用公鑰加密,私鑰解密,私鑰簽名,公鑰驗(yàn)簽。
在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的.RSA算法通常是先生成一對RSA密鑰,其中之一是保密密鑰,由用戶保存;另一個(gè)為公開密鑰,可對外公開,甚至可在網(wǎng)絡(luò)服務(wù)器中注冊。
RSA是一種公鑰密碼算法,加密算法是將明文m(m<n是一個(gè)整數(shù))加密成密文c,即明文數(shù)字m的 E 次方求mod N,也就是將明文與自己相乘E次,然后結(jié)果除以N求余數(shù),余數(shù)就是密文c,E和N組合就是公鑰;解密算法為將密文c解密為明文m,即密文數(shù)字c的D次方求mod N,也就是將密文與自己相乘D次,然后結(jié)果除以N求余數(shù),余數(shù)就是明文m,D和N組合就是私鑰。
以下是關(guān)于RSA生成公鑰私鑰、加密、解密、加簽、驗(yàn)簽的示例。
1、生成公鑰私鑰:
from Crypto import Random
from Crypto.PublicKey import RSA
# 偽隨機(jī)數(shù)生成器
random_generator = Random.new().read
# rsa算法生成實(shí)例
rsa = RSA.generate(1024, random_generator)
# 私鑰的生成
private_pem = rsa.exportKey()
with open("private.pem", "wb") as f:
f.write(private_pem)
# 公鑰的生成
public_pem = rsa.publickey().exportKey()
with open("public.pem", "wb") as f:
f.write(public_pem)
生成的公鑰私鑰文件在項(xiàng)目路徑下,也可以直接指定生成文件路徑。
文件樣例

生成的公鑰私鑰格式是固定的,秘鑰中間無空格無換行,秘鑰末尾也空格無換行,如下:
-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEedv+5NsbqAh6pjOMKF8I7FGa et3QMUi0g5xDfQAM219qqXnoPi2hmCMjR8MWJV/zyMZ6IiRG/pvrZ2ZhfDNFdW3Z SfHczRUvabABzWAr/57/eDBjswv4RQA+gUS6t8wFY/iV+O3i9+d79iN3VhUogfI3 3Ru3+RPFeFW88tYUhwIDAQAB -----END PUBLIC KEY----- -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQDEedv+5NsbqAh6pjOMKF8I7FGaet3QMUi0g5xDfQAM219qqXno Pi2hmCMjR8MWJV/zyMZ6IiRG/pvrZ2ZhfDNFdW3ZSfHczRUvabABzWAr/57/eDBj swv4RQA+gUS6t8wFY/iV+O3i9+d79iN3VhUogfI33Ru3+RPFeFW88tYUhwIDAQAB AoGAApzaO5QAg+gioLroEZOR2/UEisjafUPCg0ACynT1lLYwGSOCzv9QrQbwZK42 HmvF0GCZnxMoJ1eIbEN2PZKgveQ/o4o8OdhuSk8pcDY72QwQHgSh1yfdvqkulo7D vdmjz63DVSrknYRQFYSHIwUPVVTWyT80OTCYSn3JGqNKa9kCQQDZUbtlBvcPzP4T 5hRaH9XvCh3PPusQKGPzVRVLn+qZ30N2PNgttYKRMshlz1WMts2ZAKr3b3BLT6GT shE5KatfAkEA53JkuV1vUEMg5j1ClgrwTs65yLWb+NbLH84xekrkkSxCkVjE7J/N QV7Uk87na49LuztBaECBmaZyTQnFKk7P2QJAMzcc18lVbmbcNipR/49jJquWrOHi GfO64nzZwPHWIx9H0dSzCcquE7QJIF1Fhx0JxRYwNJIRv93rcVhU0MjuNwJAIgI/ JrXCC4sxpGNQC3gkA5CA4Cs/dfsp8cx8nLmwiFx2k6D1nseEg5yJpAZ9HuL5f9Of MtB3uroohYVwAV1/UQJBAIZQkryoOJxPbfWvIIGBOAlS/QqfE5kLV+3L2RUtBlac nJykMucrdDx1gVKgoREUElxpYtlWI17h9MeNXRICgIM= -----END RSA PRIVATE KEY-----
2、加密(使用公鑰加密)
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
# 加密
message = "Hello,This is RSA加密"
rsakey = RSA.importKey(open("public.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey) #創(chuàng)建用于執(zhí)行pkcs1_v1_5加密或解密的密碼
cipher_text = base64.b64encode(cipher.encrypt(message.encode('utf-8')))
print(cipher_text.decode('utf-8'))
加密結(jié)果:
Y1oivzbBDIEWX+NaXYLCJo5A226TmuemketZMUM3U80Rw3gSETjG5rHQ+S++Yao+iGQ5jSJA2yjkDtDAjdvi2VUz15LRSkdeKoliWnWy93KKl+aNEsBl3SUicATUgfNWU5ILo+DiltpF79AfIEhPptAz7+gN11KAf5LjfcQZ2+0=
這里每次使用公鑰加密后的結(jié)果都不一致,跟對數(shù)據(jù)的padding即填充有關(guān)。
加密時(shí)支持的最大字節(jié)數(shù)與證書有一定關(guān)系。加密時(shí)支持的最大字節(jié)數(shù):證書位數(shù)/8 -11(比如:2048位的證書,支持的最大加密字節(jié)數(shù):2048/8 - 11 = 245)
1024位的證書,加密時(shí)最大支持117個(gè)字節(jié),解密時(shí)為128;
2048位的證書,加密時(shí)最大支持245個(gè)字節(jié),解密時(shí)為256。
如果需要加密的字節(jié)數(shù)超出證書能加密的最大字節(jié)數(shù),此時(shí)就需要進(jìn)行分段加密。
3、解密(使用私鑰解密)
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
# 解密
cipher_text = "Y1oivzbBDIEWX+NaXYLCJo5A226TmuemketZMUM3U80Rw3gSETjG5rHQ+S++Yao+iGQ5jSJA2yjkDtDAjdvi2VUz15LRSkdeKoliWnWy93KKl+aNEsBl3SUicATUgfNWU5ILo+DiltpF79AfIEhPptAz7+gN11KAf5LjfcQZ2+0="
encrypt_text = cipher_text.encode('utf-8')
rsakey = RSA.importKey(open("private.pem").read())
cipher = Cipher_pkcs1_v1_5.new(rsakey) #創(chuàng)建用于執(zhí)行pkcs1_v1_5加密或解密的密碼
text = cipher.decrypt(base64.b64decode(encrypt_text), "解密失敗")
print(text.decode('utf-8'))
解密結(jié)果,與加密前信息一致:
Hello,This is RSA加密
4、加簽(使用私鑰加簽)
使用私鑰加簽,每次簽名是一致的。
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.Hash import SHA
import base64
#加簽
message = "This is a request message..."
rsakey = RSA.importKey(open("private.pem").read())
signer = Signature_pkcs1_v1_5.new(rsakey)
digest = SHA.new()
digest.update(message.encode("utf-8"))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
print(signature.decode('utf-8'))
簽名結(jié)果:
fd99fQpbH48VT9YQKepyHSip9pwrJkm1PN3ZykHNrfTVk555fv392E7MtbIfcligOCWUx8nd3g+7J0Fo3x+9G1Y6MJs0CuMCbA4qulUMNGjzUpsN1URorMZfPKjPvhf22ARH9qZEnebQ7UUGO3ioy4nylZONb3Ldhga+PKyxYTM=
5、驗(yàn)簽(使用公鑰驗(yàn)簽)
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.Hash import SHA
import base64
#驗(yàn)簽
message_verify = "This is a request message..."
signature = "fd99fQpbH48VT9YQKepyHSip9pwrJkm1PN3ZykHNrfTVk555fv392E7MtbIfcligOCWUx8nd3g+7J0Fo3x+9G1Y6MJs0CuMCbA4qulUMNGjzUpsN1URorMZfPKjPvhf22ARH9qZEnebQ7UUGO3ioy4nylZONb3Ldhga+PKyxYTM="
rsakey = RSA.importKey(open("public.pem").read())
verifier = Signature_pkcs1_v1_5.new(rsakey)
hsmsg = SHA.new()
hsmsg.update(message_verify.encode("utf-8"))
is_verify = verifier.verify(hsmsg, base64.b64decode(signature))
print(is_verify)
驗(yàn)簽結(jié)果:
True
以上就是python RSA加密的示例的詳細(xì)內(nèi)容,更多關(guān)于python rsa加密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 幾行代碼即可實(shí)現(xiàn)人臉識別
Python中實(shí)現(xiàn)人臉識別功能有多種方法,依賴于python膠水語言的特性,我們通過調(diào)用包可以快速準(zhǔn)確的達(dá)成這一目的,本文給大家分享使用Python實(shí)現(xiàn)簡單的人臉識別功能的操作步驟,感興趣的朋友一起看看吧2022-02-02
Python編程使用PyQt5制作動(dòng)態(tài)鐘表示例
本篇文章將用 Python 同時(shí)繪制兩種類型的表;一個(gè)是上面提到的含有時(shí)、分、秒針的鐘表(為了方便,下面統(tǒng)稱為老式鐘表),一個(gè)是電子表,最終運(yùn)行效果文中如下呈現(xiàn)2021-10-10
python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹
這篇文章主要介紹了python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹,小編覺得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10
Python中將文件從一個(gè)服務(wù)器復(fù)制到另一個(gè)服務(wù)器的4種方法
Python中將文件從一個(gè)服務(wù)器復(fù)制到另一個(gè)服務(wù)器通常涉及到網(wǎng)絡(luò)傳輸,這個(gè)過程可以通過多種方式實(shí)現(xiàn),本文主要為大家介紹了4種常用方法,需要的可以參考下2024-10-10
Python.append()與Python.expand()用法詳解
今天小編就為大家分享一篇Python.append()與Python.expand()用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Pytorch如何指定device(cuda or cpu)
這篇文章主要介紹了Pytorch如何指定device(cuda or cpu)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
python中dtypes和type()函數(shù)的區(qū)別示例詳解
type()是python內(nèi)置的函數(shù),type()返回?cái)?shù)據(jù)結(jié)構(gòu)類型(list、dict、numpy.ndarray 等),dtype返回?cái)?shù)據(jù)元素的數(shù)據(jù)類型(int、float等),這篇文章主要給大家介紹了關(guān)于python中dtypes和type()函數(shù)區(qū)別的相關(guān)資料,需要的朋友可以參考下2024-03-03

