激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(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加密算法是一種強大的公鑰加密算法,安全性很高,這里我們來看一下Python使用Pycrypto庫進(jìn)行RSA加密的方法詳解,需要的朋友可以參考下

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

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

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

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

安裝

?
1
pip install pycrypto

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

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

算法的加密和解密還是很簡單的,可是公鑰和私鑰的生成算法卻不是隨意的。本文在于使用,對生成秘鑰對的算法就暫時忽略。使用 Pycrypto生成秘鑰對很簡單,我們分別為 Master和Ghost各生成一對屬于自己的秘鑰對。

?
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
 
# 偽隨機數(shù)生成器
random_generator = Random.new().read
# rsa算法生成實例
rsa = RSA.generate(1024, random_generator)
 
# master的秘鑰對的生成
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的秘鑰對的生成
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-----

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

簡而言之,Master給Ghost通信,需要加密內(nèi)容,那么Ghost會生成一個秘鑰對,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的公鑰對內(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使用自己的私鑰對內(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使用自己的私鑰解密。

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

簽名

?
1
2
3
4
5
6
7
8
9
10
11
# Master 使用自己的公鑰對內(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=

驗簽

?
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秘鑰算法中,加密主要用對方的公鑰,解密用自己的私鑰。簽名用自己的私鑰,驗簽用對方的公鑰。

  • 加密解密:公鑰加密,私鑰解密
  • 簽名驗簽:私鑰簽名,公鑰驗簽

無論是加密機密還是簽名驗簽都使用同一對秘鑰對。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久久精品av | 免费a观看 | 欧美日韩国产一区二区三区在线观看 | 视频一区二区三区免费观看 | 看片一区| 91精品国 | 久久国产28 | 久久99精品久久久久久236 | 中文字幕在线观看免费视频 | 伊人成人免费视频 | 国产一级一区二区三区 | 久久综合九色综合久久久精品综合 | 亚洲午夜久久久精品一区二区三区 | 羞羞网站在线观看入口免费 | av免费在线不卡 | 久久久久久久亚洲视频 | 性欧美videos 另类喷潮 | 毛片电影在线看 | 色七七久久影院 | 狠狠干五月天 | 超碰97在线人人 | 亚洲成人福利电影 | 久久2019中文字幕 | 九九色网站 | 成人免费网站在线观看 | 99re热精品视频 | 国产一区二区三区在线免费 | 国产亚洲精品久久久久婷婷瑜伽 | 香蕉国产9 | 激情欧美在线 | av影院在线| 一级黄色在线免费观看 | 国产精品久久久久久婷婷天堂 | 久久经典视频 | 色.com| 日本残忍极度灌浣肠视频 | 天天草夜夜爽 | 网站毛片 | 午夜伊人 | 国产成人精品免费视频大全办公室 | 特一级毛片 |