公司接口有加密,然后想用 Python 写一下加解密的类方面后面使用,百度找了许多都没有找到合适的,后面对比了一下 Java 的应该是填充的值有问题,然后百度了 AES 的 padding 应该怎么填充,PKCS5 的填充就是块的大小默认是 16,然后需要加密的明文长度除以这个,不足的补足到 16 的倍数,刚好是 16 的倍数也要补 16 位,然后补足的不是空格,而是差几位补充几位的 Unicode 值。
比如明文长度是 15,填充的是\x01
这边可以用 chr(x).encode('utf-8') 方法来获取需要填充的值
然后直接贴代码,Python 版本是 3.5 的
#/usr/bin/python
#encoding:utf-8
from Crypto.Cipher import AES
import base64
class AESECB:
block_size = 16
@staticmethod
def encrpyt(content,tk):
byte_content = content.encode('utf-8')
byte_key = tk.encode('utf-8')[0:16]
aes_new = AES.new(byte_key,AES.MODE_ECB)
if AESECB.block_size > len(byte_content):
padding = AESECB.block_size - len(byte_content)
byte_content = byte_content + chr(padding).encode('utf-8')*padding
elif AESECB.block_size < len(byte_content):
padding = AESECB.block_size - (len(byte_content)%AESECB.block_size)
byte_content = byte_content + chr(padding).encode('utf-8') * padding
else:
byte_content = byte_content + chr(16).encode('utf-8') * 16
result = aes_new.encrypt(byte_content)
base_result = base64.b64encode(result).decode('utf-8').replace('\n','').replace('\r','')
return base_result
@staticmethod
def decrpyt(encontent,tk):
key = tk[0:16]
des_new = AES.new(key,AES.MODE_ECB)
encontent += (len(encontent) % 4 )*'='
decrpytBytes = base64.b64decode(encontent)
meg = des_new.decrypt(decrpytBytes)
return meg.decode('utf-8').strip('')
有的同学引用 from Crypto.Cipher import AES 这个的时候可能会报错,可能会有两个问题,需要 pip pycrypto 这个 package
然后安装了以后还报错的话,直接在 Python 的 lib 文件夹下,site_package 这个文件夹
cypto 文件夹首字母改成大写,安装的时候默认不知道为什么是小写的,所以导入的时候都识别不了
然后如果还有问题的话,看一下你电脑上安装的 Visual Studio 的版本,百度了一下之前 2008 的版本已经不能用了,请安装一下 2015 的版本,然后安装一下 Python 相关的内容
然后剩下的就是调试了,这个是自己亲测可用,然后刚学,有什么不足的地方请指出,开贴做记录用,
参考了http://blog.csdn.net/sevenlater/article/details/50317999这个