天天看点

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位的。