«Ключ не существует». при подписании

#c# #network-programming #rsa

Вопрос:

я работаю над тестом для подписи и проверки подписей, и вместо того, чтобы подписывать и отправлять его, он просто выдает ошибку, вот код подписи (не включая проверку сервера, поскольку он не имеет значения и слишком длинный) и код замены ключей.

Вот сервер:

             // variables
            byte[] bytesFrom = new byte[8192];
            // initialize network stream
            NetworkStream networkStream = clientSocket.GetStream();
            // send length of public key
            networkStream.Write(Encoding.UTF8.GetBytes(Convert.ToBase64String(rsa.ExportRSAPublicKey()).Length.ToString()));
            // send public key
            networkStream.Write(Encoding.UTF8.GetBytes(Convert.ToBase64String(rsa.ExportRSAPublicKey())));
            // read public key length
            networkStream.Read(bytesFrom);
            // apply public key length
            bytesFrom = new byte[int.Parse(Encoding.UTF8.GetString(bytesFrom))];
            // read public key
            networkStream.Read(bytesFrom);
            // import public key
            int a;
            rsa.ImportRSAPublicKey(rsa.Decrypt(bytesFrom, RSAEncryptionPadding.OaepSHA512), out a);
 

Вот клиент:

                 // initialize RSA and connect
                RSA rsa = RSA.Create();
                IPEndPoint end = new IPEndPoint(IPAddress.Loopback, 500);
                Socket sock = new Socket(end.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                sock.Connect(end);
                NetworkStream ns = new NetworkStream(sock);
                byte[] buffer = new byte[8192];
                // read public key length
                ns.Read(buffer);
                // apply public key length
                buffer = new byte[int.Parse(Encoding.UTF8.GetString(buffer))];
                // read public key
                ns.Read(buffer);
                // apply public key
                int a;
                rsa.ImportRSAPublicKey(buffer, out a);
                // send public key length and public key 
                ns.Write(Encoding.UTF8.GetBytes(rsa.ExportRSAPublicKey().Length.ToString()));
                ns.Write(rsa.ExportRSAPublicKey());
                // send signed "h"
                ns.Write(Encoding.UTF8.GetBytes(rsa.SignData(Encoding.UTF8.GetBytes("h"), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1).Length.ToString()));
                ns.Write(rsa.SignData(Encoding.UTF8.GetBytes("h"), HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
 

Ответ №1:

Я обнаружил, что все, что мне нужно, — это временно сбросить закрытый ключ, пока я переключаю ключи, а затем в конце концов импортировать его обратно.