using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; namespace UdPunching { public static class TransferCodec { public static readonly Guid InvalidPeerId = new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff"); // [0...15] GUID PeerId // [16..19] Encrypted data length prefix (LeInt32) // [20..END] Encrypted data content public static Guid ReadId(byte[] recvData) { return new Guid(recvData.Take(16).ToArray()); } public static byte[] DecodeData(RSACryptoServiceProvider cryptoProvider, byte[] recvData) { var len = recvData.ToLeInt32(16); return cryptoProvider.Decrypt(recvData.Skip(20).Take(len).ToArray(), false); } public static byte[] Encode(RSACryptoServiceProvider cryptoProvider, Guid id, byte[] data) { var idBytes = id.ToByteArray(); // 16 var encryptedBytes = cryptoProvider.Encrypt(data, false); var lst = new List(idBytes.Length + encryptedBytes.Length); lst.AddRange(idBytes); lst.AddRange(encryptedBytes.Length.ToLeBytes()); //4 lst.AddRange(encryptedBytes); return lst.ToArray(); } } }