2009-09-27 13 views
5

Tengo una aplicación .NET. Necesito almacenar un valor de texto cifrado en un archivo, luego recuperar el valor cifrado en otro lugar en el código y descifrarlo.¿Cómo haré un simple cifrado y descifrado de archivos?

No necesito el método de encriptación más fuerte o más seguro en la tierra, simplemente algo que será suficiente para decir - Tengo el valor encriptado, y puedo descifrarlo.

He buscado mucho en la red para probar y usar la criptografía, pero la mayoría de los ejemplos que encuentro no definen claramente los conceptos, y la peor parte es que parecen ser específicos de la máquina.

Esencialmente, alguien puede por favor enviar un enlace a un método de encriptación fácil de usar que pueda encriptar valores de cadena a un archivo, y luego recuperar estos valores.

+0

"No necesito el método de encriptación más fuerte o más seguro en la tierra" - entonces, ¿por qué encriptarlo? Si no usa cifrado fuerte y la información tiene valor, es muy posible que alguien ** la ** descifre. – TrueWill

+1

Es como si estuviera preguntando qué sistema de seguridad debe poner en su edificio, pero no nos está diciendo qué es lo valioso en el edificio. El sistema de seguridad en un banco es muy diferente al sistema de seguridad en una embajada. No podemos recomendar un algoritmo de cifrado hasta que sepamos qué se está protegiendo y de qué amenaza. Describa el recurso que está protegiendo y la amenaza que le preocupa antes de decidir lanzar el cifrado al problema; el cifrado puede no ser la solución correcta. Una ACL puede ser la solución correcta o alguna otra tecnología de seguridad. –

+1

Además, no olvide que lo que hace que el cifrado sea seguro es la seguridad de la clave. * ¿Cómo vas a hacer una gestión de claves segura? * Ese es el problema difícil.En comparación, es fácil usar un algoritmo de cifrado disponible en el mercado. –

Respuesta

4

Biblioteca de extensiones Stackoverflow tiene dos pequeñas extensiones para encriptar & desencriptar cadena con RSA. Topic Here Utilicé algunas veces yo mismo pero no lo he probado realmente, pero ESTÁ en la biblioteca de extensiones SO así que supongo que está probado & estable.

Encriptar;

public static string Encrypt(this string stringToEncrypt, string key) 
     { 
      if (string.IsNullOrEmpty(stringToEncrypt)) 
      { 
       throw new ArgumentException("An empty string value cannot be encrypted."); 
      } 

      if (string.IsNullOrEmpty(key)) 
      { 
       throw new ArgumentException("Cannot encrypt using an empty key. Please supply an encryption key."); 
      } 

      System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters(); 
      cspp.KeyContainerName = key; 

      System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp); 
      rsa.PersistKeyInCsp = true; 

      byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true); 

      return BitConverter.ToString(bytes); 
     } 

Descifrar;

public static string Decrypt(this string stringToDecrypt, string key) 
     { 
      string result = null; 

      if (string.IsNullOrEmpty(stringToDecrypt)) 
      { 
       throw new ArgumentException("An empty string value cannot be encrypted."); 
      } 

      if (string.IsNullOrEmpty(key)) 
      { 
       throw new ArgumentException("Cannot decrypt using an empty key. Please supply a decryption key."); 
      } 

      try 
      { 
       System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters(); 
       cspp.KeyContainerName = key; 

       System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp); 
       rsa.PersistKeyInCsp = true; 

       string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, StringSplitOptions.None); 
       byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, System.Globalization.NumberStyles.HexNumber)))); 


       byte[] bytes = rsa.Decrypt(decryptByteArray, true); 

       result = System.Text.UTF8Encoding.UTF8.GetString(bytes); 

      } 
      finally 
      { 
       // no need for further processing 
      } 

      return result; 
     } 
+0

Exactamente la respuesta que estaba buscando, algo que funciona y no demasiado complicado. Lo usaré como referencia para aprender más sobre RSA. Gracias de nuevo Tiax –

+0

Ok para cadenas cortas pero fallará para cadenas de entrada de más de 86 caracteres. En general, RSA no es muy adecuado para grandes cantidades de datos. –

1

Si está buscando hacer encriptación simétrica, entonces consideraría el Enterprise Library Cryptography Application Block. David Hayden had a useful blog post about it, aunque es para Enterprise Library 2.0 (la actual es 4.1), creo que seguirá siendo útil.

+0

Gracias Richard, ¿lo has usado antes? –

+0

Sí, fue bastante fácil de usar y la herramienta de configuración fue bastante directa. Básicamente lo utilicé en el escenario descrito en Desplegar el Bloque de la Aplicación de Criptografía- http://msdn.microsoft.com/en-us/library/dd203351.aspx – RichardOD

+0

@Richard, ocupado siguiendo el ejemplo en el blog, y luego llegar a este point ... http://s637.photobucket.com/albums/uu91/mleppan/?action=view¤t=Capture.png, entonces esto significa que si creo un archivo encriptado en mi máquina de desarrollo local, no puedo descifrarlo en un servidor web alojado? –

0

Aquí hay una publicación de blog que utiliza la biblioteca de criptografía que .NET incluye para un cifrado/descifrado simétrico.

Un algoritmo simétrico utiliza la misma clave para cifrar y descifrar, de forma muy similar a como usa una tecla para bloquear y desbloquear la puerta de su automóvil.

Un algoritmo de clave pública usaría una clave para cifrar y otra para descifrar, por lo tanto, puedo enviarle un archivo cifrado y saber que solo usted puede descifrarlo, ya que ha mantenido su clave muy segura y privada .

http://blog.binaryocean.com/2006/01/08/NETSymmetricEncryption.aspx

Cuestiones relacionadas