天天看點

Python實戰小程式——密碼加密小工具(Crypto庫)

實戰要求:給自己的密碼加密:密碼加密小工具

       對于部分喜歡将自己密碼存在郵箱、網盤等容易被盜的朋友,可以自己記住一個唯一的密鑰,通過這個小程式和密鑰産生一串加密密文再存儲,減少密碼被盜幾率。提示:Crypto庫,要求:a.輸入自己的秘鑰:123456,b.選擇是: encrypt 或者decrypt, c. 輸出:加密後的密文,或者解密後的明文)

       進階加密标準(Advanced Encryption Standard,AES),是美國聯邦政府采用的一種區塊加密标準。這個标準用來替代原先的DES,已經被多方分析且廣為全世界所使用。

       經過五年的甄選流程,進階加密标準由美國國家标準與技術研究院(NIST)于2001年11月26日釋出于FIPS PUB 197,并在2002年5月26日成為有效的标準。2006年,進階

加密标準已然成為對稱密鑰加密中最流行的算法之一。AES隻是個基本算法,實作AES有若幹模式。其中的CBC模式因為其安全性而被TLS(就是https的加密标準)和IPSec(win采用的)作為技術标準。簡單地說,CBC使用密碼和salt(起擾亂作用)按固定算法(md5)産生key和iv。然後用key和iv(初始向量,加密第一塊明文)加密(明文)

和解密(密文)我們需要使用的就是Crypto子產品中的AES子產品:

樣例代碼:

>>> from Crypto.Cipher import AES   #引入AES子產品
>>> obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
>>> message = "The answer is no"
>>> ciphertext = obj.encrypt(message)
>>> ciphertext
'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
>>> obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
>>> obj2.decrypt(ciphertext)
'The answer is no'
           

       AES.new(key,AES.MODE_CBC,iv)這個函數的用法:key指的是自己指定的加密的初始密鑰,AES.MODE_CBC 指的是加密的模式是CBC,iv指的是初始向量,加密第一塊明文)加密(明文)和解密(密文)。這裡的obj對象就生成了我們自己設定的加密方式,在調用obj對象的encrypt(加密)和decrypt(解密)方法,即可實作加密解密。

from Crypto.Cipher import AES
from binascii import b2a_hex,a2b_hex

class prpcrypt():   #定義一個類
    def __init__(self,key):
        self.key=key
        self.mode=AES.MODE_CBC
    def encrypt(self,text):
        cryptor=AES.new(self.key,self.mode,self.key)
        x = len(text) % 16
        if x != 0:
            text = text + '0' * (16 - x)     #不滿16,32,64位補0
        self.ciphertext=cryptor.encrypt(text)
        return b2a_hex(self.ciphertext)
    def decrypt(self,text):
        cryptor=AES.new(self.key,self.mode,self.key)
        plain_text=cryptor.decrypt(a2b_hex(text))
        return plain_text.rstrip('\0')

pc=prpcrypt('tecentbluewhaleA') #自己設定的密鑰
e=pc.encrypt("123456")
d=pc.decrypt(e)
print e,d
e=pc.encrypt("gffvdfshf")
d=pc.decrypt(e)
print e,d
           

這之中能還需要學習一下python中類的定義和使用方法,注意初始密鑰key必須是16位的。