using System; using System.Collections.Generic; using System.IO.Compression; using System.Security.Cryptography; using System.Text; using System.Text.Json; namespace SunlightAggregationTerminal.Class { public class SecureJsonService { private static readonly byte[] _aesKey = Encoding.UTF8.GetBytes("12345678901234567890123456789012"); /// /// 调用一:发送端处理 /// 流程:JSON序列化 -> GZip压缩 -> AES加密 -> Base64编码 /// public static string CompressEncryptAndSend(object dataObject) { try { // 1. JSON 序列化 (使用 System.Text.Json 进行最小化处理) // JsonSerializerOptions 默认不包含缩进,即最小化 string jsonString = JsonSerializer.Serialize(dataObject); byte[] jsonBytes = Encoding.UTF8.GetBytes(jsonString); // 2. GZip 压缩 byte[] compressedBytes = CompressBytes(jsonBytes); // 3. AES 加密 byte[] encryptedBytes = EncryptBytes(compressedBytes); // 4. Base64 编码 (转为字符串以便在网络传输) string finalPayload = Convert.ToBase64String(encryptedBytes); return finalPayload; } catch (Exception) { throw; } } /// /// 调用二:接收端处理 /// 流程:Base64解码 -> AES解密 -> GZip解压 -> JSON反序列化 /// public static T? ReceiveDecryptAndDecompress(string payload) { try { // 1. Base64 解码 byte[] encryptedBytes = Convert.FromBase64String(payload); // 2. AES 解密 byte[] compressedBytes = DecryptBytes(encryptedBytes); // 3. GZip 解压 byte[] jsonBytes = DecompressBytes(compressedBytes); // 4. JSON 反序列化 string jsonString = Encoding.UTF8.GetString(jsonBytes); T result = JsonSerializer.Deserialize(jsonString); return result; } catch (Exception) { throw; } } // --- 底层辅助方法 --- private static byte[] CompressBytes(byte[] data) { using (var outputStream = new MemoryStream()) { using (var gzipStream = new GZipStream(outputStream, CompressionLevel.Optimal)) { gzipStream.Write(data, 0, data.Length); } return outputStream.ToArray(); } } private static byte[] DecompressBytes(byte[] data) { using (var inputStream = new MemoryStream(data)) { using (var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress)) { using (var outputStream = new MemoryStream()) { gzipStream.CopyTo(outputStream); return outputStream.ToArray(); } } } } private static byte[] EncryptBytes(byte[] data) { using (Aes aes = Aes.Create()) { aes.Key = _aesKey; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; aes.GenerateIV(); // 每次加密生成随机IV var encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using (var ms = new MemoryStream()) { // 重要:先将 IV 写入流中,以便解密时读取 ms.Write(aes.IV, 0, aes.IV.Length); using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); return ms.ToArray(); } } } } private static byte[] DecryptBytes(byte[] data) { using (Aes aes = Aes.Create()) { aes.Key = _aesKey; aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.PKCS7; // 从数据开头读取 IV (AES IV 固定为 16 字节) byte[] iv = new byte[16]; Buffer.BlockCopy(data, 0, iv, 0, iv.Length); aes.IV = iv; var decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using (var ms = new MemoryStream(data, iv.Length, data.Length - iv.Length)) { using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) { using (var resultStream = new MemoryStream()) { cs.CopyTo(resultStream); return resultStream.ToArray(); } } } } } } }