FXSend/WxWork/WXBizMsgCrypt.h

137 lines
5.1 KiB
C
Raw Normal View History

2025-02-28 17:05:50 +08:00
#pragma once
#include <string>
#include <stdint.h>
#include "tinyxml2\tinyxml2.h"
namespace Tencent {
static const unsigned int kAesKeySize = 32;
static const unsigned int kAesIVSize = 16;
static const unsigned int kEncodingKeySize = 43;
static const unsigned int kRandEncryptStrLen = 16;
static const unsigned int kMsgLen = 4;
static const unsigned int kMaxBase64Size = 1000000000;
enum WXBizMsgCryptErrorCode
{
WXBizMsgCrypt_OK = 0,
WXBizMsgCrypt_ValidateSignature_Error = -40001,
WXBizMsgCrypt_ParseXml_Error = -40002,
WXBizMsgCrypt_ComputeSignature_Error = -40003,
WXBizMsgCrypt_IllegalAesKey = -40004,
WXBizMsgCrypt_ValidateCorpid_Error = -40005,
WXBizMsgCrypt_EncryptAES_Error = -40006,
WXBizMsgCrypt_DecryptAES_Error = -40007,
WXBizMsgCrypt_IllegalBuffer = -40008,
WXBizMsgCrypt_EncodeBase64_Error = -40009,
WXBizMsgCrypt_DecodeBase64_Error = -40010,
WXBizMsgCrypt_GenReturnXml_Error = -40011,
};
class WXBizMsgCrypt
{
public:
//<2F><><EFBFBD><EFBFBD><ECBAAF>
// @param sToken: <20><>ҵ΢<D2B5>ź<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>Token
// @param sEncodingAESKey: <20><>ҵ΢<D2B5>ź<EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>EncodingAESKey
// @param sCorpid: <20><>ҵ<EFBFBD>ŵ<EFBFBD>corpid
WXBizMsgCrypt(const std::string &sToken,
const std::string &sEncodingAESKey,
const std::string &sCorpid)
:m_sToken(sToken), m_sEncodingAESKey(sEncodingAESKey),m_sCorpid(sCorpid)
{ }
//<2F><>֤URL
// @param sMsgSignature: ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>msg_signature
// @param sTimeStamp: ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>timestamp
// @param sNonce: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nonce
// @param sEchoStr: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>echostr
// @param sReplyEchoStr: <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>echostr<74><72><EFBFBD><EFBFBD>return<72><6E><EFBFBD><EFBFBD><30><CAB1>Ч
// @return<72><6E><EFBFBD>ɹ<EFBFBD>0<EFBFBD><30>ʧ<EFBFBD>ܷ<EFBFBD><DCB7>ض<EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
int VerifyURL(const std::string& sMsgSignature,
const std::string& sTimeStamp,
const std::string& sNonce,
const std::string& sEchoStr,
std::string& sReplyEchoStr);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʵ<EFBFBD>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD>һ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param sMsgSignature: ǩ<><C7A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>msg_signature
// @param sTimeStamp: ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>timestamp
// @param sNonce: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦURL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nonce
// @param sPostData: <20><><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ӦPOST<53><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param sMsg: <20><><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD>ԭ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>return<72><6E><EFBFBD><EFBFBD><30><CAB1>Ч
// @return: <20>ɹ<EFBFBD>0<EFBFBD><30>ʧ<EFBFBD>ܷ<EFBFBD><DCB7>ض<EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
int DecryptMsg(const std::string &sMsgSignature,
const std::string &sTimeStamp,
const std::string &sNonce,
const std::string &sPostData,
std::string &sMsg);
//<2F><><EFBFBD><EFBFBD>ҵ΢<D2B5>Żظ<C5BB><D8B8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>
// @param sReplyMsg:<3A><>ҵ΢<D2B5>Ŵ<EFBFBD><C5B4>ظ<EFBFBD><D8B8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>xml<6D><6C>ʽ<EFBFBD><CABD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @param sTimeStamp: ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ɣ<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>URL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>timestamp
// @param sNonce: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ɣ<EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>URL<52><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nonce
// @param sEncryptMsg: <20><><EFBFBD>ܺ<EFBFBD><DCBA>Ŀ<EFBFBD><C4BF><EFBFBD>ֱ<EFBFBD>ӻظ<D3BB><D8B8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>msg_signature, timestamp, nonce, encrypt<70><74>xml<6D><6C>ʽ<EFBFBD><CABD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>,
// <20><>return<72><6E><EFBFBD><EFBFBD><30><CAB1>Ч
// return<72><6E><EFBFBD>ɹ<EFBFBD>0<EFBFBD><30>ʧ<EFBFBD>ܷ<EFBFBD><DCB7>ض<EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
int EncryptMsg(const std::string &sReplyMsg,
const std::string &sTimeStamp,
const std::string &sNonce,
std::string &sEncryptMsg);
int GetXmlField(const std::string & sPostData, const std::string & sField,std:: string &sEncryptMsg);
private:
std::string m_sToken;
std::string m_sEncodingAESKey;
std::string m_sCorpid;
private:
// AES CBC
int AES_CBCEncrypt( const char * sSource, const uint32_t iSize,
const char * sKey, unsigned int iKeySize, std::string * poResult );
int AES_CBCEncrypt( const std::string & objSource,
const std::string & objKey, std::string * poResult );
int AES_CBCDecrypt( const char * sSource, const uint32_t iSize,
const char * sKey, uint32_t iKeySize, std::string * poResult );
int AES_CBCDecrypt( const std::string & objSource,
const std::string & objKey, std::string * poResult );
//base64
int EncodeBase64(const std::string sSrc, std::string & sTarget);
int DecodeBase64(const std::string sSrc, std::string & sTarget);
//genkey
int GenAesKeyFromEncodingKey( const std::string & sEncodingKey, std::string & sAesKey);
//signature
int ComputeSignature(const std::string sToken, const std::string sTimeStamp, const std::string & sNonce,
const std::string & sMessage, std::string & sSignature);
int ValidateSignature(const std::string &sMsgSignature, const std::string &sTimeStamp,
const std::string &sNonce, const std::string & sEncryptMsg);
//get , set data
void GenRandStr(std::string & sRandStr, uint32_t len);
void GenNeedEncryptData(const std::string &sReplyMsg,std::string & sNeedEncrypt );
int SetOneFieldToXml(tinyxml2::XMLDocument * pDoc, tinyxml2::XMLNode* pXmlNode, const char * pcFieldName,
const std::string & value, bool bIsCdata);
int GenReturnXml(const std::string & sEncryptMsg, const std::string & sSignature, const std::string & sTimeStamp,
const std::string & sNonce, std::string & sResult);
};
}