A-A+
python3 利用 pycryptodome 实现(ECB模式)对称加密 – AES(256)加密,pkcs7补全方式
公司接口有加密,然后想用Python写一下加解密的类方面后面使用,百度找了许多都没有找到合适的,后面对比了一下Java的应该是填充的值有问题,然后百度了AES的padding应该怎么填充,PKCS5的填充就是块的大小默认是16,然后需要加密的明文长度除以这个,不足的补足到16的倍数,刚好是16的倍数也要补16位,然后补足的不是空格,而是差几位补充几位的Unicode值。
比如明文长度是15,填充的是\x01
这边可以用chr(x).encode('utf-8')方法来获取需要填充的值
然后直接贴代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | # 如果包装不了 就按照下面2个步骤 # pip uninstall crypto pycryptodome # pip install pycryptodome from Crypto.Util.Padding import pad from Crypto.Cipher import AES import base64 class PrpCrypt(object): def __init__(self): self.unpad = lambda date: date[0:-ord(date[-1])] def aes_cipher(self, key, aes_str): # 使用key,选择加密方式 aes = AES.new(key.encode('utf-8'), AES.MODE_ECB) pad_pkcs7 = pad(aes_str.encode('utf-8'), AES.block_size, style='pkcs7') # 选择pkcs7补全 encrypt_aes = aes.encrypt(pad_pkcs7) # 加密结果 encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 解码 encrypted_text_str = encrypted_text.replace("\n", "") # 此处我的输出结果老有换行符,所以用了临时方法将它剔除 return encrypted_text_str # 解密后,去掉补足的空格用strip() 去掉 def decrypt(self, key, decrData): # 解密函数 res = base64.decodebytes(decrData.encode("utf8")) aes = AES.new(key.encode('utf-8'), AES.MODE_ECB) msg = aes.decrypt(res).decode("utf8") return self.unpad(msg) if __name__ == '__main__': # key的长度需要补长(16倍数),补全方式根据情况而定,此处我就手动以‘0’的方式补全的32位key # key字符长度决定加密结果,长度16:加密结果AES(128),长度32:结果就是AES(256) key = "c72e5b90d42e406e907ceaecc7b00234" # # 加密字符串长同样需要16倍数:需注意,不过代码中pad()方法里,帮助实现了补全(补全方式就是pkcs7) aes_str = 'hello world' encryption_result = PrpCrypt().aes_cipher(key, aes_str) print('加密',encryption_result) c=PrpCrypt().decrypt(key,encryption_result) print('解密',c) |
文章来源:http://www.debug5.com/detail/65/#
布施恩德可便相知重
微信扫一扫打赏
支付宝扫一扫打赏