服务器租用攻略

对微信公众平台发送给微信公众账号的消息进行加解密python3版本代码
2019年11月23日 星期六
阅读(775)
来源:淘梦互联
摘要:官网的Python示例版本是python2改成python3版本,兼容中文python3.8.0下可用pip install pycryptodome==3.9.4WXBizMsgCrypt.py#!…

官网的Python示例版本是python2
改成python3版本,兼容中文
python3.8.0下可用

pip install pycryptodome==3.9.4

WXBizMsgCrypt.py

#!/usr/bin/env python#-*- encoding:utf-8 -*-""" 对公众平台发送给公众账号的消息加解密示例代码.
@copyright: Copyright (c) 1998-2014 Tencent Inc.

"""# ------------------------------------------------------------------------import base64import stringimport randomimport hashlibimport timeimport structfrom Crypto.Cipher import AESimport xml.etree.cElementTree as ETimport socketfrom .import ierror"""
关于Crypto.Cipher模块,ImportError: No module named 'Crypto'解决方案
请到官方网站www.dlitz.net/software/pycrypto/ 下载pycrypto。
下载后,按照README中的“Installation”小节的提示进行pycrypto安装。
"""class FormatException(Exception):
    passdef throw_exception(message, exception_class=FormatException):
    """my define raise exception function"""
    raise exception_class(message)class SHA1:
    """计算公众平台的消息签名接口"""

    def getSHA1(self, token, timestamp, nonce, encrypt):
        """用SHA1算法生成安全签名
        @param token:  票据
        @param timestamp: 时间戳
        @param encrypt: 密文
        @param nonce: 随机字符串
        @return: 安全签名
        """
        try:
            sortlist = [token, timestamp, nonce, encrypt]
            sortlist.sort()
            sha = hashlib.sha1()
            sha.update(("".join(sortlist)).encode())
            return ierror.WXBizMsgCrypt_OK, sha.hexdigest()
        except Exception as e:
            return ierror.WXBizMsgCrypt_ComputeSignature_Error, Noneclass XMLParse:
    """提供提取消息格式中的密文及生成回复消息格式的接口"""

    # xml消息模板
    AES_TEXT_RESPONSE_TEMPLATE = """<xml>
<Encrypt><![CDATA[%(msg_encrypt)s]]></Encrypt>
<MsgSignature><![CDATA[%(msg_signaturet)s]]></MsgSignature>
<TimeStamp>%(timestamp)s</TimeStamp>
<Nonce><![CDATA[%(nonce)s]]></Nonce>
</xml>"""

    def extract(self, xmltext):
        """提取出xml数据包中的加密消息
        @param xmltext: 待提取的xml字符串
        @return: 提取出的加密消息字符串
        """
        try:
            xml_tree = ET.fromstring(xmltext)
            encrypt  = xml_tree.find("Encrypt")
            return ierror.WXBizMsgCrypt_OK, encrypt.text        except Exception as e:
            print(e)
            return ierror.WXBizMsgCrypt_ParseXml_Error, None, None

    def generate(self, encrypt, signature, timestamp, nonce):
        """生成xml消息
        @param encrypt: 加密后的消息密文
        @param signature: 安全签名
        @param timestamp: 时间戳
        @param nonce: 随机字符串
        @return: 生成的xml字符串
        """
        resp_dict = {
                    'msg_encrypt' : encrypt,
                    'msg_signaturet': signature,
                    'timestamp'    : timestamp,
                    'nonce'        : nonce,
                     }
        resp_xml = self.AES_TEXT_RESPONSE_TEMPLATE % resp_dict        return resp_xmlclass PKCS7Encoder():
    """提供基于PKCS7算法的加解密接口"""

    block_size = 32
    def encode(self, bytes):
        """ 对需要加密的明文进行填充补位
        @param text: 需要进行填充补位操作的明文
        @return: 补齐明文字符串
        """
        text_length = len(bytes)
        # 计算需要填充的位数
        amount_to_pad = self.block_size - (text_length % self.block_size)
        if amount_to_pad == 0:
            amount_to_pad = self.block_size        # 获得补位所用的字符
        pad = chr(amount_to_pad).encode()
        return bytes + pad * amount_to_pad    def decode(self, decrypted):
        """删除解密后明文的补位字符
        @param decr
            
0


上一篇:连GITHUB都被黑客攻击了我们要怎样才能保障网站服务器安全
下一篇:DDOS攻击态势报告显示DDOS攻击5大趋势,高防服务器市场或将大热
淘梦互联旗下产品均支持24小时免费测试
淘梦互联海外服务器均支持24小时免费测试,先测试后付款让业务部署更放心
添加客服QQ:2369255694
申请测试
免费试用
免费试用
旗下产品均支持24小时免费测试
24小时免费电话
023-88256568