python对称加密_【Python】 基于秘钥的对称加密

【Crypto】

关于用python进行信息的加密,类似的解决方案有很多比如用base64编码进行encode,再或者是hashlib来进行hash。但是还缺少一种明明场景很简单的解决方案,就是把利用一个秘钥,把一段明文加密然后用同一个秘钥可以把密文解密的这么一个简单的对称加密。

不信python会没有好的解决方案,就去网上找了一下。找到了利用Crypto这个模块来进行的。虽然安全性上python加密肯定不如静态语言加密的好,不过好歹有了一招比较像样的“防君子”之手段。

■  使用

Crypto不是Python自带的模块,需要安装pip install pycrypto。另外在程序中还要用到binascii这个模块。这个模块在2.7中似乎已经是自带的了。

from Crypto.Cipher importAESfrom binascii importa2b_hex,b2a_hexclassCryptor:#创立一个加密解密用的类

def __init__(self,key):

self.key=self.modifyLength(key)

self.mode=AES.MODE_CBCdefmodifyLength(self,s):

length=len(s)if length %16 ==0:

add=0else:

add= 16 - ( length % 16)return s + '\0' *adddefencrypt(self,text):

text=self.modifyLength(text)

cryptor= AES.new(self.key,self.mode,b'0000000000000000')

rawText=cryptor.encrypt(text)returnb2a_hex(rawText)[0]defdecrypt(self,text):

text=self.modifyLength(text)

cryptor= AES.new(self.key,self.mode,b'0000000000000000')

plain_text=cryptor.decrypt(a2b_hex(text))return plain_text.rsplit('\0')[0]

上面这个类定义了四个方法,第二个方法modifyLength是将传入的字符串进行位数判断,如果不是16的整数倍则用'\0'(即空字符)补全到16的倍数位数比如32位64位等等。这些是AES加密要求的,它要求秘钥、被加密的字符串等位数都要是16位的整数倍的个数。

key自然是创建这个类对象时用的秘钥了,两个方法encrypt和decrypt分别用于加密和解密。加密后的数据是16进制的数据,如果直接用一些编码格式去编码解码的话可能会存在编解码失败的情况,如果想要避免,则可以在加密阶段的密文先做一个十六进制转二进制的处理,在这里用的就是binascii.b2a_hex方法。解密的时候同样记得调用a2b_hex这个方法。另外还需要注意的是解密后的内容要去除末尾的空字符(因用这个类加密时,原来的明文可能被末尾的空字符补充过)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值