python 加密解密
因为项目开发,在对接钉钉的接口时,需要对钉钉发来的数据进行加密以及解密,自己顺带着就学习一下AES加密以及Base64加密
AES加密原理
这种属于对称加密算法,加密与解密用的密钥是相同的,如果密钥泄露,任何人都能够进行解密。因此保存好密钥是很重要的 AES加密所需要的内容:
- KEY 加密所需要用的秘钥
- IV 加密所需要的初始向量(一般使用KEY的前16位)
- Content 所需要加密的内容(内容必须有为16(128位)的整数倍,如果不足16位的需要用0补齐。这样能够保证在解密的时候能够顺利解密)
加密流程: AES解密所需要的内容:
- 加密时所用的KEY
- 加密时的初始向量
- content
解密流程: 我们使用python的Crypto包来进行AES的加密与解密
from Crypto.Cipher import AES
from Crypto import Random
class dingAes:
def __init__(self):
self.len = 16
self.key = aesKey ##加密用的key
def encrypt(self,content): ##content为需要加密的内容
content = self.pks7encode(content) ## 补齐content为16位
iv = Random.new().read(AES.block_size) ## 生成初始向量
aesEncode = AES.new(self.key,AES.MODE_CBC,iv) 生成aes对象
return aesEncode.encrypt(content) 调用encrypt方法进行加密
def decode(self,content):
content = base64.b64decode(content)
iv = content[:AES.block_size]
aesDecode =AES.new(self.key,AES.MODE_CBC,iv)
return aesDecode.decrypt(content[AES.block_size:])
def pks7encode(self, content):
"""
安装 PKCS#7 标准填充字符串
:param text: str
:return: str
"""
l = len(content)
output = StringIO.StringIO()
val = 32 - (l % 32)
for _ in xrange(val):
output.write('%02x' % val)
return content + binascii.unhexlify(output.getvalue())