TransferCodec.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Cryptography;
  5. namespace UdPunching
  6. {
  7. public static class TransferCodec
  8. {
  9. public static readonly Guid InvalidPeerId = new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff");
  10. // [0...15] GUID PeerId
  11. // [16..19] Encrypted data length prefix (LeInt32)
  12. // [20..END] Encrypted data content
  13. public static Guid ReadId(byte[] recvData)
  14. {
  15. return new Guid(recvData.Take(16).ToArray());
  16. }
  17. public static byte[] DecodeData(RSACryptoServiceProvider cryptoProvider, byte[] recvData)
  18. {
  19. var len = recvData.ToLeInt32(16);
  20. return cryptoProvider.Decrypt(recvData.Skip(20).Take(len).ToArray(), false);
  21. }
  22. public static byte[] Encode(RSACryptoServiceProvider cryptoProvider, Guid id, byte[] data)
  23. {
  24. var idBytes = id.ToByteArray(); // 16
  25. var encryptedBytes = cryptoProvider.Encrypt(data, false);
  26. var lst = new List<byte>(idBytes.Length + encryptedBytes.Length);
  27. lst.AddRange(idBytes);
  28. lst.AddRange(encryptedBytes.Length.ToLeBytes()); //4
  29. lst.AddRange(encryptedBytes);
  30. return lst.ToArray();
  31. }
  32. }
  33. }