Criptografía en C# (.NET): cifrado y hash
La seguridad de los datos es una de las tareas clave del desarrollo moderno. La plataforma .NET proporciona un conjunto de herramientas potente y flexible para la protección criptográfica en el espacio de nombres System.Security.Cryptography. En este artículo, analizaremos en detalle las principales capacidades de la criptografía en C#: cifrado simétrico y asimétrico, así como hash de datos. El material será útil tanto para principiantes como para desarrolladores experimentados que deseen sistematizar sus conocimientos.
1. Espacios de nombres y clases principales
Toda la funcionalidad criptográfica se concentra en el ensamblado System.Security.Cryptography. Claves principales:
Aes,DES,TripleDES— algoritmos simétricos;RSA,ECDsa,ECDiffieHellman— algoritmos asimétricos;SHA256,SHA512,MD5— algoritmos de hash;RandomNumberGenerator— generador de números aleatorios criptográficamente seguro.
Importante: utilice solo algoritmos modernos. MD5 y SHA1 se consideran obsoletos e inseguros para fines criptográficos.
2. Cifrado simétrico (AES)
El cifrado simétrico utiliza la misma clave para cifrar y descifrar. El algoritmo más popular es AES (Advanced Encryption Standard). Veamos un ejemplo de cifrado de una cadena.
using System;using System.IO;using System.Security.Cryptography;using System.Text;
public class AesEncryption{ public static byte[] EncryptStringToBytes_Aes(string plainText, byte[] key, byte[] iv) { using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(plainText); } return msEncrypt.ToArray(); } } } }
public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] key, byte[] iv) { using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv;
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream msDecrypt = new MemoryStream(cipherText)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } }}Para generar una clave segura y un vector de inicialización (IV), use RandomNumberGenerator:
using System.Security.Cryptography;
byte[] key = new byte[32]; // 256 bitsbyte[] iv = new byte[16]; // 128 bitsusing (RandomNumberGenerator rng = RandomNumberGenerator.Create()){ rng.GetBytes(key); rng.GetBytes(iv);}3. Cifrado asimétrico (RSA)
El cifrado asimétrico utiliza un par de claves: pública (public) y privada (private). RSA es un algoritmo clásico, adecuado para cifrar pequeñas cantidades de datos (generalmente hasta 190 bytes para una clave de 2048 bits). Ejemplo:
using System;using System.Security.Cryptography;using System.Text;
public class RsaEncryption{ public static (byte[]