企业微信解密算法Python简洁化示例,可直接使用进行解密echostr,完成设置接收事件服务器的url配置
注:该文仅对echostr
进行解密,可满足配置设置服务器url的需要,其余等后续需要会补充,或留言后我找时间再提炼简化其他解密算法
起因
企微提供的算法要么调整了没有同步修改提供的代码示例,要么就是过于解耦可读性较差。本文针对最需要的部分提出了最精简的代码。
精简代码
解决echostr解密返回明文,完成回调事件url的配置问题。
Crypto依赖包:pip install pycryptodome
import base64
import socket
import struct
from urllib import parse
from xml.dom import minidom
from Crypto.Cipher import AES
def aes_decrypt(secret_key, en_text):
aes = AES.new(secret_key, AES.MODE_CBC, secret_key[:16])
de_text = aes.decrypt(en_text)
return de_text
def de_echostr(echostr):
EncodingAESKey = '填写你自己的EncodingAESKey'
AESKey = base64.b64decode(EncodingAESKey + '=')
aes_msg = base64.b64decode(echostr)
rand_msg = aes_decrypt(AESKey, aes_msg)
content = rand_msg[16:] # 去掉前16随机字节
# 取出4字节的msg_len
xml_len = socket.ntohl(struct.unpack("I", content[:4])[0])
xml_content = content[4: xml_len + 4]
print('xml_content', xml_content)
return xml_content
# 读取xml数据函数
def get_xml_data(xml_text, node_name):
dom = minidom.parseString(xml_text)
root = dom.documentElement
node_eles = root.getElementsByTagName(node_name)
node_data = node_eles[0].firstChild.data
return node_data
if __name__ == '__main__':
echostr = '' # get请求过来的echostr参数值
echostr = parse.unquote(echostr)
ret = de_echostr(echostr)
print('解密后的echostr', ret)