0

ハイブリッド暗号化実装中に上記のエラーが発生しています。ハイブリッド暗号。解読するデータの長さが無効です

私は最後のステップ

でちょうどstucked午前https://en.wikipedia.org/wiki/Hybrid_cryptosystem

ごとに私のコードは、あなたが文字列としてencryptedDataを宣言

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

私は解読に空の文字列を渡すと思います – Sasha

+0

それは空ではありません。コードを試すことができます –

+0

新しい仕事にDESを使用しないでください。安全ではなく、AES(高度暗号化標準)を使用してください。 IVのキーを使用しないでください。代わりにランダムなIVを使用してください。暗号化されたデータにIVの前に接頭辞を付けて復号化に使用してください。秘密にする必要はありません。 – zaph

答えて

4

です。これは間違っています。暗号化されたデータはバイトであり、文字列ではありません。 encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray());のように、生のバイトをUTF-8テキストに変換しようとすると、UTF-8テキストは生成されませんが、ガベージとおそらくデータが失われます。

暗号化の出力をテキストとして出力するには、cyphertextバイトを使用し、Convert.ToBase64String()を使用して文字列に変換します。

復号化するときは、Base64文字列をバイトに変換してから復号化してください。

関連する問題