0

Ich bekomme den oben erwähnten Fehler während einer Hybrid-Kryptographie-Implementierung.Hybrid-Kryptographie. Die Länge der zu entschlüsselnden Daten ist ungültig

gemäß https://en.wikipedia.org/wiki/Hybrid_cryptosystem

ich gerade im letzten Schritt stucked bin

Mein Code ist

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

Ich denke, Sie übergeben leere Zeichenfolge zur Entschlüsselung – Sasha

+0

Nein, es ist nicht leer. Sie können den Code versuchen –

+0

Verwenden Sie nicht DES für neue Arbeit, es ist nicht mehr sicher, verwenden Sie AES (Advanced Encryption Standard), es ist nicht schwieriger zu verwenden. Verwenden Sie nicht den Schlüssel für die IV, sondern verwenden Sie eine zufällige IV, nur die verschlüsselten Daten mit der IV für die Verwendung in der Entschlüsselung, es muss nicht geheim. – zaph

Antwort

4

Sie erklären encryptedData als String zurück. Das ist falsch. Ihre verschlüsselten Daten sind Bytes, keine Zeichenfolge. Der Versuch, unformatierte Bytes in UTF-8-Text zu konvertieren, wie in encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray());, führt nicht zu UTF-8-Text, aber Sie erhalten Datenmüll und möglicherweise Datenverlust.

Wenn Sie möchten, dass die Ausgabe Ihrer Verschlüsselung als Text ausgegeben wird, dann nehmen Sie die Cypertext-Bytes und verwenden Sie Convert.ToBase64String(), um sie in eine Textzeichenfolge umzuwandeln.

Bei der Entschlüsselung, konvertieren Sie die Base64-Zeichenfolge zurück in Bytes und entschlüsseln Sie die Bytes.

Verwandte Themen