2016-07-11 4 views
1

Я разрабатываю .NET-проект. Я делаю шифрование для некоторых конфиденциальных данных. Я использую алгоритм RSA для этого. Я могу успешно проверить хеш-сообщение, используя закрытый ключ, открытый ключ и подпись.Преобразование байтового массива сигнатуры алгоритма RSA в строку и обратно в байтовый массив снова в .NET C#

Но у меня возникла проблема с преобразованием сигнатуры массива байтов, сгенерированной алгоритмом RSA, в строку и преобразование этой строки обратно в байтовый массив для проверки. Но проверка завершается с ошибкой, если я проверяю подпись с байтовым массивом, который преобразуется обратно из строки подписи. Мой сценарий ниже.

Это мой полный класс Криптография с RSA алгоритм

public class Cryptograph:ICryptograph 
    { 
     private string RsaHashAlgorithm { get; set; } 

     public Cryptograph() 
     { 
      this.RsaHashAlgorithm = "SHA256"; 
     } 

     public RSAParameters[] GenarateRSAKeyPairs() 
     { 
      using (var rsa = new RSACryptoServiceProvider(2048)) 
      { 
       rsa.PersistKeyInCsp = false; 
       RSAParameters publicKey = rsa.ExportParameters(false); 
       RSAParameters privateKey = rsa.ExportParameters(true); 
       return new RSAParameters[]{ privateKey , publicKey }; 
      } 
     } 

     public byte[] SignRsaHashData(RSAParameters privateKey,byte[]hashOfDataToSign) 
     { 
      using (var rsa = new RSACryptoServiceProvider(2048)) 
      { 
       rsa.PersistKeyInCsp = false; 
       rsa.ImportParameters(privateKey); 

       var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa); 
       rsaFormatter.SetHashAlgorithm(RsaHashAlgorithm); 

       return rsaFormatter.CreateSignature(hashOfDataToSign); 
      } 
     } 

     public bool VerifyRsaSignature(RSAParameters publicKey,byte[]hashOfDataToSign, byte[] signature) 
     { 
      using (var rsa = new RSACryptoServiceProvider(2048)) 
      { 
       rsa.ImportParameters(publicKey); 

       var rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa); 
       rsaDeformatter.SetHashAlgorithm(RsaHashAlgorithm); 

       return rsaDeformatter.VerifySignature(hashOfDataToSign, signature); 
      } 
     } 

    } 

я тест проверки. Ниже приведен рабочий код и с его помощью успешно завершен.

[TestMethod] 
     public void VerifyRsaEncryptionSign() 
     { 
      var document = Encoding.UTF8.GetBytes("test message"); 
      byte[] hashedDocument; 
      using (var sha256 = SHA256.Create()) 
      { 
       hashedDocument = sha256.ComputeHash(document); 
      } 

      Cryptograph crypto = new Cryptograph(); 
      RSAParameters[] keys = crypto.GenarateRSAKeyPairs(); 
      RSAParameters privateKey = keys[0]; 
      RSAParameters publicKey = keys[1]; 

      byte[] signature = crypto.SignRsaHashData(privateKey, hashedDocument);  
      bool verified = crypto.VerifyRsaSignature(publicKey, hashedDocument, signature); 
      Assert.IsTrue(verified); 
     } 

Выше кода, модульный тест прошел и успешно прошел проверку.

Но я хочу, чтобы преобразовать массив байтов подписи и преобразовать эту строку в массив байтов для проверки, как показано ниже.

[TestMethod] 
     public void VerifyRsaEncryptionSign() 
     { 
      var document = Encoding.UTF8.GetBytes("test message"); 
      byte[] hashedDocument; 
      using (var sha256 = SHA256.Create()) 
      { 
       hashedDocument = sha256.ComputeHash(document); 
      } 

      Cryptograph crypto = new Cryptograph(); 
      RSAParameters[] keys = crypto.GenarateRSAKeyPairs(); 
      RSAParameters privateKey = keys[0]; 
      RSAParameters publicKey = keys[1]; 

      byte[] signature = crypto.SignRsaHashData(privateKey, hashedDocument); 
      string stringSignature = Encoding.UTF8.GetString(signature);// Converted byte array to string 
      signature = Encoding.UTF8.GetBytes(stringSignature);//convert string back to byte array 
      bool verified = crypto.VerifyRsaSignature(publicKey, hashedDocument, signature); 
      Assert.IsTrue(verified); 
     } 

Когда я запускаю модульный тест, проверка не выполняется. Что не так с моим кодом? Как я могу успешно преобразовать его? Я также хотел бы задать дополнительный вопрос. Можно ли преобразовать в хэшированное сообщение обратно в исходную строку?

ответ

2

Использование базы 64. Подписи состоят из случайных байтов; не все случайные байты, однако, представляют действительный символ при декодировании.

В основном вы должны только декодировать строки, которые ранее были закодированы.

+0

Благодарю вас, многого! Это сработало. –

+0

Возможно ли преобразовать хешированное сообщение обратно в исходную строку с кодом? –

+0

Извините, я не понимаю, что вы пытаетесь сделать. Пожалуйста, будьте как можно точнее. –