最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的RSA加密與解密實(shí)例解析

 更新時(shí)間:2019年11月18日 11:44:34   作者:lanston  
這篇文章主要介紹了python中的RSA加密與解密實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了python RSA加密與解密實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

什么是RSA:

RSA公開(kāi)密鑰密碼體制。所謂的公開(kāi)密鑰密碼體制就是使用不同的加密密鑰與解密密鑰,是一種“由已知加密密鑰推導(dǎo)出解密密鑰在計(jì)算上是不可行的”密碼體制。

在公開(kāi)密鑰密碼體制中,加密密鑰(即公開(kāi)密鑰)PK是公開(kāi)信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密算法E和解密算法D也都是公開(kāi)的。雖然解密密鑰SK是由公開(kāi)密鑰PK決定的,但卻不能根據(jù)PK計(jì)算出SK。

正是基于這種理論,1978年出現(xiàn)了著名的RSA算法,它通常是先生成一對(duì)RSA 密鑰,其中之一是保密密鑰,由用戶保存;另一個(gè)為公開(kāi)密鑰,可對(duì)外公開(kāi),甚至可在網(wǎng)絡(luò)服務(wù)器中注冊(cè)。為提高保密強(qiáng)度,RSA密鑰至少為500位長(zhǎng),一般推薦使用1024位。這就使加密的計(jì)算量很大。為減少計(jì)算量,在傳送信息時(shí),常采用傳統(tǒng)加密方法與公開(kāi)密鑰加密方法相結(jié)合的方式,即信息采用改進(jìn)的DES或IDEA密鑰加密,然后使用RSA密鑰加密對(duì)話密鑰和信息摘要。對(duì)方收到信息后,用不同的密鑰解密并可核對(duì)信息摘要。

RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法,也易于理解和操作。RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)今的三十多年里,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,截止2017年被普遍認(rèn)為是最優(yōu)秀的公鑰方案之一。

SET(Secure Electronic Transaction)協(xié)議中要求CA采用2048bits長(zhǎng)的密鑰,其他實(shí)體使用1024比特的密鑰。RSA密鑰長(zhǎng)度隨著保密級(jí)別提高,增加很快。下表列出了對(duì)同一安全級(jí)別所對(duì)應(yīng)的密鑰長(zhǎng)度。

python實(shí)現(xiàn)對(duì)RSA的加密和解密

Python密碼庫(kù)--Pycrypto

Python良好的生態(tài),對(duì)于加密解密技術(shù)都有成熟的第三方庫(kù)。大名鼎鼎的M2Crypto和Pycrypto,前者非常容易使用,可是安裝卻非常頭疼,不同的系統(tǒng)依賴軟件的版本還有影響。后者則比較方面,直接使用pip安裝即可。

密碼技術(shù)

為了進(jìn)行加密以及通信,人們發(fā)明了很多公開(kāi)的算法。對(duì)稱與非對(duì)稱算法等。常見(jiàn)的加密方式有RSA, AES等算法。對(duì)于選擇加密算法,一個(gè)常識(shí)就是使用公開(kāi)的算法。一方面是這些算法經(jīng)過(guò)實(shí)踐檢驗(yàn),另一方面對(duì)于破譯難度和破譯條件破譯時(shí)間都有預(yù)估。對(duì)于任何加密算法,都是能破解的,不同在于時(shí)間上的投入。

Python密碼庫(kù)--Pycrypto

Python良好的生態(tài),對(duì)于加密解密技術(shù)都有成熟的第三方庫(kù)。大名鼎鼎的M2Crypto和Pycrypto,前者非常容易使用,可是安裝卻非常頭疼,不同的系統(tǒng)依賴軟件的版本還有影響。后者則比較方面,直接使用pip安裝即可。

安裝

pip install pycrypto

RSA 密碼算法與簽名

RSA是一種公鑰密碼算法,RSA的密文是對(duì)代碼明文的數(shù)字的 E 次方求mod N 的結(jié)果。也就是將明文和自己做E次乘法,然后再將其結(jié)果除以 N 求余數(shù),余數(shù)就是密文。RSA是一個(gè)簡(jiǎn)潔的加密算法。E 和 N 的組合就是公鑰(public key)。

對(duì)于RSA的解密,即密文的數(shù)字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再對(duì)結(jié)果除以 N 求余數(shù)即可得到明文。D 和 N 的組合就是私鑰(private key)。

算法的加密和解密還是很簡(jiǎn)單的,可是公鑰和私鑰的生成算法卻不是隨意的。本文在于使用,對(duì)生成秘鑰對(duì)的算法就暫時(shí)忽略。使用 Pycrypto生成秘鑰對(duì)很簡(jiǎn)單,我們分別為 Server和Client各生成一對(duì)屬于自己的秘鑰對(duì)。

from Crypto import Random
from Crypto.Hash import SHA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5
from Crypto.PublicKey import RSA
 
# 偽隨機(jī)數(shù)生成器
random_generator = Random.new().read
# rsa算法生成實(shí)例
rsa = RSA.generate(1024, random_generator)
 
# Server的秘鑰對(duì)的生成
private_pem = rsa.exportKey()
with open("server-private.pem", "w") as f:
 f.write(private_pem)
 
public_pem = rsa.publickey().exportKey()
with open("server-public.pem", "w") as f:
 f.write(public_pem)
 
# Client的秘鑰對(duì)的生成
private_pem = rsa.exportKey()
with open("client-private.pem", "w") as f:
 f.write(private_pem)
 
public_pem = rsa.publickey().exportKey()
with open("client-public.pem", "w") as f:
 f.write(public_pem)

所生成的私鑰和公鑰大概是這樣的:

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC26X6A0WCWiVxdxq3jtm42yDdGbf+99v2zyi0UMVGZfowlnkcW
eMvpz8NBm2UVlrjZpnFr8wFkdHyjFFkq/ilclH3AN4+Xw8Ap7CGJ2jVMyS5h9RRB
Uyf3F4D5Og8789Ywh9HXYyvD/6J62EtbbkhGPxg3aa8n2kfKZ9N6Q7DqrwIDAQAB
AoGBAJn5qu1D1FxE24Vxl7ZGPzdMigN227+NaPptak9CSR++gLm2KL+JBpcXt5XF
+20WCRvnWjl2QijPSpB5s6pWdHezEa1cl6WrqB1jDJd1U99WNCL5+nfEVD9IF+uE
ig0pnj+wAT5fu78Z0UjxD9307f9S7BLC8ou3dWVkIqob6W95AkEAuPGTNlTkquu/
wBJTb4/+/2ZCf7Ci9qvsN3+RcrzFkKa3uTtBOa6Xk2R61zBkucUgY6cQHPbxhFLN
TVmXdbwxTQJBAP0wGenVOq4dCPdz3NhyghkKT6SL2w/SgbrROiJ1mG9MoBq58/0g
k85I91R7nuvOYTKTUkhWdPYITpDarmPJzesCQGRBmOMgHCHH0NfHV3Gn5rz+61eb
IoyD4Hapceh4CsWCiyAfzhj9229sTecvdbr68Lb0zphVCdIIrQCca63IShUCQGYI
e3jzmHlQdCudArQruWgz8pKiVf7TW7qY1O/MKkk4PRFoPP6WoVoxp5LhWtM20Y7b
Nf628N2xzU+tAThvvE8CQQCI1C7GO3I5EMfqPbTSq2oZq8thvGlyFyI7SNNuvAHj
hj2+0217B9CcTZqloYln01CNDVuaoUgEvFSw1OdRB1tC
-----END RSA PRIVATE KEY-----
 
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC26X6A0WCWiVxdxq3jtm42yDdG
bf+99v2zyi0UMVGZfowlnkcWeMvpz8NBm2UVlrjZpnFr8wFkdHyjFFkq/ilclH3A
N4+Xw8Ap7CGJ2jVMyS5h9RRBUyf3F4D5Og8789Ywh9HXYyvD/6J62EtbbkhGPxg3
aa8n2kfKZ9N6Q7DqrwIDAQAB
-----END PUBLIC KEY-----

加密與解密

通常通信的時(shí)候,發(fā)送者使用接受者的公鑰加密,接受者使用接受者私鑰解密。

簡(jiǎn)而言之,Server給Client通信,需要加密內(nèi)容,那么Client會(huì)生成一個(gè)秘鑰對(duì),Client的公鑰client-public.pem和私鑰client-private.pem 。Client把公鑰公開(kāi)給發(fā)送者,任何人都可以用來(lái)加密,然后Server使用client-public.pem進(jìn)行加密,然后把內(nèi)容發(fā)給Client,Client再使用私鑰client-private.pem進(jìn)行解密。

1.加密(encrypt)

# Server使用Client的公鑰對(duì)內(nèi)容進(jìn)行rsa 加密
 
message = "hello client, this is a message"
with open("client-public.pem") as f:
  key = f.read()
  rsakey = RSA.importKey(key)
  cipher = Cipher_pkcs1_v1_5.new(rsakey)
  cipher_text = base64.b64encode(cipher.encrypt(message.encode('utf-8')))
  print(cipher_text.decode('utf-8'))
 
#加密結(jié)果:
HYQPGB+axWCbPp7PPGNTJEAhVPW0TX5ftvUN2v40ChBLB1pS+PVM3YGT5vfcsvmPZhW8NKVSBp8FwjLUnMn6yXP1O36NaunUzyHwI+cpjlkTwZs3DfCY/32EzeuKuJABin1FHBYUMTOKtHy+eEDOuaJTnZTC7ZBkdha+J88HXSc=

cipher_text 即 Master加密后將要發(fā)送給Client的密文。

2.解密(decrypt)

# Client使用自己的私鑰對(duì)內(nèi)容進(jìn)行rsa 解密
 
with open("client-private.pem") as f:
  key = f.read()
  rsakey = RSA.importKey(key)
  cipher = Cipher_pkcs1_v1_5.new(rsakey)
  text = cipher.decrypt(base64.b64decode(encrypt_text), random_generator)
  print(text.decode('utf-8'))
 
#解密結(jié)果:
hello client, this is a message

這樣Client就能看到Server所發(fā)的內(nèi)容了,當(dāng)然,如果Client想要給Server發(fā)消息,就需要Server先把其的公鑰給Client,后者再使用公鑰加密,然后發(fā)送給Server,最后Server使用自己的私鑰解密。

簽名與驗(yàn)簽

當(dāng)然,對(duì)于竊聽(tīng)者,有時(shí)候也可以對(duì)偽造Server給Client發(fā)送內(nèi)容。為此出現(xiàn)了數(shù)字簽名。也就是Server給Client發(fā)送消息的時(shí)候,先對(duì)消息進(jìn)行簽名,表明自己的身份,并且這個(gè)簽名無(wú)法偽造。具體過(guò)程即Server使用自己的私鑰對(duì)內(nèi)容簽名,然后Client使用Server的公鑰進(jìn)行驗(yàn)簽。

簽名

# Server使用自己的私鑰對(duì)內(nèi)容進(jìn)行簽名
 with open("server-private.pem") as f:
  key = f.read()
  rsakey = RSA.importKey(key)
  signer = Signature_pkcs1_v1_5.new(rsakey)
  digest = SHA.new()
  digest.update(message)
  sign = signer.sign(digest)
  signature = base64.b64encode(sign)
  print signature
 
#簽名結(jié)果:
jVUcAYfgF5Pwlpgrct3IlCX7KezWqNI5tD5OIFTrfCOQgfyCrOkN+/gRLsMiSDOHhFPj2LnfY4Cr5u4eG2IiH8+uSF5z4gUX48AqCQlqiOTLk2EGvyp+w+iYo2Bso1MUi424Ebkx7SnuJwLiPqNzIBLfEZLA3ov69aDArh6hQiw=

驗(yàn)簽

#Client使用Server的公鑰對(duì)內(nèi)容進(jìn)行驗(yàn)簽
 
with open("server-public.pem") as f:
  key = f.read()
  rsakey = RSA.importKey(key)
  verifier = Signature_pkcs1_v1_5.new(rsakey)
  digest = SHA.new()
  # Assumes the data is base64 encoded to begin with
  digest.update(message)
  is_verify = signer.verify(digest, base64.b64decode(signature))
  print is_verify
#驗(yàn)簽結(jié)果:
True

總結(jié)

Pycrypto提供了比較完善的加密算法。RSA廣泛用于加密與解密,還有數(shù)字簽名通信領(lǐng)域。使用Publick/Private秘鑰算法中,加密主要用對(duì)方的公鑰,解密用自己的私鑰。簽名用自己的私鑰,驗(yàn)簽用對(duì)方的公鑰。

  • 加密解密:公鑰加密,私鑰解密
  • 簽名驗(yàn)簽:私鑰簽名,公鑰驗(yàn)簽

無(wú)論是加密解密還是簽名驗(yàn)簽都使用同一對(duì)秘鑰對(duì)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • pytorch 指定gpu訓(xùn)練與多gpu并行訓(xùn)練示例

    pytorch 指定gpu訓(xùn)練與多gpu并行訓(xùn)練示例

    今天小編就為大家分享一篇pytorch 指定gpu訓(xùn)練與多gpu并行訓(xùn)練示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 利用python批量修改word文件名的方法示例

    利用python批量修改word文件名的方法示例

    最近因?yàn)橐恍┦д`,導(dǎo)致恢復(fù)的文件名不對(duì),所以就寫(xiě)個(gè)python程序,下面這篇文章主要給大家介紹了關(guān)于利用python批量修改word文件名的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • Python實(shí)現(xiàn)的使用telnet登陸聊天室實(shí)例

    Python實(shí)現(xiàn)的使用telnet登陸聊天室實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)的使用telnet登陸聊天室,以實(shí)例形式較為詳細(xì)的分析了Python實(shí)現(xiàn)聊天室及Telnet登陸的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • Python使用方法重載實(shí)現(xiàn)訪問(wèn)者模式

    Python使用方法重載實(shí)現(xiàn)訪問(wèn)者模式

    這篇文章主要為大家詳細(xì)介紹了Python如何使用方法重載實(shí)現(xiàn)訪問(wèn)者模式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Python類繼承和多態(tài)原理解析

    Python類繼承和多態(tài)原理解析

    這篇文章主要介紹了python類繼承和多態(tài)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Python+turtle繪制七夕表白玫瑰花

    Python+turtle繪制七夕表白玫瑰花

    七夕節(jié),又稱“七巧節(jié)”“女兒節(jié)”“乞巧節(jié)”等,是中國(guó)民間的傳統(tǒng)節(jié)日。一年一度的七夕又快到了,用Python畫(huà)一朵玫瑰花送給你的那個(gè)TA吧
    2022-08-08
  • python實(shí)現(xiàn)列表推導(dǎo)式與生成器

    python實(shí)現(xiàn)列表推導(dǎo)式與生成器

    列表推導(dǎo)式和生成器都是Python中處理集合的強(qiáng)大工具,列表推導(dǎo)式用于快速生成列表,而生成器表達(dá)式則提供了一種節(jié)約內(nèi)存的方式來(lái)處理大型數(shù)據(jù)集,下面就來(lái)介紹一下python實(shí)現(xiàn)列表推導(dǎo)式與生成器,感興趣的可以了解一下
    2024-09-09
  • Python中的__new__與__init__魔術(shù)方法理解筆記

    Python中的__new__與__init__魔術(shù)方法理解筆記

    這篇文章主要介紹了Python中的__new__與__init__魔術(shù)方法理解筆記,需要的朋友可以參考下
    2014-11-11
  • 如何利用python讀取micaps文件詳解

    如何利用python讀取micaps文件詳解

    這篇文章主要給大家介紹了關(guān)于如何利用python讀取micaps文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python實(shí)戰(zhàn)之實(shí)現(xiàn)截圖識(shí)別文字

    Python實(shí)戰(zhàn)之實(shí)現(xiàn)截圖識(shí)別文字

    本文主要介紹了通過(guò)python實(shí)現(xiàn)截圖識(shí)別圖中文字的功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以學(xué)習(xí)一下
    2021-11-11

最新評(píng)論

庆安县| 安阳市| 建平县| 西吉县| 长岛县| 桃园市| 山西省| 化州市| 太白县| 石棉县| 杭锦后旗| 磐安县| 营山县| 凌源市| 沈阳市| 池州市| 唐河县| 乌拉特中旗| 炉霍县| 郓城县| 宣武区| 西贡区| 万盛区| 沭阳县| 富顺县| 茶陵县| 怀柔区| 七台河市| 察隅县| 涿鹿县| 翁牛特旗| 安丘市| 河南省| 通河县| 长乐市| 新化县| 娱乐| 离岛区| 阿合奇县| 九寨沟县| 依安县|