一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python使用Pycrypto庫進(jìn)行RSA加密的方法詳解

Python使用Pycrypto庫進(jìn)行RSA加密的方法詳解

2020-08-25 09:58人世間 Python

RSA加密算法是一種強(qiáng)大的公鑰加密算法,安全性很高,這里我們來看一下Python使用Pycrypto庫進(jìn)行RSA加密的方法詳解,需要的朋友可以參考下

密碼與通信
密碼技術(shù)是一門歷史悠久的技術(shù)。信息傳播離不開加密與解密。密碼技術(shù)的用途主要源于兩個(gè)方面,加密/解密和簽名/驗(yàn)簽

在信息傳播中,通常有發(fā)送者,接受者和竊聽者三個(gè)角色。假設(shè)發(fā)送者M(jìn)aster想要寫信給接受者Ghost,可是又不想信的內(nèi)容被別人看到,因此Master需要先對(duì)信加密,而Ghost收到信之后又能解密。這樣別的人即使竊聽盜取了密文也無法解密。其次,如果竊聽者并不像破譯內(nèi)容,而是偽造Master發(fā)消息給Ghost,那么Master發(fā)消息前就得先對(duì)機(jī)密內(nèi)容進(jìn)行簽名。

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

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

安裝

?
1
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)單,我們分別為 Master和Ghost各生成一對(duì)屬于自己的秘鑰對(duì)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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)
 
# master的秘鑰對(duì)的生成
private_pem = rsa.exportKey()
 
with open('master-private.pem', 'w') as f:
  f.write(private_pem)
 
public_pem = rsa.publickey().exportKey()
with open('master-public.pem', 'w') as f:
  f.write(public_pem)
 
# ghost的秘鑰對(duì)的生成
private_pem = rsa.exportKey()
with open('master-private.pem', 'w') as f:
  f.write(private_pem)
 
public_pem = rsa.publickey().exportKey()
with open('master-public.pem', 'w') as f:
  f.write(public_pem)

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDR4Wq9l44lw/thTPyFmSi2hII92EPh90yGXQNL5e7zJPD16j6Q
tr+tIPNSQaVrnmNwrtqyEC2x4Meyp3tdCWPYUF11r2GgDgxKfUByetNG4XqJeUKk
kJ6D6C706mTf/2zsm8KFoNYCYPX1GhvpiTOikHcNlHLCnOD7jbMAovJg/QIDAQAB
AoGBAIz8V6+0NxC3bg4WoSs9j1PL/5F7zV3lucoogSZi9vjuP89x40Vi/a9XCxye
bHi2lSYEz3P92jQ7QuqIBx6gSCi3p2HLjD5LyQeSSMbPe8KSlf52dBUaPthbBceA
IJSBDrE8MKGpulTQKAJ7K3zQUOP2ZZgcKxq2jcQgS6iTENIBAkEA5r7emvwuL0Ob
Maav4o1Ovb5c6OL7bSm1tuLPSKl05WuNYfE6LkqiwOOn5lPvsqhwyI1dJeywVeQz
E+PvcTUR7QJBAOjZ8PxnP5T14fuhbfko4d24Ev+iiTBdq3pMXWvobEFL1ljV6aYE
2JAiMjO/Fzd1WgZhWPa3P+diyTs9mART6VECQQC0LeEXdsn9oDYEbFu1dZBB++8C
75NTJ5m8iJlB7QjZyMUq8Ln0wdUa9+n4ohxvDraa9EADSDJdr4bvBjLH3J/1AkBr
9QfO7kvDU5DXqoujVnoJ4xsj3IbAnt0vEZLKwfLW/0M84si2SU7i3IfsB+/KraT0
ilPF50ZAkEN+LNt7PjBRAkAHBBPME7IbFqxi5Cc/6R12DOMiJbOLDTS12b1J1cwG
p8WMIERsvwWdJw+4NdqjbJcjzeGrXhDBi//JU902TAwy
-----END RSA PRIVATE KEY-----
 
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDR4Wq9l44lw/thTPyFmSi2hII9
2EPh90yGXQNL5e7zJPD16j6Qtr+tIPNSQaVrnmNwrtqyEC2x4Meyp3tdCWPYUF11
r2GgDgxKfUByetNG4XqJeUKkkJ6D6C706mTf/2zsm8KFoNYCYPX1GhvpiTOikHcN
lHLCnOD7jbMAovJg/QIDAQAB
-----END PUBLIC KEY-----

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

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

1.加密(encrypt)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# Master使用Ghost的公鑰對(duì)內(nèi)容進(jìn)行rsa 加密
 
In [12]: message = 'hello ghost, this is a plian text'
In [13]: with open('ghost-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))
  ....:   print cipher_text
  ....:
 
 
HYQPGB+axWCbPp7PPGNTJEAhVPW0TX5ftvUN2v40ChBLB1pS+PVM3YGT5vfcsvmPZhW8NKVSBp8FwjLUnMn6yXP1O36NaunUzyHwI+cpjlkTwZs3DfCY/32EzeuKuJABin1FHBYUMTOKtHy+eEDOuaJTnZTC7ZBkdha+J88HXSc=

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

2.解密(decrypt)

?
1
2
3
4
5
6
7
8
9
10
11
# Ghost使用自己的私鑰對(duì)內(nèi)容進(jìn)行rsa 解密
 
In [14]: with open('ghost-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)
  ....:
In [15]: print text
hello ghost, this is a plian text
In [16]: assert text == message, 'decrypt falied'

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

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

簽名

?
1
2
3
4
5
6
7
8
9
10
11
# Master 使用自己的公鑰對(duì)內(nèi)容進(jìn)行簽名
In [17]: with open('master-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)
In [18]: print signature
jVUcAYfgF5Pwlpgrct3IlCX7KezWqNI5tD5OIFTrfCOQgfyCrOkN+/gRLsMiSDOHhFPj2LnfY4Cr5u4eG2IiH8+uSF5z4gUX48AqCQlqiOTLk2EGvyp+w+iYo2Bso1MUi424Ebkx7SnuJwLiPqNzIBLfEZLA3ov69aDArh6hQiw=

驗(yàn)簽

?
1
2
3
4
5
6
7
8
9
10
11
In [22]: with open('master-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
  ....:
True

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: gay帅老头毛都白了 gayxxx视频 | 午夜一级 | 欧美日韩亚毛片免费观看 | 岛国虐乳紧缚媚药调教 | 国产精品亚洲va在线观看 | 男人午夜视频在线观看 | 香蕉精品视频 | 香蕉久久夜色精品国产小优 | 国产靠逼视频 | 欧美人与禽杂交大片 | 日韩天堂视频 | 丰腴尤物贵妇浪荡小说 | 欧美日韩中文国产一区二区三区 | 色一情一乱一伦 | 性夜影院午夜看片 | 免费一级国产生活片 | 色姑娘久久 | 国产99re在线观看69热 | 欧美视频一区二区三区在线观看 | 四虎影院久久久 | 久久久免费观成人影院 | xnxx18美女 | 婷婷99视频精品全部在线观看 | 91亚洲一区二区在线观看不卡 | freehd182d动漫 | 亚洲欧洲综合 | 亚洲人成网站在线观看妞妞网 | 久久无码人妻AV精品一区 | 动漫精品一区二区三区3d | 欧美二区视频 | 男人视频网 | 亚洲免费在线看 | 日日操天天爽 | 美女撒尿毛片免费看 | 久久黄色精品视频 | 狠狠撸在线影院 | 亚洲精品乱码久久久久久蜜桃图片 | 成年男女免费视频网站 | 调教全程肉动画片在线观看 | 亚洲人成在线播放 | 日本xxxx69hd|