Подписание и проверка подписей с RSA C #

Недавно я опубликовал информацию о проблемах с шифрованием больших данных с помощью RSA, я, наконец, сделал это, и теперь я перехожу к реализации подписи с закрытым ключом пользователя и проверке с помощью соответствующего открытого ключа. Тем не менее, всякий раз, когда я сравниваю подписанные данные и исходное сообщение, я в основном просто возвращаю false. Я надеюсь, что некоторые из вас смогут увидеть, что я делаю неправильно.

Вот код:

public static string SignData(string message, RSAParameters privateKey) { //// The array to store the signed message in bytes byte[] signedBytes; using (var rsa = new RSACryptoServiceProvider()) { //// Write the message to a byte array using UTF8 as the encoding. var encoder = new UTF8Encoding(); byte[] originalData = encoder.GetBytes(message); try { //// Import the private key used for signing the message rsa.ImportParameters(privateKey); //// Sign the data, using SHA512 as the hashing algorithm signedBytes = rsa.SignData(originalData, CryptoConfig.MapNameToOID("SHA512")); } catch (CryptographicException e) { Console.WriteLine(e.Message); return null; } finally { //// Set the keycontainer to be cleared when rsa is garbage collected. rsa.PersistKeyInCsp = false; } } //// Convert the a base64 string before returning return Convert.ToBase64String(signedBytes); } 

Итак, это первый шаг, чтобы подписать данные, затем я перехожу к проверке данных:

 public static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey) { bool success = false; using (var rsa = new RSACryptoServiceProvider()) { byte[] bytesToVerify = Convert.FromBase64String(originalMessage); byte[] signedBytes = Convert.FromBase64String(signedMessage); try { rsa.ImportParameters(publicKey); SHA512Managed Hash = new SHA512Managed(); byte[] hashedData = Hash.ComputeHash(signedBytes); success = rsa.VerifyData(bytesToVerify, CryptoConfig.MapNameToOID("SHA512"), signedBytes); } catch (CryptographicException e) { Console.WriteLine(e.Message); } finally { rsa.PersistKeyInCsp = false; } } return success; } 

И вот тестовый клиент:

 public static void Main(string[] args) { PublicKeyInfrastructure pki = new PublicKeyInfrastructure(); Cryptograph crypto = new Cryptograph(); RSAParameters privateKey = crypto.GenerateKeys("[email protected]"); const string PlainText = "This is really sent by me, really!"; RSAParameters publicKey = crypto.GetPublicKey("[email protected]"); string encryptedText = Cryptograph.Encrypt(PlainText, publicKey); Console.WriteLine("This is the encrypted Text:" + "\n " + encryptedText); string decryptedText = Cryptograph.Decrypt(encryptedText, privateKey); Console.WriteLine("This is the decrypted text: " + decryptedText); string messageToSign = encryptedText; string signedMessage = Cryptograph.SignData(messageToSign, privateKey); //// Is this message really, really, REALLY sent by me? bool success = Cryptograph.VerifyData(messageToSign, signedMessage, publicKey); Console.WriteLine("Is this message really, really, REALLY sent by me? " + success); } 

Я пропустил здесь шаг? В соответствии с API криптографии и примерами там я не должен вручную вычислять какие-либо hashи, так как я предоставляю алгоритм в самом вызове метода.

Любая помощь будет оценена.

Ваша проблема заключается в начале метода VerifyData :

 public static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey) { bool success = false; using (var rsa = new RSACryptoServiceProvider()) { //Don't do this, do the same as you did in SignData: //byte[] bytesToVerify = Convert.FromBase64String(originalMessage); var encoder = new UTF8Encoding(); byte[] bytesToVerify = encoder.GetBytes(originalMessage); byte[] signedBytes = Convert.FromBase64String(signedMessage); try ... 

По какой-то причине вы переключились на FromBase64String вместо UTF8Encoding.GetBytes .

Interesting Posts

Хорошая программа для визуализации использования файловой системы на Mac?

Как использовать * ngIf else в Angular?

Рабочий стол Karmic Koala показывает только обои, ничего больше

Слушатель модели JTable слишком быстро обнаруживает вставленные строки (до их рисования)

Почему я могу слышать мигание курсора на моем экране через наушники?

Как вы планируете запуск блока на следующей итерации цикла запуска?

Удаление повторяющихся строк в Notepad ++

Как включить цитаты в операцию CONCATENATE?

annotations, чтобы сделать приватный метод общедоступным только для тестовых classов

Как поместить грыбы с annotation_custom () в точные области участка участка?

Как я могу запустить средство просмотра изображений GNOME с терминала?

Приоритет оператора (побитовый ‘&’ ниже, чем ‘==’)

Чтение строки из файла без знания длины строки

Маржа, сжимающаяся в flexbox

Как удалить специальные символы из строки?

Давайте будем гением компьютера.