2016-07-11 1 views
1

Je développe un projet .NET. Je fais le chiffrement de certaines données sensibles. J'utilise l'algorithme RSA pour cela. Je peux vérifier avec succès le message de hachage en utilisant la clé privée, la clé publique et la signature.Conversion de la signature du tableau d'octets de l'algorithme RSA en chaîne et retour au tableau d'octets à nouveau dans .NET C#

Mais je rencontre un problème avec la conversion de la signature de tableau d'octets générée par l'algorithme RSA en chaîne et la conversion de cette chaîne en tableau d'octets pour vérification. Mais la vérification échoue si je vérifie la signature avec un tableau d'octets qui est reconverti à partir de la chaîne de signature. Mon scénario est ci-dessous.

Ceci est ma classe complète Cryptographie avec l'algorithme 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); 
      } 
     } 

    } 

I test de vérification. Ci-dessous le code de travail et vérifié avec succès

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

Au-dessus du code, le test unitaire a réussi et a été vérifié avec succès.

Mais ce que je veux, c'est que je veuille convertir le tableau d'octets de signature et convertir cette chaîne en tableau d'octets pour la vérification comme ci-dessous le 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); 
     } 

Lorsque j'exécute le test unitaire, la vérification échoue. Quel est le problème avec mon code? Comment puis-je le convertir avec succès? Je voudrais également poser une question supplémentaire. Est-il possible de convertir en message hashed en chaîne d'origine?

Répondre

2

Utiliser la base 64. Les signatures sont des octets aléatoires; tous les octets aléatoires ne représentent cependant pas un caractère valide lors du décodage.

Fondamentalement, vous ne devriez décoder que les chaînes précédemment codées .

+0

Je vous remercie beaucoup muchhhhh !!! Ça a marché. –

+0

Est-il possible de convertir le message hashed en chaîne d'origine avec mon code s'il vous plaît? –

+0

Désolé je ne comprends pas ce que vous essayez de faire. Merci d'être aussi précis que possible. –