2010-06-10 11 views
6

Soy bastante nuevo en programación. Escribí el código siguiente para solicitar al usuario una contraseña para encriptar un archivo, pero solo funciona cuando la longitud de la contraseña es 8, ¿qué puedo hacer en para aceptar cualquier cantidad de caracteres para la contraseña?Cifrado usando 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

estoy un poco desconcertado por la línea: string password = @ "" + forfait + ""; ¿Qué estás tratando de lograr al unir una cuerda emtpy en cada extremo de una cuerda, lo que resulta en una cadena idéntica. –

Respuesta

1

Derivar directamente su contraseña con Encoding.GetBytes() solo funcionará si el resultado de GetBytes() es un KeySize legal.

Más importante aún, es una clave muy débil, especialmente cuando optaste por la codificación Unicode. El patrón de bytes en su clave para "foobar" es 66 00 6F 00 6F 00 62 00 61 00 72 00. ¿Ves todos los 00 bytes?

La forma oficial es utilizar la clase Rfc2898DeriveBytes. Además, probablemente no sea una buena idea usar la llave como IV, no estoy completamente seguro de esto.

Ver también this SO question.

+0

Gracias por mencionarlo, si tienes razón, ha sido débil. – Mohammad

+0

Reutilizar la clave como IV es una mala idea. Escribí al respecto aquí: http://crazyscot.livejournal.com/304065.html – crazyscot

+0

@crazyscot: Sí, gracias por los enlaces. Pero tenga en cuenta que es algo aceptable para encriptar cadenas cortas mientras se evita la sobrecarga de transportar sal y IV. Pero debe estar claramente marcado y entendido como débil. –

2

se necesita una función que se va a conseguir una longitud de clave válida para Rijndael de su contraseña, y por el momento, su uso del UnicodeEncoding.GetBytes sólo se va a dar a este para ciertas longitudes discretas de contraseña, ya que he descubierto.

Debe usar otra función para obtener una clave de su contraseña; tal vez tome la matriz de bytes que ha generado y ejecute una función de cifrado hash como SHA1 en ella. SHA1 le dará una longitud de 128 bits, al igual que sus contraseñas de 8 caracteres actualmente, pero independientemente de la longitud de la contraseña.

+0

Déjame ver ¿lo entendí bien? ¿Quiere decir que debería tomar un valor hash de la contraseña (que seguramente es lo suficientemente larga) y luego pasar eso como la clave? – Mohammad

+0

@user ####: Sí. –

0

Salida PasswordDeriveBytes

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

Tendrá un valor fijo de sal, así como el pasado, esto impide que las personas que trabajan a cabo las contraseñas del algoritmo.

Es utilizado como esto para TripleDES y debe ser fácil de modificar para 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);