2010-06-10 11 views
6

Ich bin ziemlich neu in der Programmierung. Ich schrieb den folgenden Code, um den Benutzer für ein Passwort zur Verschlüsselung einer Datei, aber es funktioniert nur, wenn die Länge des Passwortes ist 8, Was kann ich tun auf Um eine beliebige Anzahl von Zeichen für das Passwort zu akzeptieren?Verschlüsselung mit Rijndael

string pass = textBox2.Text.ToString(); 
      string password = @"" + pass + ""; 
      UnicodeEncoding UE = new UnicodeEncoding(); 
      byte[] key = UE.GetBytes(password); 


      FileStream fsCrypt = new FileStream(@"c:\\users\\new", FileMode.Create); 
      name = fsCrypt.Name; 
      RijndaelManaged RMCrypto = new RijndaelManaged(); 

      CryptoStream cs = new CryptoStream(fsCrypt, 
       RMCrypto.CreateEncryptor(key, key), 
       CryptoStreamMode.Write); 

      FileStream fsIn = new FileStream(filename, FileMode.Open); 

      int data; 
      while ((data = fsIn.ReadByte()) != -1) 
       cs.WriteByte((byte)data); 
+0

ich ein bisschen durch die Linie verwirrt bin: string password = „“ + Pass + „“ @; Was versuchen Sie zu erreichen, indem Sie einen empty String an jedes Ende eines Strings anschließen, was zu einem identischen String führt. –

Antwort

1

Direktes Ableiten eines Schlüsselformulars Ihr Passwort mit Encoding.GetBytes() funktioniert nur, wenn das Ergebnis von GetBytes() eine gültige KeySize ist.

Wichtiger, es macht einen sehr schwachen Schlüssel, vor allem, wie Sie für die Unicode-Codierung entschieden haben. Das Byte-Muster in Ihrem Schlüssel für "Foobar" ist 66 00 6F 00 6F 00 62 00 61 00 72 00. Siehst du alle 00 Bytes?

Der offizielle Weg ist die Rfc2898DeriveBytes Klasse zu verwenden. Es ist wahrscheinlich auch keine gute Idee, den Key als IV zu verwenden, da bin ich mir nicht ganz sicher.

Siehe auch this SO question.

+0

Danke zu erwähnen, yeah, du hast Recht, es ist ein schwacher geworden. – Mohammad

+0

Die Wiederverwendung des Schlüssels als IV ist in der Tat eine schlechte Idee. Ich schrieb darüber hier: http://crazyscot.livejournal.com/304065.html – crazyscot

+0

@crazyscot: Ja, thx für die Links. Beachten Sie jedoch, dass es akzeptabel ist, kurze Strings zu verschlüsseln und gleichzeitig den Aufwand für den Transport von Salt und IV zu vermeiden. Aber es sollte deutlich als schwach markiert und verstanden werden. –

2

Sie benötigen eine Funktion, die eine gültige Schlüssellänge für Rijndael aus Ihrem Passwort erhalten wird, und in dem Moment, um Ihre Nutzung von UnicodeEncoding.GetBytes ist dies nur für bestimmte diskrete Längen Passwort gehen zu geben, wie Sie habe ich entdeckt.

Sie sollten eine andere Funktion verwenden, um einen Schlüssel von Ihrem Kennwort abzurufen - nehmen Sie das Byte-Array, das Sie generiert haben, und führen Sie eine kryptographische Hash-Funktion wie SHA1 aus. SHA1 wird Ihnen eine 128-Bit-Länge geben, wie es Ihre 8-stelligen Passwörter derzeit tun, aber unabhängig von der Länge des Passworts.

+0

Lass mich sehen, habe ich es richtig gemacht? Sie meinen, ich sollte einen Hash-Wert des Passwortes nehmen (das ist sicher lang genug) und dann das als Schlüssel übergeben? – Mohammad

+0

@benutzer ####: Ja. –

0

Check out PasswordDeriveBytes

http://msdn.microsoft.com/en-us/library/system.security.cryptography.passwordderivebytes(v=VS.100).aspx

Sie werden eine als auch Salz Wert festgelegt benötigen als die vergangen, diese Leute stoppt die Passwörter aus dem Algorithmus der Arbeit aus.

Es ist, wie dies für TripleDES verwendet und sollte für Rijndael ändern einfach sein:

// Create a TripleDESCryptoServiceProvider object. 
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); 

// Create a PasswordDeriveBytes object and then create 
// a TripleDES key from the password and salt. 
PasswordDeriveBytes pdb = new PasswordDeriveBytes(pwd, salt); 


// Create the key and set it to the Key property 
// of the TripleDESCryptoServiceProvider object. 
tdes.Key = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, tdes.IV); 
Verwandte Themen