Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Usar Cifrado Simétrico

Nuestros ethical hackers explican cómo implementar un método para cifrar texto, usando un algoritmo de cifrado simétrico (AES) y con Salt con una llave de 256 Bytes para cumplir con buenas practicas en el momento de desarrollar una aplicación en C#.

Necesidad

Cifrado simétrico con el algoritmo AES

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. La aplicación se está desarrollando en lenguaje C#.

  2. Es necesario emplear un algoritmo de cifrado simétrico.

Solución

  1. Para usar los algoritmos de cifrado simétrico use System.Security.Cryptography.

    ejemplo.cs
    1
    using System.Security.Cryptography;
    
  2. Para realizar el cifrado se va a crear un método que permita hacer esta tarea. Note que en una aplicación de la vida real, este método puede ser modificado de manera que se adapte mejor a sus necesidades.

    1
    public static string Encrypt(string plainText, string passPhrase, string saltValue, string hashAlgorithm, int passwordIterations, string initVector, int keySize)
    
  3. Las entradas del método son:

    • Texto en claro : Lo que se desea cifrar.

    • Frase clave: Una frase que a la cual aplicar el algoritmo hash que permita ingresar como clave del algoritmo AES.

    • Salt: Garantiza que la misma clave produce un hash diferente

    • El algoritmo hash a usar: Algoritmo a usar

    • Iteraciones de la clave: Número de iteraciones que se deben realizar sobre la clave.

    • Vector de inicialización: Usados por el algoritmo para mejorar la seguridad

    • Tamaño de la clave : Se recomienda hacerlo mayor o igual a 256 bits

  4. Para los propósitos de este ejemplo, se asume que las cadenas (string) sólo contienen códigos ASCII. Si usted desea usar otros caracteres, use una codificación adecuada.

  5. Inicialmente, se convierten los datos de entrada en arreglos de bytes.

    1
    2
    3
      byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
      byte[] saltValueBytes  = Encoding.ASCII.GetBytes(saltValue);
      byte[] plainTextBytes  = Encoding.UTF8.GetBytes(plainText);
    
  6. Luego, se debe crear una contraseña de la cual se derivará la clave. Para esto, el Framework de .NET ofrece una clase llamada PasswordDeriveBytes.

    1
      PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase,saltValueBytes,hashAlgorithm,passwordIterations);
    
  7. El objeto password contiene métodos para generar bytes pseudo aleatorios para el cifrado de la llave. Especifique el tamaño en bytes.

    1
      byte[] keyBytes = password.GetBytes(keySize / 8);
    
  8. La siguiente etapa es crear un objeto de cifrado Rijndael.

    1
      RijndaelManaged symmetricKey = new RijndaelManaged();
    
  9. Es muy importante establecer un modo de cifra adecuado. En este caso, se selecciona CBC.

    1
      symmetricKey.Mode = CipherMode.CBC;
    
  10. El API requiere de un cifrador para poder realizar las operaciones. Y además de un espacio de memoria para almacenar los datos cifrados.

    1
    2
      ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes,initVectorBytes);
      MemoryStream memoryStream = new MemoryStream();
    
  11. El flujo de cifrado es muy importante, el modo para cifrado debe ser "Write". Para descifrar se debe usar "Read".

    1
      CryptoStream cryptoStream = new CryptoStream(memoryStream,encryptor,CryptoStreamMode.Write);
    
  12. Finalmente, se usa el método Write para realizar el cifrado. Se debe hacer un llamado al método FlushFinalBlock.

    1
    2
      cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
      cryptoStream.FlushFinalBlock();
    
  13. El flujo de memoria se puede convertir en un arreglo de bytes.

    1
      byte[] cipherTextBytes = memoryStream.ToArray();
    
  14. Se cierran los flujos usados.

    1
    2
      memoryStream.Close();
      cryptoStream.Close();
    
  15. y se hace cualquier postprocesamiento adicional.

    1
    2
    3
      string cipherText = Convert.ToBase64String(cipherTextBytes);
      return cipherText;
    }
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. ejemplo.cs contiene todas las instrucciones C# del programa.




Haz un comentario

Estado de los servicios - Términos de Uso