Encrypt chat message

This commit is contained in:
Sardelka
2022-07-29 18:17:45 +08:00
parent 62e5bad6ac
commit eee6f614f1
5 changed files with 47 additions and 22 deletions

View File

@ -237,7 +237,10 @@ namespace RageCoop.Client
case PacketType.ChatMessage:
{
Packets.ChatMessage packet = new Packets.ChatMessage();
Packets.ChatMessage packet = new Packets.ChatMessage((b) =>
{
return Security.Decrypt(b);
});
packet.Unpack(data);
Main.QueueAction(() => { Main.MainChat.AddMessage(packet.Username, packet.Message); return true; });

View File

@ -3,6 +3,7 @@ using GTA.Math;
using GTA.Native;
using Lidgren.Network;
using RageCoop.Core;
using System;
namespace RageCoop.Client
{
@ -164,7 +165,10 @@ namespace RageCoop.Client
{
NetOutgoingMessage outgoingMessage = Client.CreateMessage();
new Packets.ChatMessage() { Username = Main.Settings.Username, Message = message }.Pack(outgoingMessage);
new Packets.ChatMessage(new Func<string, byte[]>((s) =>
{
return Security.Encrypt(s.GetBytes());
})) { Username = Main.Settings.Username, Message = message }.Pack(outgoingMessage);
Client.SendMessage(outgoingMessage, NetDeliveryMethod.ReliableOrdered, (byte)ConnectionChannel.Chat);
Client.FlushSendQueue();

View File

@ -24,6 +24,10 @@ namespace RageCoop.Client
{
return new CryptoStream(new MemoryStream(data), ClientAes.CreateEncryptor(), CryptoStreamMode.Read).ReadToEnd();
}
public byte[] Decrypt(byte[] data)
{
return new CryptoStream(new MemoryStream(data), ClientAes.CreateDecryptor(), CryptoStreamMode.Read).ReadToEnd();
}
public void SetServerPublicKey(byte[] modulus, byte[] exponent)
{
var para = new RSAParameters();

View File

@ -155,6 +155,16 @@ namespace RageCoop.Core
internal class ChatMessage : Packet
{
private Func<string, byte[]> crypt;
private Func<byte[], byte[]> decrypt;
public ChatMessage(Func<string,byte[]> crypter)
{
crypt = crypter;
}
public ChatMessage(Func<byte[], byte[]> decrypter)
{
decrypt = decrypter;
}
public string Username { get; set; }
public string Message { get; set; }
@ -166,20 +176,14 @@ namespace RageCoop.Core
List<byte> byteArray = new List<byte>();
byte[] usernameBytes = Encoding.UTF8.GetBytes(Username);
byte[] messageBytes = Encoding.UTF8.GetBytes(Message);
// Write UsernameLength
byteArray.AddRange(BitConverter.GetBytes(usernameBytes.Length));
// Write Username
byteArray.AddRange(usernameBytes);
byteArray.AddString(Username);
// Write MessageLength
byteArray.AddRange(BitConverter.GetBytes(messageBytes.Length));
// Write Message
byteArray.AddRange(messageBytes);
byteArray.AddArray(crypt(Message));
byte[] result = byteArray.ToArray();
@ -197,9 +201,7 @@ namespace RageCoop.Core
int usernameLength = reader.ReadInt();
Username = reader.ReadString(usernameLength);
// Read message
int messageLength = reader.ReadInt();
Message = reader.ReadString(messageLength);
Message = decrypt(reader.ReadByteArray()).GetString();
#endregion
}
}

View File

@ -477,7 +477,10 @@ namespace RageCoop.Server
case PacketType.ChatMessage:
{
Packets.ChatMessage packet = new();
Packets.ChatMessage packet = new((b) =>
{
return Security.Decrypt(b,sender.EndPoint);
});
packet.Unpack(data);
ChatMessageReceived(packet.Username,packet.Message, sender);
@ -785,14 +788,20 @@ namespace RageCoop.Server
_worker.QueueJob(() => API.Events.InvokeOnChatMessage(message, sender));
var msg=MainNetServer.CreateMessage();
new Packets.ChatMessage()
foreach(var c in Clients.Values)
{
Username=name,
Message=message
}.Pack(msg);
MainNetServer.SendToAll(msg, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Chat);
var msg = MainNetServer.CreateMessage();
var crypt = new Func<string, byte[]>((s) =>
{
return Security.Encrypt(s.GetBytes(), c.EndPoint);
});
new Packets.ChatMessage(crypt)
{
Username=name,
Message=message
}.Pack(msg);
MainNetServer.SendToAll(msg, NetDeliveryMethod.ReliableOrdered, (int)ConnectionChannel.Chat);
}
Logger?.Info(name + ": " + message);
}
@ -800,7 +809,10 @@ namespace RageCoop.Server
{
if(target == null) { return; }
var msg = MainNetServer.CreateMessage();
new Packets.ChatMessage()
new Packets.ChatMessage(new Func<string, byte[]>((s) =>
{
return Security.Encrypt(s.GetBytes(), target.EndPoint);
}))
{
Username= name,
Message=message,