2016-12-12 5 views
-1

Ich habe Rijndaels-Verschlüsselungsmethode verwendet, um String-Eingabe zu verschlüsseln. Hier ist mein Code:Verschlüsselung und Decryptions Padding ist nicht gut genug

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 

using System.Threading.Tasks; 
using System.IO; 
using System.Threading; 
using System.Security.Cryptography; 
using System.Windows.Forms; 

namespace WindowsFormsApplication5 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public string plainText; 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 

     } 

     public static class Encrypt 
     { 
      // This size of the IV (in bytes) must = (keysize/8). Default keysize is 256, so the IV must be 
      // 32 bytes long. Using a 16 character string here gives us 32 bytes when converted to a byte array. 
      private const string initVector = "pemgail9uzpgzl88"; 
      // This constant is used to determine the keysize of the encryption algorithm 
      private const int keysize = 256; 
      //Encrypt 
      public static string EncryptString(string plainText, string passPhrase) 
      { 
       byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector); 
       byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 
       PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null); 
       byte[] keyBytes = password.GetBytes(keysize/8); 
       RijndaelManaged symmetricKey = new RijndaelManaged(); 
       symmetricKey.Mode = CipherMode.CBC; 
       ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 
       MemoryStream memoryStream = new MemoryStream(); 
       CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); 
       cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
       cryptoStream.FlushFinalBlock(); 
       byte[] cipherTextBytes = memoryStream.ToArray(); 
       memoryStream.Close(); 
       cryptoStream.Close(); 
       return Convert.ToBase64String(cipherTextBytes); 
      } 
      //Decrypt 
      public static string DecryptString(string cipherText, string passPhrase) 
      { 
       byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector); 
       byte[] cipherTextBytes = Convert.FromBase64String(cipherText); 
       PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null); 
       byte[] keyBytes = password.GetBytes(keysize/8); 
       RijndaelManaged symmetricKey = new RijndaelManaged(); 
       symmetricKey.Mode = CipherMode.CBC; 
       ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes); 
       MemoryStream memoryStream = new MemoryStream(cipherTextBytes); 
       CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); 
       byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 
       int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
       memoryStream.Close(); 
       cryptoStream.Close(); 
       return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 
      } 
     } 

     public string encryptedText; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string key = "a"; 
      plainText = textBox1.Text; 
      encryptedText = plainText; 
      encryptedText = Encrypt.EncryptString(plainText, key) + Encrypt.EncryptString(plainText, key); 
      textBox1.Text = encryptedText; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      string key = "a"; 
      encryptedText = Encrypt.DecryptString(encryptedText, key) + Encrypt.DecryptString(encryptedText, key); 
      encryptedText = plainText; 
      textBox1.Text = plainText; 
     } 

     private void openFileDialog(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Das Problem mit diesem Code ist, dass wenn ich versuche, es zu laufen bekomme ich immer:

Die Eingabe ist kein gültiger Base-64-String, da es eine nicht-Basis enthält 64 Zeichen, mehr als zwei Füllzeichen oder ein ungültiges Zeichen unter den Füllzeichen.

Was soll ich tun? Wenn ich versuche, das + Encrypt.EncryptString-Bit herauszunehmen, funktioniert es immer, also weiß ich wirklich nicht, was ich tun soll. Ich freue mich über jede Rückmeldung.

+0

Warum haben Sie die '+ Encrypt.EncryptString' Bit da drin? Ich würde denken, dass, wenn Sie die Daten verketten möchten, Sie dies tun müssen * vor * Calling "Convert.ToBase64String" darauf, weil das einen Terminator/Padding, die nur einmal pro Basis-64-String enthalten sein kann. Entweder das oder du musst es vor dem Entschlüsseln wieder in mehrere Strings aufteilen. – BlueMonkMN

+0

Mögliches Duplikat von [Eine Zeichenkette ver- und entschlüsseln] (http://stackoverflow.com/questions/202011/encrypt-and-decrypt-a-string) – MethodMan

+0

Die Art, wie Sie Ihre IV verwenden, ist falsch. Es hat auch nichts mit der Schlüsselgröße zu tun, entgegen den obigen Ausführungen. Sie sollten das mehr erforschen. –

Antwort

0

Jede base64-Zeichenfolge wird mit 0, 1 oder 2 = Zeichen abgeschlossen. Dies ist ein Sonderzeichen in der base64-Codierung, das nur zum Beenden der Zeichenfolge verwendet werden kann. Wenn Sie also versuchen, mehrere base64-Zeichenfolgen zu verketten, müssen Sie die Daten entweder verketten, bevor Sie sie in in base64 konvertieren, oder Sie müssen sie erneut teilen, bevor Sie sie aus von base64 konvertieren. Der Terminator kann nur einmal pro String existieren.

Hier ist eine modifizierte Entschlüsselungs-Handler, der die Saiten spaltet vor ihnen wieder Decodierung:

private void button2_Click(object sender, EventArgs e) 
    { 
    string key = "a"; 
    int startPos = 0; 
    StringBuilder decrypted = new StringBuilder(); 
    do 
    { 
     int endPos = encryptedText.IndexOf('=', startPos); 
     if ((encryptedText.Length > endPos + 1) && encryptedText[endPos + 1] == '=') 
      endPos++; 
     string decrypt = encryptedText.Substring(startPos, endPos - startPos + 1); 
     decrypted.Append(Encrypt.DecryptString(decrypt, key)); 
     startPos = endPos+1; 
    } while ((startPos > 0) && (startPos < encryptedText.Length)); 
    plainText = decrypted.ToString(); 
    textBox1.Text = plainText; 
    } 
+0

Oder null Gleichheitszeichen. –

+0

Danke! Es wirkt wie ein Zauber! –

Verwandte Themen