Я делаю TCP-сервер и клиентское приложение.Мне нужно зашифровать и расшифровать сообщения, однако перед этим мне нужно создать симметричный ключ, который работает с алгоритмом AES.Я использовал обмен открытым ключом Диффи-Хеллмана между сервером и клиентом.Однако, когда я использую открытый ключ в качестве параметра, я получаю сообщение об ошибке, что параметр неверен.
Я использую прием и отправку для передачи данных между сервером и клиентом.
static byte[] Receive(NetworkStream netStream)
{
try
{
byte[] receive = new byte[STD_MSG_SIZE];
int length = netStream.Read(receive, 0, receive.Length);
string x = Convert.ToBase64String(receive, 0, length);
return Encoding.UTF8.GetBytes(x);
}
catch (Exception except)
{
Console.WriteLine("Error at receive\n" + except.Message + "\n" + except.StackTrace);
return null;
}
}
static void Send(NetworkStream netStream, byte[] message)
{
try
{
byte[] send = message;
netStream.Write(send, 0, send.Length);
}
catch (Exception except)
{
Console.WriteLine("Error at send\n" + except.Message + "\n" + except.StackTrace);
}
}
Это код в клиенте, где я генерирую открытый ключ, отправляю его на сервер, а затем получаю открытый ключ от сервера.
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse(STD_IP), STD_PORT);
ECDiffieHellmanCng alice = new ECDiffieHellmanCng();
alice.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
alice.HashAlgorithm = CngAlgorithm.Sha256;
byte[] publicKey = alice.PublicKey.ToByteArray();
NetworkStream ns = client.GetStream();
Send(ns, publicKey);
byte[] data = Receive(ns);
textBox1.Text = Convert.ToBase64String(data);
byte[] simKey = alice.DeriveKeyMaterial(ECDiffieHellmanCngPublicKey.FromByteArray(data, CngKeyBlobFormat.EccPublicBlob));
Это код на сервере.Я использую текстовое поле в формах, чтобы показать открытый ключ.
TcpListener tcpListener = new TcpListener(IPAddress.Parse(STD_IP), STD_PORT);
tcpListener.Start();
ECDiffieHellmanCng bob = new ECDiffieHellmanCng();
bob.KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash;
bob.HashAlgorithm = CngAlgorithm.Sha256;
byte[] publicKey = bob.PublicKey.ToByteArray();
TcpClient client = tcpListener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
byte[] data = Receive(ns);
textBox1.Text = Convert.ToBase64String(data);
Send(ns, publicKey);
byte[] simKey = bob.DeriveKeyMaterial(ECDiffieHellmanCngPublicKey.FromByteArray(data, CngKeyBlobFormat.EccPublicBlob));
Я получил эти значения из данных на клиенте и сервере, когда прокомментировал simKey.
Клиентское текстовое поле : UlVOTE5VSUFBQUFBdXZXTXgzdHFUb0hZVGY0NnFyNlovVWJuRCtUMlZqMTVGZEN5RmIrYnFLRHN3WTZ5clJIemlNblAzYUJDZUpaaW5oVTN6ODFVUWZZaWNiRUNSaUR4NFNJQXBFdE5uYzl0Z1VOV01qNTllSVRaRCtOdGp2V3lIMzZWR21FdDBUSzFKUEx1UTBFZ2tXTXRFU0E1dTJWSkxoWk1FU2NKQ2tXMUhkc0hGWUQwUmFldHJ3RT0 =
1017 *
Сервер текстовое поле : UlVOTE5VSUFBQUFCcWQ3TnZzK0pFQ3BydFFYK2k4T1ErN3pGNXZQSzh6S1I3UEJvUzN3VERkdFB0N05nM2tNWi9TTXkzVFRpZ0JBMmhQdlJJakhObWJ1WlZhc3ZFUTZMUnkwQVdockhMcjh6SzlSTUtsbloxWnVwcDFqMGh3cTNNK04yNXlraUNrMk51b1BVSlZVQkJXOFM4TWQ2eEp6NzQvbHNHSWY1Sy9MUUxnZEp3OUhad2pNcW85dz0 =