aes加密,ECB模式,pkcs5padding和zeropadding两种填充方式

上一篇 / 下一篇  2018-04-10 11:21:15 / 个人分类:general

最近在做接口自动化测试,所有的接口入参前端需要进行aes加密,后端需要对参数解密,返回结果后端加密好给前端,前端需要解密后使用,为此写了两套aes加密(没有提前沟通,以为开发使用的是zeropadding,但实际是pkcs5padding),把代码放上来,需要的朋友可以直接复用


updated by wyy on 2018/4/24
实际使用中,发现入参中带有中文就会出现错误,定位问题出现在padding段,网上查资料受到这篇文章启发https://www.zhihu.com/question/64097260/answer/216495936,入参是中文时,算的字符串长度是错误的,所以把入参编码成gbk模式算长度,padding后得到的字符串(含中文)也编码成gbk二进制给aes的加密函数作入参


############aes_pkcs5padding.py

#!/usr/bin/env python35
# -*- coding: utf-8 -*-
# Created by wyy on 2018/3/20 13:48.

import base64
import json
import re

from Crypto.Cipher import AES

#http://tool.chacuo.net/cryptaes
class AESECB:
    def __init__(self, key):
        self.key = key
        self.mode = AES.MODE_ECB
        
        self.bs = 16  # block size
        #self.PADDING = lambda s: s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)只支持英文入参
        self.PADDING = lambda s: s + (self.bs - len(s.encode('gbk')) % self.bs) * chr(self.bs - len(s.encode('gbk')) % self.bs)

    def encrypt(self, text):

        aes = AES.new(str.encode(self.key), self.mode)  # ECB模式无需向量iv
        #encrypt_aes = aes.encrypt((self.PADDING(text)).encode(encoding="utf-8"))
        encrypt_aes = aes.encrypt((self.PADDING(text)).encode(encoding="gbk"))
        encrypted_base64 = base64.b64encode(encrypt_aes)
        #print(encrypted_base64)
        #return str(encrypted_base64, encoding='utf-8')
        
        return encrypted_base64
    
    
    def decrypt(self, text):
        aes = AES.new(str.encode(self.key), self.mode)  # ECB模式无需向量iv
        text += (len(text) % 4) * '='
        encrypt_aes = base64.b64decode(text)
        data = aes.decrypt(encrypt_aes)        

        # 去除解码后的非法字符data.decode()        
        try:
            result = re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', str(data, encoding='utf-8'))
        except Exception:
            result = '解码失败,请重试!'
        return result


if __name__ == '__main__':
    aes = AESECB('1234567890123456')
    #print(aes.encrypt('wyy1221wyy1221'))
    #print(aes.decrypt('m9RKpQSCrZ6fF7RuPoyNLA=='))
    
    a = str({"mobile":"15950561221"}).replace(' ', '')
    b = json.dumps({'mobile':'15950561221'})
    print(a)
    print(b)
    print(aes.encrypt(a))
    print(aes.decrypt('EOW+1UQBPF8fb7CQM55ZXZxjbApqYdNLyTFiWsBwEso='))












##################################aes_zeropadding.py


#!/usr/bin/python
# -*- coding: utf-8 -*-

from Crypto.Cipher import AES
import base64
    


# str不是16的倍数那就补足为16的倍数
def add_to_16(value='1234567890123456'):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes



#http://tool.chacuo.net/cryptaes
#加密方法
def myEncrypt(data):

    # 初始化加密器,先进行aes加密
    aes = AES.new(add_to_16(), AES.MODE_ECB)    
    encrypt_aes = aes.encrypt(add_to_16(data))

    #用base64编码
    encrypted_data = base64.encodebytes(encrypt_aes)
    #print(encrypted_data)
    print(str(encrypted_data, encoding='utf-8'))



#解密方法
def myDecrypt(encrypted_data):
   
    #优先逆向解密base64成bytes
    encrypt_aes = base64.decodebytes(encrypted_data.encode(encoding='utf-8'))

    # 初始化加密器,进行aes解密
    aes = AES.new(add_to_16(), AES.MODE_ECB)
    data = aes.decrypt(encrypt_aes)
    #print(data)
    print(str(data, encoding='utf-8'))



if __name__ == '__main__':
    myEncrypt('abc123def456')
    myDecrypt('3/uact5LFrvu4W63QHIvcw==')


TAG:

 

评分:0

我来说两句

Open Toolbar