2010-06-10 19 views
6

Sono abbastanza nuovo in programmazione. Ho scritto il codice qui sotto al fine di richiedere all'utente una password per crittografare un file, ma funziona solo quando la lunghezza della password è 8, Cosa posso fare su per accettare un numero qualsiasi di caratteri per la password?Crittografia utilizzando 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

Sono un po' perplesso per la linea: string password = @ "" + passo + ""; cosa stai cercando di ottenere unendo una stringa emtpy a ciascuna estremità di una stringa, risultando in una stringa identica. –

risposta

1

Direttamente derivando una chiave, digitare la password con Encoding.GetBytes() funzionerà solo se il risultato di GetBytes() è un valore di chiave legale.

Ancora più importante, rende una chiave molto debole, soprattutto quando si è optato per la codifica Unicode. Il modello di byte nella tua chiave per "foobar" è 66 00 6F 00 6F 00 62 00 61 00 72 00. Vedi tutti i 00 byte?

Il modo ufficiale è utilizzare la classe Rfc2898DeriveBytes. Inoltre probabilmente non è una buona idea usare la chiave come IV, non ne sono del tutto sicuro.

Vedere anche this SO question.

+0

Grazie a dirlo, sì hai ragione è andato essere un debole. – Mohammad

+0

Riutilizzare la chiave come IV è davvero una cattiva idea. Ho scritto a questo proposito qui: http://crazyscot.livejournal.com/304065.html – crazyscot

+0

@crazyscot: Sì, grazie per i collegamenti. Si noti tuttavia che è in qualche modo accettabile per la crittografia delle stringhe corte evitando il sovraccarico del trasporto di sale e IV. Ma dovrebbe essere chiaramente contrassegnato e inteso come debole. –

2

Hai bisogno di un funzione che sta per arrivare una lunghezza di chiave valida per Rijndael da password, e, al momento, l'utilizzo di UnicodeEncoding.GetBytes è solo andare a dare questo per alcune lunghezze discrete di una password, come si ho scoperto.

Dovresti usare un'altra funzione per ottenere una chiave dalla tua password - forse prendere l'array di byte che hai generato ed eseguire una funzione di hash crittografica come SHA1 su di essa. SHA1 ti darà una lunghezza di 128 bit, come fanno attualmente le tue password di 8 caratteri, ma indipendentemente dalla lunghezza della password.

+0

Fammi vedere, ho capito bene? Vuoi dire che dovrei prendere un valore hash della password (che di sicuro è abbastanza lungo) e poi passarlo come chiave? – Mohammad

+0

@user ####: Sì. –

0

Partenza PasswordDeriveBytes

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

Avrete bisogno di un valore salt fisso così come il passato, questo impedisce alle persone che lavorano fuori le password dall'algoritmo.

E 'usato come questo per TripleDES e dovrebbe essere facile da modificare per Rijndael:

// 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); 
Problemi correlati