IOTXING

记录技术学习之路

0%

Python AES 加密 解密

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())