2016-07-11 7 views
1

Ich bin ein .NET-Projekt zu entwickeln. Ich mache Verschlüsselung für einige sensible Daten. Ich verwende RSA-Algorithmus dafür. Ich kann die Hash-Nachricht erfolgreich mit einem privaten Schlüssel, einem öffentlichen Schlüssel und einer Signatur überprüfen.Konvertieren Byte-Array-Signatur des RSA-Algorithmus in String und wieder zurück zu Byte-Array in .NET C#

Aber ich habe ein Problem mit der Konvertierung von Byte-Array-Signatur von RSA-Algorithmus erzeugt, um String und konvertieren Sie diese Zeichenfolge zurück in Byte-Array für die Verifikation. Die Überprüfung schlägt jedoch fehl, wenn ich die Signatur mit dem Bytearray überprüfe, das aus der Signaturzeichenfolge zurück konvertiert wird. Mein Szenario ist unten.

Dies ist meine komplette Cryptography Klasse mit RSA-Algorithmus

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); 
      } 
     } 

    } 

I Überprüfung testen. Unten ist der Arbeitscode und erfolgreich verifiziert

[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); 
     } 

Oben Code, Unit-Test bestanden und erfolgreich verifiziert.

Aber was ich will ist, ich möchte die Signatur Byte-Array konvertieren und konvertieren diese Zeichenfolge in Byte-Array zurück zur Überprüfung wie unten Code.

[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); 
     } 

Wenn ich den Komponententest ausführen, schlägt die Überprüfung fehl. Was ist falsch an meinem Code? Wie kann ich es erfolgreich konvertieren? Ich möchte auch eine zusätzliche Frage stellen. Ist es möglich, die Hash-Nachricht in den ursprünglichen String zu konvertieren?

Antwort

2

Verwenden Sie Base 64. Signaturen bestehen aus zufälligen Bytes; Nicht alle zufälligen Bytes stellen jedoch ein gültiges Zeichen dar, wenn sie decodiert werden.

Grundsätzlich sollten Sie nur Strings dekodieren, die zuvor codiert waren.

+0

Vielen Dank so muchhhhh !!! Es funktionierte. –

+0

Ist es möglich, die Hash-Nachricht mit meinem Code zurück in den ursprünglichen String zu konvertieren? –

+0

Entschuldigung, ich verstehe nicht, was Sie versuchen zu tun. Bitte sei so genau wie möglich. –

Verwandte Themen