2009-05-10 15 views
8

Mi jefe quiere que encripte cierta información utilizada durante la transferencia de datos. Las cadenas individuales que se cifrarán tienen entre ocho y veinte caracteres de longitud. Se debe usar una sola contraseña para cifrar y descifrar, así que necesito un alogrithm simétrico. No quiero hacer lo mío: quiero usar uno integrado en .NET desde C#.¿Cuál es la mejor manera de encriptar cadenas cortas en .NET?

Entonces, ¿qué algoritmo es el mejor?

+2

ROT13. ¡Es súper eficiente también! –

+0

Ver mi publicación aquí: [http://stackoverflow.com/questions/202011/encrypt-decrypt-string-in-c](http://stackoverflow.com/questions/202011/encrypt-decrypt-string-in- c) – NotDan

+0

revise este [tutorial de cifrado] (http://msdn.microsoft.com/en-us/library/aa302405.aspx). –

Respuesta

8

TripleDes?

Puede utilizar el System.Security.Cryptography.TripleDESCryptoServiceProvider

cantidad pequeña de código para encrypy/descifrar ... hace exactamente lo que dice en la lata :)

+0

Estoy de acuerdo contigo DES es la mejor opción para él. –

+0

Mi única preocupación con DES es cómo hacer un intercambio de claves de forma segura. –

+1

Este problema (intercambio de claves) se aplica a cualquier cifrado simétrico (por supuesto, también hay problemas con asimétrico), y el OP explícitamente solicitado simétrico. http: //en.wikipedia.org/wiki/Key_exchange es un buen lugar para comenzar, pero es un tema complejo. –

1

Se podía utilizar el cifrado RSA, ya que estos son cadenas cortas , lo que simplificará el intercambio de claves.

La cantidad que puede encriptar con RSA se basa en la longitud de la clave.

Soy un fan de la biblioteca rsa del castillo hinchable.

6

TripleDES es una muy buena opción, pero también puede considerar AesCryptoServiceProvider (AES), que es un cifrado simétrico moderno.

2

clases de seguridad de .NET:

Hash

* MD5 
* MD5Cng 
* SHA1 
* SHA1Managed 
* SHA1Cng 
* SHA256 
* SHA256Managed 
* SHA256Cng 
* SHA384 
* SHA384Managed 
* SHA384Cng 
* SHA512 
* SHA512Managed 
* SHA512Cng 

cifrado simétrico: utiliza la misma clave para el cifrado y el descifrado.

* DES 
* DESCryptoServiceProvider 
* TripleDES 
* TripleDESCryptoServiceProvider 
* Aes 
* AesCryptoServiceProvider 
* AesManaged 
* RC2 
* RC2CryptoServiceProvider 
* Rijandel 
* RijandelManaged 

Cifrado asimétrico: Utiliza diferentes claves para el cifrado y descifrado.

* DSA 
* DSACryptoServiceProvider 
* ECDsa 
* ECDsaCng 
* ECDiffieHellman 
* ECDiffieHellmanCng 
* RSA 
* RSACryptoServideProvider 
+1

Es un muy buen volcado de nombres de clase, pero la mayoría de ellos no tienen relevancia para el remitente (que quiere un/simétrico// cifrado/algoritmo), no un hash o un cifrado asimétrico. –

3

Aquí se cifran & función de descifrado con el cifrado des3

''' <summary> 
''' Encrypts a memory string (i.e. variable). 
''' </summary> 
''' <param name="data">String to be encrypted.</param> 
''' <param name="key">Encryption key.</param> 
''' <param name="iv">Encryption initialization vector.</param> 
''' <returns>Encrypted string.</returns> 
Public Shared Function Encrypt(ByVal data As String, ByVal key As String, ByVal iv As String) As String 
    Dim bdata As Byte() = Encoding.ASCII.GetBytes(data) 
    Dim bkey As Byte() = HexToBytes(key) 
    Dim biv As Byte() = HexToBytes(iv) 

    Dim stream As MemoryStream = New MemoryStream 
    Dim encStream As CryptoStream = New CryptoStream(stream, des3.CreateEncryptor(bkey, biv), CryptoStreamMode.Write) 

    encStream.Write(bdata, 0, bdata.Length) 
    encStream.FlushFinalBlock() 
    encStream.Close() 

    Return BytesToHex(stream.ToArray()) 
End Function 

''' <summary> 
''' Decrypts a memory string (i.e. variable). 
''' </summary> 
''' <param name="data">String to be decrypted.</param> 
''' <param name="key">Original encryption key.</param> 
''' <param name="iv">Original initialization vector.</param> 
''' <returns>Decrypted string.</returns> 
Public Shared Function Decrypt(ByVal data As String, ByVal key As String, ByVal iv As String) As String 
    Dim bdata As Byte() = HexToBytes(data) 
    Dim bkey As Byte() = HexToBytes(key) 
    Dim biv As Byte() = HexToBytes(iv) 

    Dim stream As MemoryStream = New MemoryStream 
    Dim encStream As CryptoStream = New CryptoStream(stream, des3.CreateDecryptor(bkey, biv), CryptoStreamMode.Write) 

    encStream.Write(bdata, 0, bdata.Length) 
    encStream.FlushFinalBlock() 
    encStream.Close() 

    Return Encoding.ASCII.GetString(stream.ToArray()) 
End Function 
0

DES es más o menos obsoleta en este punto. Aquí está el Wikipedia. Si cambia mucho la llave, podría ser adecuada, pero si confía en una llave por un tiempo, AES parece ser una mejor opción.

Por supuesto, se trata de la cantidad de protección que necesita. Pero AES también está ahí.

He usado AES para cadenas pequeñas, y funciona bien.

Lo que he leído sobre TripleDES es que dado que DES es fácilmente crackable, TripleDES aún no es sustancial.

+2

En realidad, Wikipedia (http://en.wikipedia.org/wiki/TripleDES#Security) y NIST (http://csrc.nist.gov/publications/nistpubs/800-57/SP800-57-Part1.pdf) (página 66), indique que se espera que TripleDES esté seguro hasta 2030. –

+0

[Documento original del NIST] (http://web.archive.org/web/20090327043940/http://csrc.nist.gov/publications/ nistpubs/800-57/SP800-57-Part1.pdf) de Internet Archive. [Documento revisado del NIST] (http://csrc.nist.gov/publications/nistpubs/800-57/sp800-57-Part1-revised2_Mar08-2007.pdf) (2007) con la misma conclusión en Triple DES. –

Cuestiones relacionadas