首页 |  我的博客 |  查看该博主内容分类 | 

企业微信解密算法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)
posted @ 2022-10-12 17:01  Z哎呀  阅读(794)  评论(0)    收藏  举报