0

Je reçois l'erreur mentionnée ci-dessus lors d'une implémentation de la cryptographie hybride.Cryptographie hybride. La longueur des données à déchiffrer est invalide

selon https://en.wikipedia.org/wiki/Hybrid_cryptosystem

Je suis juste stucked à la dernière étape

Mon code est

private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       CspParameters cspParams = new CspParameters { ProviderType = 1 }; 
       RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(2048, cspParams); 
       string publicKey =lblPublicKey.Text = Convert.ToBase64String(rsaProvider.ExportCspBlob(false)); 
       string privateKey = lblPrivateKey.Text= Convert.ToBase64String(rsaProvider.ExportCspBlob(true)); 
       string symmericKey = txtBoxSymmetricKey.Text = "Kamran12"; 
       txtEncryptedData.Text = EncryptData(txtInputData.Text, symmericKey); 
       txtBoxEncryptedSymmetricKey.Text = RSA_Encrypt(symmericKey, publicKey); 



       txtBoxDescryptedSymmetricKey.Text = RSA_Decrypt(txtBoxEncryptedSymmetricKey.Text, privateKey); 
       txtDecryptedData.Text = DecryptData(txtEncryptedData.Text, txtBoxDescryptedSymmetricKey.Text); //getting error length of the data to decrypt is invalid 
      } 
      catch (Exception exc) 
      { 

      } 

     } 

     public static string RSA_Decrypt(string encryptedText, string privateKey) 
     { 
      CspParameters cspParams = new CspParameters { ProviderType = 1 }; 
      RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams); 
      rsaProvider.ImportCspBlob(Convert.FromBase64String(privateKey)); 
      var buffer = Convert.FromBase64String(encryptedText); 
      byte[] plainBytes = rsaProvider.Decrypt(buffer, false); 
      string plainText = Encoding.UTF8.GetString(plainBytes, 0, plainBytes.Length); 
      return plainText; 
     } 

     public static string RSA_Encrypt(string data, string publicKey) 
     { 
      CspParameters cspParams = new CspParameters { ProviderType = 1 }; 
      RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams); 
      rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey)); 
      byte[] plainBytes = Encoding.UTF8.GetBytes(data); 
      byte[] encryptedBytes = rsaProvider.Encrypt(plainBytes, false); 
      return Convert.ToBase64String(encryptedBytes); 
     } 



     public string EncryptData(string data, string key) 
     { 
      string encryptedData = null; 
      byte[] buffer = Encoding.UTF8.GetBytes(data); 
      DESCryptoServiceProvider desCryptSrvckey = new DESCryptoServiceProvider 
      { 
       Key = new UTF8Encoding().GetBytes(key) 
      }; 
      desCryptSrvckey.IV = desCryptSrvckey.Key; 
      using (MemoryStream stmCipherText = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(stmCipherText, desCryptSrvckey.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(buffer, 0, buffer.Length); 
        cs.FlushFinalBlock(); 


        encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray()); 
       } 
      } 
      return encryptedData; 
     } 

     public string DecryptData(string data, string key) 
     { 

      byte[] encryptedMessageBytes = Encoding.UTF8.GetBytes(data); 
      string decryptedData = null; 
      DESCryptoServiceProvider desCryptSrvckey = new DESCryptoServiceProvider 
      { 
       Key = new UTF8Encoding().GetBytes(key) 
      }; 
      desCryptSrvckey.IV = desCryptSrvckey.Key; 
      using (MemoryStream encryptedStream = new MemoryStream(encryptedMessageBytes)) 
      { 
       using (
        CryptoStream cs = new CryptoStream(encryptedStream, desCryptSrvckey.CreateDecryptor(), 
         CryptoStreamMode.Read)) 
       { 
        using (StreamReader sr = new StreamReader(cs)) 
        { 
         decryptedData = sr.ReadToEnd(); 
        } 
       } 
      } 
      return decryptedData; 
     } 
+0

Je suppose que vous passez la chaîne vide au décryptage – Sasha

+0

Non, il n'est pas vide. Vous pouvez essayer le code –

+0

Ne pas utiliser DES pour un nouveau travail, il n'est plus sécurisé, utilisez AES (Advanced Encryption Standard), il n'est pas plus difficile à utiliser. Ne pas utiliser la clé pour la IV, Au lieu d'utiliser un IV aléatoire, il suffit de préfixer les données cryptées avec le IV pour une utilisation dans le décryptage, il n'a pas besoin de ne pas le secret. – zaph

Répondre

4

Vous déclarez encryptedData comme une chaîne. Ceci est une erreur. Vos données cryptées sont des octets, pas une chaîne de caractères. Tenter de convertir des octets bruts en texte UTF-8, comme dans encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray()); ne produira pas de texte UTF-8, mais vous donnera des déchets et peut-être perdre des données.

Si vous souhaitez que la sortie de votre chiffrement soit sous forme de texte, prenez les octets de chiffrement et utilisez Convert.ToBase64String() pour les transformer en une chaîne de texte. Lors du décryptage, convertissez la chaîne Base64 en octets et décryptez les octets.