python AES/CBC/NoPadding 128位模式加密,key编码统一用utf-8 适应中文

最近因为工作需要在网上看了许多关于此对称加密的文章。我从网上copy了许多进行测试。发现现在能找的文章都是python2的比较老了,我现在用的是python3.6。工作中搜的许多内容都已经不适用,所以觉得需要开始自己写博客,因为许多工作经验都与网上的老资料不同了。而且工作中许多内容会边用边忘。不说了上实际代码。

class AES_ENCRYPT():
    def __init__(self, key):
        self.key = key
        self.mode = AES.MODE_CBC

        # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
    def encrypt(self, text):
        import base64
        cryptor = AES.new(self.key, self.mode, self.key)

        # 这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用

        # 这里密钥长度一定注意,对接方给我一个14位的,坑我好久

        length = 16                    # 这里只是用于下面取余前面别以为是配置
        count = len(text.encode('utf-8'))     # 这是我上传的主要目的,字符长度不同所以不能直接用,需要先编码转成字节
        print(count)               
        if (count % length != 0):
            add = length - (count % length)
        else:
            add = 0             #  看看你们对接是满16的时候加上16还是0.这里注意
        text1 = text + ('\0' * add)    # 其它语言nopadding时,python还是需要‘\0’或'\x00'这里注意与其它语言对接注意
        self.ciphertext = cryptor.encrypt(text1)          # 这里就是已经加密了

        cryptedStr = str(base64.b64encode(self.ciphertext),encoding='utf-8')

        return cryptedStr            # 我们的加密是到这里就可以了,这里跟我们对接平台的加密方式有关

        # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
        # 所以这里统一把加密后的字符串转化为16进制字符串

        print('self.ciphertext:',self.ciphertext)
        # print(len(cryptedStr.strip('\0')))     # 解密后,去掉补足的空格用strip() 去掉,注意python不是用‘’
        # b2a_hex(self.ciphertext)
        # print(cryptedStr)
        # return b2a_hex(self.ciphertext)
      


    def decrypt(self, text):
        import base64, json
        base_text = base64.b64decode(text)         # 没有用到16进制转码的我们需要base64 ,这个地方小坑
        # text = b2a_hex(base_text)    # 如果你们需要转码则用这个方法
        # new_text = a2b_hex(text)
        cryptor = AES.new(self.key, self.mode, self.key)
        plain_text = cryptor.decrypt(base_text)
        ne = plain_text.decode('utf-8').rstrip('\0')
        # print(json.loads(ne))      #我们传输使用的json所以我直接写到了这里,对你们应该没用
        return ne


if __name__ == '__main__':
    aes_encrypt = AES_ENCRYPT('lsakdalfjsadfn45')  # 初始化密钥
    # text = '<Tyhh>064302241150429</Tyhh><Tlb>1</Tlb>'
    text = 'aidd23.测试文本'#.encode("utf-8")
    sign_data = aes_encrypt.encrypt(text)
    print( sign_data)
    data = aes_encrypt.decrypt( sign_data )
    print( data )好多东西不知道下一个写什么,实用的东西很多

猜你喜欢

转载自blog.csdn.net/weixin_42068117/article/details/80083808
今日推荐