Неверный параметр при создании симметричного ключа - PullRequest
0 голосов
/ 13 июня 2018

Я делаю 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 =

1 Ответ

0 голосов
/ 14 июня 2018

Использование метода Read, к моему удивлению, является правильным, если буфер достаточно велик для хранения открытого ключа.

Проблема заключается в том, что вы затем base64 кодируете результат вReceive метод, который должен возвращать только байты.Помимо того, что вы испортили свой дизайн - это определенно не наименее удивительно , если метод для чтения данных также кодирует его - это также приведет к сбою парсинга открытого ключа.

Это нормально для базы64 кодировать для вашего текстового поля.Но до тех пор, пока вам не нужно двоичное кодирование, вы должны его оставить.Или, по крайней мере, расшифровать его перед использованием.

...