using System; using System.Security.Cryptography; using System.Text; public static class NetworkValideRc4Sdk { static string Md5(string text) { using (var md5 = MD5.Create()) { var bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(text)); return BitConverter.ToString(bytes).Replace("-", "").ToLowerInvariant(); } } static byte[] Rc4(byte[] data, byte[] key) { var box = new int[256]; for (int i = 0; i < 256; i++) box[i] = i; int j = 0; for (int i = 0; i < 256; i++) { j = (j + box[i] + key[i % key.Length]) & 255; var t = box[i]; box[i] = box[j]; box[j] = t; } var output = new byte[data.Length]; int a = 0; j = 0; for (int i = 0; i < data.Length; i++) { a = (a + 1) & 255; j = (j + box[a]) & 255; var t = box[a]; box[a] = box[j]; box[j] = t; output[i] = (byte)(data[i] ^ box[(box[a] + box[j]) & 255]); } return output; } public static string Encode(string rawData, string rc4Key) { var key = Md5(rc4Key); var keya = Md5(key.Substring(0, 16)); var keyb = Md5(key.Substring(16, 16)); var keyc = Md5(DateTime.Now.Ticks.ToString()).Substring(28, 4); var cryptkey = Encoding.UTF8.GetBytes(keya + Md5(keya + keyc)); var payload = Encoding.UTF8.GetBytes("0000000000" + Md5(rawData + keyb).Substring(0, 16) + rawData); return keyc + Convert.ToBase64String(Rc4(payload, cryptkey)).Replace("=", ""); } public static string Decode(string msg, string rc4Key) { var key = Md5(rc4Key); var keya = Md5(key.Substring(0, 16)); var keyb = Md5(key.Substring(16, 16)); var keyc = msg.Substring(0, 4); var body = msg.Substring(4); body = body.PadRight(body.Length + ((4 - body.Length % 4) % 4), '='); var cryptkey = Encoding.UTF8.GetBytes(keya + Md5(keya + keyc)); var result = Encoding.UTF8.GetString(Rc4(Convert.FromBase64String(body), cryptkey)); var content = result.Substring(26); return result.Substring(10, 16) == Md5(content + keyb).Substring(0, 16) ? content : ""; } public static string MakeSign(string data, string appKey) => Md5(data + appKey); }