C# + PHP RSA保密通讯

学习中...

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LiveMGT
{
    public partial class Main : Form
    {
        private readonly string AppID = "703093033";
        private readonly string AppKey = "e2470a332d21d641298136c2754331aa";
        private readonly HttpHelper HTTP;

        public Main()
        {
            InitializeComponent();

            string PuKey = File.ReadAllText(@".\Config\PuKey.xml");
            INIHelper INIFile = new INIHelper();
            string Url = INIFile.Read("Server", "Url", "Null", @".\Config\Client.ini");

            HTTP = new HttpHelper(AppID, AppKey, PuKey, Url);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            
            HTTP.POST(textBox1.Text,out string reStr,out string errStr);
            textBox2.Text = errStr;
            textBox3.Text = reStr;
        }

        private void Main_Load(object sender, EventArgs e)
        {

        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using zlib;

namespace LiveMGT
{
    class HttpHelper
    {
        private readonly string AppID;
        private readonly string AppKey;
        private readonly string PuKey;
        private readonly string Url;
        private string PHPSESSID;

        #region 初始化
        /// <summary>
        /// 初始化
        /// </summary>
        public HttpHelper(string _AppID, string _AppKey, string _PuKey, string _Url)
        {
            AppID = _AppID;
            AppKey = _AppKey;
            PuKey = _PuKey;
            Url = _Url;
            PHPSESSID = "";
        }
        #endregion

        #region HTTP POST
        /// <summary>
        /// HTTP POST
        /// </summary>
        /// <param name="dataStr">需要提交的字符串</param>
        /// <param name="resultStr">提交后网页返回的JSON字符串</param>
        /// <param name="errStr">如果提交失败返回错误内容</param>
        /// <returns>成功返回true,失败返回false</returns>
        public bool POST(string dataStr,out string resultStr,out string errStr) 
        {
            resultStr = "";
            errStr = "";
            if (dataStr == string.Empty || dataStr == "") 
            {
                errStr = "request_data_err";
                return false;
            }
            try
            {
                string NumRan = RanNum();                                       //请求随机
                string TimeRnd = GetTimeStamp(true);                            //请求时间
                string KeyRnd = MD5(AppID + TimeRnd + NumRan + AppKey);         //请求密钥
                KeyRnd = HmacMD5(KeyRnd, AppKey);                               //请求密钥
                string RSARnd = RSAENC(PuKey, KeyRnd);                          //公钥加密
                RSARnd = StrToHex(RSARnd);                                      //公钥加密
                if (RSARnd == "")
                {
                    errStr = "request_rsa_err";
                    return false;
                }
                //-----------------------------------------------------------------------------
                int dataLen = dataStr.Length;                                   //数据长度
                dataStr = Compress(dataStr);                                    //数据压缩
                string postStr = RC4ENC(dataStr, KeyRnd);                       //加密数据
                byte[] sendData = Encoding.UTF8.GetBytes(postStr);              //发送数据             
                string cookieStr = PHPSESSID + ";appid=" + AppID + ";time=" + TimeRnd + ";rand=" + NumRan + ";length=" + dataLen + ";key=" + RSARnd;
                //----------------------------------------------------------------------------- 
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";
                request.Timeout = 10000;
                request.KeepAlive = false;
                request.Headers.Add("Cookie", cookieStr);
                request.ContentLength = sendData.Length;
                Stream newStream = request.GetRequestStream();
                newStream.Write(sendData, 0, sendData.Length);
                newStream.Close();
                HttpWebResponse myResponse = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                string content = reader.ReadToEnd();
                reader.Close();
                reader.Dispose();
                cookieStr = myResponse.Headers.Get("Set-Cookie");
                resultStr = content;//不管是否成功都返回
                //-----------------------------------------------------------------------------  
                if (PHPSESSID == "")
                {
                    PHPSESSID = MidStrEx(cookieStr, "PHPSESSID=", ";");
                    if (PHPSESSID == string.Empty || PHPSESSID == "")
                    {
                        errStr = "response_phpsessid_err";
                        return false;
                    }
                    PHPSESSID = "PHPSESSID=" + PHPSESSID;
                }
                string _appid = MidStrEx(cookieStr, "appid=", ";");
                if (_appid == string.Empty || _appid == "" || _appid != AppID)
                {
                    errStr = "response_appid_err";
                    return false;
                }
                //----------------------------------------------------------------------------- 
                NumRan = MidStrEx(cookieStr, "rand=", ";");                             //请求随机
                TimeRnd = MidStrEx(cookieStr, "time=", ";");                            //请求时间
                RSARnd = MidStrEx(cookieStr, "key=", ";");                              //公钥加密
                dataLen = int.Parse(MidStrEx(cookieStr, "length=", ";"));               //数据长度
                if (NumRan == string.Empty || NumRan == "" || TimeRnd == string.Empty || TimeRnd == "" || RSARnd == string.Empty || RSARnd == "" || dataLen <= 0)
                {
                    errStr = "response_cooikes_err";
                    return false;
                }
                KeyRnd = MD5(AppID + TimeRnd + NumRan + AppKey);                        //请求密钥
                KeyRnd = HmacMD5(KeyRnd, AppKey);                                       //请求密钥
                RSARnd = HexToStr(RSARnd);                                              //公钥加密
                //----------------------------------------------------------------------------- 
                if (RSACheck(content, RSARnd, PuKey) == false)
                {
                    errStr = "response_check_err";
                    return false;
                }
                content = RC4DEC(content, KeyRnd);
                if (content == string.Empty || content == "") 
                {
                    errStr = "response_rc4dec_err";
                    return false;
                }
                content = UCompress(content, dataLen);
                if (content == string.Empty || content == "")
                {
                    errStr = "response_ucompress_err";
                    return false;
                }
                resultStr = content;
                return true;
            } 
            catch
            {
                return false;
            }
        }
        #endregion

        #region 取随机数
        /// <summary>
        /// 取随机数
        /// </summary>
        /// <returns></returns>
        private static string RanNum() 
        {
            try
            {
                Random rnd = new Random();
                string num = rnd.Next(11111111, 88888888).ToString();
                return num;
            }
            catch 
            {
                return "";
            }
        }
        #endregion

        #region 取字符串中间
        /// <summary>
        /// 取字符串中间
        /// </summary>
        /// <param name="sourse">需要截取的字符串</param>
        /// <param name="startstr">字符串前面</param>
        /// <param name="endstr">字符串后面</param>
        /// <returns>返回截取后字符串</returns>
        private static string MidStrEx(string sourse, string startstr, string endstr)
        {
            try
            {
                string result = "";
                int startindex, endindex;
                startindex = sourse.IndexOf(startstr);
                if (startindex == -1)
                    return result;
                string tmpstr = sourse.Substring(startindex + startstr.Length);
                endindex = tmpstr.IndexOf(endstr);
                if (endindex == -1)
                    return result;
                result = tmpstr.Remove(endindex);
                return result;
            }
            catch
            {
                return "";
            }
        }
        #endregion

        #region 数据解压
        /// <summary>
        /// 数据解压
        /// </summary>
        /// <param name="strSource">需要解压的字符串</param>
        /// <param name="sLen">字符串未压缩之前的长度</param>
        /// <returns>返回解压后字符串</returns>
        private static string UCompress(string strSource,int sLen)
        {
            try 
            {
                int data;
                int stopByte = -1;

                byte[] Buffer = Convert.FromBase64String(strSource); // 解base64
                MemoryStream intms = new MemoryStream(Buffer);
                ZInputStream inZStream = new ZInputStream(intms);
                byte[] inByteList = new byte[sLen];
                int i = 0;
                while (stopByte != (data = inZStream.Read()))
                {
                    inByteList[i] = (byte)data;
                    i++;
                }
                inZStream.Close();
                return Encoding.UTF8.GetString(inByteList, 0, inByteList.Length);
            } 
            catch 
            {
                return "";
            }
        }
        #endregion

        #region 数据压缩
        /// <summary>
        /// 数据压缩
        /// </summary>
        /// <param name="Source">需要压缩的字符串</param>
        /// <returns>压缩后字符串</returns>
        private static string Compress(string Source)
        {
            try
            {
                byte[] byteData = Encoding.UTF8.GetBytes(Source);
                MemoryStream ms = new MemoryStream();
                Stream s = new ZOutputStream(ms, 9);

                s.Write(byteData, 0, byteData.Length);
                s.Close();
                byte[] compressData = (byte[])ms.ToArray();
                ms.Flush();
                ms.Close();
                return Convert.ToBase64String(compressData);
            }
            catch
            {
                return "";
            }
        }
        #endregion

        #region 获取当前时间戳
        /// <summary>  
        /// 获取当前时间戳  
        /// </summary>  
        /// <param name="bflag">为真时获取10位时间戳,为假时获取13位时间戳.bool bflag = true</param>  
        /// <returns>返回时间戳字符串</returns>  
        private static string GetTimeStamp(bool bflag)
        {
            try 
            {
                TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                if (bflag)
                    return Convert.ToInt64(ts.TotalSeconds).ToString();
                else
                    return Convert.ToInt64(ts.TotalMilliseconds).ToString();
            } 
            catch
            {
                return "";
            }
        }
        #endregion

        #region 用MD5加密字符串
        /// <summary>
        /// 用MD5加密字符串
        /// </summary>
        /// <param name="password">待加密的字符串</param>
        /// <returns>返回的加密后的字符串</returns>
        private static string MD5(string password)
        {
            try 
            {
                MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
                byte[] hashedDataBytes;
                hashedDataBytes = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(password));
                StringBuilder tmp = new StringBuilder();
                md5Hasher.Clear();
                md5Hasher.Dispose();
                foreach (byte i in hashedDataBytes)
                {
                    tmp.Append(i.ToString("x2"));
                }
                return tmp.ToString();//默认情况
            } 
            catch
            {
                return "";
            }
        }
        #endregion

        #region HmacMD5加密
        /// <summary>
        /// HmacMD5加密
        /// </summary>
        /// <param name="source">需要加密的字符串</param>
        /// <param name="keyStr">用于加密的密钥</param>
        /// <returns>加密后的字符串</returns>
        private static string HmacMD5(string source, string keyStr)
        {
            try 
            {
                HMACMD5 provider = new HMACMD5(Encoding.UTF8.GetBytes(keyStr));
                byte[] hashedPassword = provider.ComputeHash(Encoding.UTF8.GetBytes(source));
                StringBuilder displayString = new StringBuilder();
                for (int i = 0; i < hashedPassword.Length; i++)
                {
                    displayString.Append(hashedPassword[i].ToString("X2"));
                }
                provider.Clear();
                provider.Dispose();
                return displayString.ToString().ToLower();//转换到小写
            }
            catch
            {
                return "";
            }
        }
        #endregion

        #region RC4加密
        /// <summary>
        /// RC4加密
        /// </summary>
        /// <param name="source">需要加密的字符串</param>
        /// <param name="keyStr">用于加密的密钥</param>
        /// <returns>返回加密后的字符串</returns>
        private static string RC4ENC(string source, string keyStr)
        {
            try
            {
                byte[] contents = Encoding.UTF8.GetBytes(source);
                return Convert.ToBase64String(RC4(contents, keyStr));//转为base64编码
            }
            catch
            {
                return "";
            }
        }
        #endregion

        #region RC4解密
        /// <summary>
        /// RC4解密
        /// </summary>
        /// <param name="source">需要加密的字符串</param>
        /// <param name="keyStr">用于加密的密钥</param>
        /// <returns>返回解密后的字符串</returns>
        private static string RC4DEC(string source, string keyStr)
        {
            try
            {
                byte[] data = Convert.FromBase64String(source);//base64编码还原
                byte[] str = RC4(data, keyStr);
                return Encoding.UTF8.GetString(str);
            }
            catch
            {
                return "";
            }
        }
        #endregion

        #region RC4加密解密
        /// <summary>
        /// RC4加密解密
        /// </summary>
        /// <param name="source">需要加密的字符串</param>
        /// <param name="keyStr">用于加密的密钥</param>
        /// <returns>加密后的字节集</returns>
        private static byte[] RC4(byte[] contents, string keyStr)
        {
            byte[] results = new byte[contents.Length];

            byte[] pwds = Encoding.UTF8.GetBytes(keyStr);

            byte[] key = new byte[256];
            byte[] box = new byte[256];
            for (int i = 0; i < 256; i++)
            {
                key[i] = pwds[i % pwds.Length];
                box[i] = (byte)i;
            }

            for (int j = 0, i = 0; i < 256; i++)
            {
                j = (j + box[i] + key[i]) % 256;
                byte tmp = box[i];
                box[i] = box[j];
                box[j] = tmp;
            }

            for (int a = 0, j = 0, i = 0; i < contents.Length; i++)
            {
                a = (a + 1) % 256;
                j = (j + box[a]) % 256;

                byte tmp = box[a];
                box[a] = box[j];
                box[j] = tmp;
                byte k = box[((box[a] + box[j]) % 256)];

                results[i] = (byte)(contents[i] ^ k);
            }
            return results;      
        }
        #endregion

        #region 字符串到十六进制
        /// <summary>
        /// 字符串到十六进制
        /// </summary>
        /// <param name="source">需要转十六进制的字符串</param>
        /// <returns>返回编好后的十六进制字符串</returns>
        private static string StrToHex(string source)
        {
            try 
            {
                string result = string.Empty;
                byte[] arrByte = Encoding.UTF8.GetBytes(source);
                for (int i = 0; i < arrByte.Length; i++)
                {
                    result += Convert.ToString(arrByte[i], 16);
                }
                return result.ToUpper();
            } 
            catch
            {
                return "";
            }
        }
        #endregion

        #region 十六进制到字符串
        /// <summary>
        /// 十六进制到字符串
        /// </summary>
        /// <param name="hex">需要解码到字符串的十六进制文本</param>
        /// <returns>返回解码后的十六进制字符串</returns>
        private static string HexToStr(string hex)
        {
            try
            {
                byte[] arrByte = new byte[hex.Length / 2];
                int index = 0;
                for (int i = 0; i < hex.Length; i += 2)
                {
                    arrByte[index++] = Convert.ToByte(hex.Substring(i, 2), 16);
                }
                return Encoding.UTF8.GetString(arrByte);
            } 
            catch
            {
                return "";
            }
        }
        #endregion

        #region RSA公钥加密
        /// <summary>
        /// RSA公钥加密
        /// </summary>
        /// <param name="xmlPublicKey">公钥XML文件</param>
        /// <param name="content">需要加密的内容</param>
        /// <returns>返回加密后字符串</returns>
        private static string RSAENC(string xmlPublicKey, string content)
        {
            try
            {
                string encryptedContent = string.Empty;
                using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
                {
                    rsa.FromXmlString(xmlPublicKey);
                    byte[] encryptedData = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
                    encryptedContent = Convert.ToBase64String(encryptedData);
                }
                return encryptedContent;
            }
            catch 
            {
                return "";
            }
        }
        #endregion

        #region RSA验证
        /// <summary>
        /// 
        /// </summary>
        /// <param name="str">需要验证的文本</param>
        /// <param name="sign">私钥签名的字符串</param>
        /// <param name="str_publicKey">公钥XML文件</param>
        /// <returns>返回验证结果</returns>
        private static bool RSACheck(string str, string sign, string str_publicKey)
        {
            try
            {
                byte[] SignedData = Convert.FromBase64String(sign);
                ASCIIEncoding ByteConverter = new ASCIIEncoding();
                byte[] DataToVerify = ByteConverter.GetBytes(str);
                RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
                RSAalg.FromXmlString(str_publicKey);
                bool result = RSAalg.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData);
                RSAalg.Clear();
                RSAalg.Dispose();
                return result;
            }
            catch
            {
                return false;
            }
        }
        #endregion
    }
}

PHP

<?php
//-----------------------APP基础配置----------------------------
define("app_id", "703093033");
define("app_key", "e2470a332d21d641298136c2754331aa");
//-----------------------RSA密钥配置----------------------------
define("private_key", "-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAy4RN2yLtquuGD77wX0IaWpfgbN70G5+dlhsfowKJy7oxP+cC
PKINXUkF5rSdTveGUlZDOtLYJghOD7biloJdW5+6mglGguVIC7430gdW/btT3Yul
3+IZa6Zj6SdGsmyOE4WPbjS6q8aUBmOdHf7dVYfbRVk9jZnBCEx/64S8kQI4Jz8o
2tV6rKvKkyTn///dBKDKSPWYtOG2bq7G1XwYrf8PLL0Ek7lRHX5w7JVWovDhKsGq
Xoho9CxM2sZRCSMeZpdBU9+xxFjNGl5NQHyWJefKzVdXFT9sF/UZGu1UXRuiCQyf
1LJvweIwyBo1ctcuJdRMNrZxoBCUYile2LiTQQIDAQABAoIBAHrt5aEyDeEp9oZY
TRUc9pI2HudkHIr69NMQeyGZjOY0Bz+UJ/O75tqsGxZpjoN+W/IsDNvhM5J1fcFc
NK24/O81Ih+c7qxuFgCR22HP8Sm+F0BA8+axya0Oilbw1HE9xOvhxutIimDrx8m8
LdFKeyMIttfCub1oXALJQpNeUBA99LBtVCV4aJdLTZh82XNCaKg0w7t+KLz8i98K
JAMvuYg6A4Vv0zlG1CbTvykOJ0CyKMw3BlQMRm7U+6K8g3S5pHpnCQJURssd58hr
uJAvDP4T1oEXEsqF135pQh2oK7qufHRgRWTSihHUXIx/uFXs52BvPIt7meJq6PBG
ONA28ykCgYEA8n+HrygKpCEHhyrtwtiV2zwBnEcQz10TVtp7vmWYm3ECpLobwyJI
sSiq0fUMPga1bDYxtxRXkOI+bj3e7jBPcmhvlQvvWeXBUhtq8J1wQzYlg+HI4+K/
oUfT3hY6Vp/4eVLA9ro3NPPwXDRyjS/UsKtiMb1PInRcER/4AFdkLBsCgYEA1tkm
Woxp+dgK7TRIdsdk3B3E6H/HmzADZYtJr7BxePhp4HJtXFakAHiY90mAeu2TvyeM
ewYXEE/wGqdae7yVydgHchHd8auGOIoimlhRmmOM6Hvmr4KvYDXgK3dHSCrueNhB
U/CWyTeFYKHNhbEbkswvDESohqGKWjzUqkTaO9MCgYBfvP3Cp1pcJjYkpUwtSvkP
DwfLvTrjw2lpNuT37IBtjhZvFpLzXUu5tcaLEeX9bwSdbl/+WeegadIgEAk9nJEh
KB41h/q9UTobwntb96xkvLHe+XsojVL+x67b1Ya+wHWG4KcSQb6eB1jz7jjziNi9
z0v7OzRM9AeNM0PkTpxb1QKBgBdUBMIYNPmX57fR0Xx0MhNkeBj2punG0NeZxCp7
cha8gmKIii9YiP40Ggffxz+RxFUhKjPBeYef5mY+faip1WnRNx2/quWuxigld5Ri
upmU7ZvguC+edQRxVSHjFa5UWwhsEsvWd8jpamYPq400qdXKreEbI2Fa8PbTXBQQ
3dFZAoGAVPeYH7IWLiMUsRHY5r/oEZjAjHj1QadARtgAX8NCopRbplsJHadXqg5y
UiPRRDn5XFROf0PqgDrVUN2vLkKrQQIlJPvruQNDELyXkwQWPVbNA1Q2aLIi5GWt
OzUJVxNNHxo+//GLZD09ZKdDiBUtYGqFU3cE1+CSA6L5IRVqTFo=
-----END RSA PRIVATE KEY-----");
//-----------------------校验函数定义----------------------------
//十六进制转字符串
function hexToStr($hex){
	$string="";
	for($i=0;$i<strlen($hex)-1;$i+=2)
	$string.=chr(hexdec($hex[$i].$hex[$i+1]));
	return $string;
}
//字符串转十六进制
function strToHex($string){
	$hex="";
	for($i=0;$i<strlen($string);$i++)
	$hex.=dechex(ord($string[$i]));
	$hex=strtoupper($hex);
	return $hex;
}
//私钥解密由加密函数加密后的base64编码
function rsadec($data){		
	$pi_key = openssl_pkey_get_private(private_key);
	$data = base64_decode($data);
	$decrypted = "";
	$isOkay = openssl_private_decrypt($data, $decrypted, $pi_key);
    if(!$isOkay){
        return false;
    }	
	return $decrypted;
}
//RSA签名
function getSign($signString){
	$privKeyId = openssl_pkey_get_private(private_key);
	$signature = '';
	openssl_sign($signString, $signature, $privKeyId);
	openssl_free_key($privKeyId);
	return base64_encode($signature);
}
//HMAC_MD5加密
function hmac($data, $key){
    if (function_exists('hash_hmac')) {
        return hash_hmac('md5', $data, $key);
    }
    $key = (strlen($key) > 64) ? pack('H32', 'md5') : str_pad($key, 64, chr(0));
    $ipad = substr($key,0, 64) ^ str_repeat(chr(0x36), 64);
    $opad = substr($key,0, 64) ^ str_repeat(chr(0x5C), 64);
    return md5($opad.pack('H32', md5($ipad.$data)));
}
//rc4加密并返回base64编码
function rc4enc($pwd, $data){
	return base64_encode(rc4($pwd, $data));
}
//解密由加密函数加密后的base64编码
function rc4dec($pwd, $data){
	$data = base64_decode($data);
	return rc4($pwd, $data);
}
//RC4加密解密
function rc4($pwd, $data){
    $cipher      = "";
    $key[]       = "";
    $box[]       = "";
    $pwd_length  = strlen($pwd);
    $data_length = strlen($data);
	
    for ($i = 0; $i < 256; $i++) {
        $key[$i] = ord($pwd[$i % $pwd_length]);
        $box[$i] = $i;
    }
	
    for ($j = $i = 0; $i < 256; $i++) {
        $j       = ($j + $box[$i] + $key[$i]) % 256;
        $tmp     = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
	
    for ($a = $j = $i = 0; $i < $data_length; $i++) {
        $a       = ($a + 1) % 256;
        $j       = ($j + $box[$a]) % 256;
        $tmp     = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $k       = $box[(($box[$a] + $box[$j]) % 256)];
        $cipher .= chr(ord($data[$i]) ^ $k);
    }
	
    return $cipher;
}

//回复验证信息
function sendMsg($msg){
	$time = time();
	$rand = rand(11111111, 88888888);
	$md5 = md5(app_id.$time.$rand.app_key);
	$md5 = hmac($md5,app_key);
	setcookie("appid",app_id,time() + 300); 	//5分钟内有效
	setcookie("time",$time,time() + 300); 		//5分钟内有效
	setcookie("rand",$rand,time() + 300); 		//5分钟内有效
	//----------------------------------------------
	$len = strlen($msg);						//长度
	setcookie("length",$len,time() + 300); 		//5分钟内有效
	//----------------------------------------------
	$str = base64_encode(gzcompress($msg, 9));	//压缩
	$str = rc4enc($md5,$str);					//加密
	$key = getSign($str);						//签名
	$key = strToHex($key);
	setcookie("key",$key,time() + 300); 		//5分钟内有效
	//----------------------------------------------
	echo $str;
	exit();
}
//-----------------------取出_COOKIE----------------------------
$appid = $_COOKIE["appid"];		//请求标识
$time = $_COOKIE["time"];		//请求时间
$rand = $_COOKIE["rand"];		//请求随机
$length = $_COOKIE["length"];	//数据长度
$key = $_COOKIE["key"];			//公钥加密	
$now = time() - 1;				//现行时间戳(减1防止提交太快造成负数)
//判断参数合法性
if($appid == "" or $time =="" or $rand =="" or $length =="" or $key ==""){
	echo "COOKIE_ERR";
	exit();
}
//判断appid
if($appid != app_id){
	echo "AppID_ERR";
	exit();
}
//请求间隔
$interval = $time - $now;
//必须是10秒之内的请求
if($interval < 0 or $interval > 10){
	echo "interval_err";
	exit();
}
//判断随机数
if($rand <= 0){	
	echo "rand_err";
	exit();	
}
//还原加密串
$key = hexToStr($key);
if($key == ""){
	echo "key_err";
	exit();		
}
//解密加密串
$key = rsadec($key);				
if($key == ""){	
	echo "rsa_err";
	exit();	
}
//检测公钥加密
$md5 = md5($appid.$time.$rand.app_key);
$md5 = hmac($md5,app_key);
if($key != $md5){    				
	echo "rc4_err";
	exit();			
}
//取请求数据
$post = file_get_contents('php://input');		
if($post == ""){
	echo "post_err";
	exit();		
}
//解密数据
$post = rc4dec($key,$post);
if($post == ""){
	echo "rc4dec_err";
	exit();		
}
//解压数据
$post = gzuncompress(base64_decode($post));
if($post == ""){
	echo "gzuncompress_err";
	exit();		
}

echo sendMsg($post);

?>

猜你喜欢

转载自blog.csdn.net/csdn93033/article/details/103561002