Pycrypto與RSA密碼技術筆記

密碼與通信

密碼技術是一門歷史悠久的技術鲸阔。信息傳播離不開加密與解密。密碼技術的用途主要源于兩個方面拘哨,加密/解密簽名/驗簽

在信息傳播中锡溯,通常有發(fā)送者赶舆,接受者竊聽者三個角色。假設發(fā)送者Master想要寫信給接受者Ghost祭饭,可是又不想信的內容被別人看到涌乳,因此Master需要先對信加密,而Ghost收到信之后又能解密甜癞。這樣別的人即使竊聽盜取了密文也無法解密。其次宛乃,如果竊聽者并不像破譯內容悠咱,而是偽造Master發(fā)消息給Ghost蒸辆,那么Master發(fā)消息前就得先對機密內容進行簽名。

密碼技術

為了進行加密以及通信析既,人們發(fā)明了很多公開的算法躬贡。對稱與非對稱算法等。常見的加密方式有RSA, AES等算法眼坏。對于選擇加密算法拂玻,一個常識就是使用公開的算法。一方面是這些算法經過實踐檢驗宰译,另一方面對于破譯難度和破譯條件破譯時間都有預估檐蚜。對于任何加密算法,都是能破解的沿侈,不同在于時間上的投入闯第。

Python密碼庫--Pycrypto

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

安裝

pip install pycrypto

RSA 密碼算法與簽名

RSA是一種公鑰密碼算法勾效,RSA的密文是對代碼明文的數字的 E 次方求mod N 的結果。也就是將明文和自己做E次乘法诚卸,然后再將其結果除以 N 求余數葵第,余數就是密文。RSA是一個簡潔的加密算法合溺。E 和 N 的組合就是公鑰public key)卒密。

對于RSA的解密,即密文的數字的 D 次方求mod N 即可棠赛,即密文和自己做 D 次乘法哮奇,再對結果除以 N 求余數即可得到明文。D 和 N 的組合就是私鑰private key)睛约。

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


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

# 偽隨機數生成器
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)

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

-----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通信宠进,需要加密內容,那么Ghost會生成一個秘鑰對藐翎,Ghost的公鑰ghost-public.pem和私鑰ghost-private.pem 材蹬。Ghost 把公鑰公開給發(fā)送者,任何人都可以用來加密吝镣,然后Master使用ghost-public.pem進行加密堤器,然后把內容發(fā)給Ghost,Ghost再使用ghost-private.pem進行解密赤惊。

加密(encrypt)

# Master使用Ghost的公鑰對內容進行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的密文吼旧。

解密(decrypt)

# Ghost使用自己的私鑰對內容進行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ā)的內容了,當然未舟,如果Ghost想要給Master發(fā)消息圈暗,就需要Master先把其的公鑰給Ghost,后者再使用公鑰加密裕膀,然后發(fā)送給Master员串,最后Master使用自己的私鑰解密。

簽名與驗簽

當然昼扛,對于竊聽者寸齐,有時候也可以對偽造Master給Ghost發(fā)送內容。為此出現了數字簽名抄谐。也就是Master給Ghost發(fā)送消息的時候渺鹦,先對消息進行簽名,表明自己的身份蛹含,并且這個簽名無法偽造毅厚。具體過程即Master使用自己的私鑰對內容簽名,然后Ghost使用Master的公鑰進行驗簽浦箱。

簽名

# Master 使用自己的公鑰對內容進行簽名
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=

驗簽

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 = verifier.verify(digest, base64.b64decode(signature))
   ....:      print is_verify
   ....:
True

總結

Pycrypto提供了比較完善的加密算法吸耿。RSA廣泛用于加密與解密,還有數字簽名通信領域酷窥。使用Publick/Private秘鑰算法中咽安,加密主要用對方的公鑰,解密用自己的私鑰蓬推。簽名用自己的私鑰妆棒,驗簽用對方的公鑰。

加密解密:公鑰加密,私鑰解密

簽名驗簽:私鑰簽名糕珊,公鑰驗簽

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市放接,隨后出現的幾起案子,更是在濱河造成了極大的恐慌留特,老刑警劉巖纠脾,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蜕青,居然都是意外死亡苟蹈,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門右核,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慧脱,“玉大人,你說我怎么就攤上這事贺喝×馀福” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵躏鱼,是天一觀的道長氮采。 經常有香客問我,道長染苛,這世上最難降的妖魔是什么鹊漠? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮茶行,結果婚禮上躯概,老公的妹妹穿的比我還像新娘。我一直安慰自己畔师,他們只是感情好娶靡,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茉唉,像睡著了一般固蛾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上度陆,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天艾凯,我揣著相機與錄音,去河邊找鬼懂傀。 笑死趾诗,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播恃泪,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼郑兴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贝乎?” 一聲冷哼從身側響起情连,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎览效,沒想到半個月后却舀,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡锤灿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年挽拔,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片但校。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡螃诅,死狀恐怖,靈堂內的尸體忽然破棺而出状囱,到底是詐尸還是另有隱情术裸,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布浪箭,位于F島的核電站穗椅,受9級特大地震影響,放射性物質發(fā)生泄漏奶栖。R本人自食惡果不足惜匹表,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宣鄙。 院中可真熱鬧袍镀,春花似錦、人聲如沸冻晤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼻弧。三九已至设江,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攘轩,已是汗流浹背叉存。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留度帮,地道東北人歼捏。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓稿存,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞳秽。 傳聞我的和親對象是個殘疾皇子瓣履,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容