Tutorial Cryptography Application Block: Encriptacion

En este tutorial utilizaremos Cryptography Application Block de Enterprise Library 5.0 para encriptar y desencriptar datos con un algoritmo de clave simetrica. Como pre-requisito debe instalar Enterprise Library.
Puede descargar el codigo fuente de este tutorial y ejecutar la aplicacion de ejemplo.

Configuración

El primer paso para utilizar Cryptography Application Block es configurar el o los algoritmos que vamos a utilizar. La configuracion se almacena en el mismo archivo de configuración de la aplicación (app.config o web.config). Enterprise Library incluye una herramienta de configuración que facilita la edición de este archivo.

Para acceder a la herramienta desde Visual Studio hacemos click con el botón derecho del mouse sobre el archivo de configuración de la aplicación, en menú contextual haga click en “Edita Enterprise Library v5 Configuration”, como se ve en la siguiente imagen.

Esta herramienta permite agregar configuración para cada uno de los bloques de Enterprise Library. Para agregar la configuracion de Cryptography Application Block debemos hacer click en el menu "Blocks" y luego en "Add Cryptography Settings".

Para agregar un algoritmo de de encriptacion hacemos click en la icono con forma de cruz a la derecha de "Symmetric Cryptography Providers", luego extendemos el menu "Add Symmetric Cryptography Providers" y finalmente hacemos click en "Add Symmetric Algorithm Provider".

Aparece el cuadro de dialogo para seleccionar el algoritmo. Este de dialogo buscar los algoritmos de encriptacion simetrica dentro de las librerias de .NET y los muestra clasificados por espacio de nombres. Para este ejemplo seleccionaremos "System.Security.Cryptography.AesCryptoServiceProvider", como se ve en la imagen.

Los algoritmo de clave simetrica requiere una clave de encriptacion. Al agregar el algoritmo la herramienta de configuracion lanzara un wizard que nos da tres opciones: Crear una clave nueva, utilizar una existente almacenada en el equipo, o importar una desde un archivo de transporte. Para mas detalles ver tutorial sobre Almacenamieto y Transporte de Clave (Proximamente). Para este ejemplo crearemos una clave nueva.

El siguiente paso es ingresar la clave nueva o usar el voton "Generate" para generar una al azar.

Cryptography Application Block guarda las claves de algoritmo simetrico en archivos de texto protegidos con encriptacion DPAPI, el siguiente paso del wizard es seleccionar la ubicacion de este archivo. Es importante que proteja el archivo ademas con permisos ACL.

La encriptacion DPAPI, con la cual se protege nuestra clave simetrica, usa la password de la cuenta de usuario Windows o usa la credencial del computador para encriptar el archivo. Cuando seleciona usar la clave del usuario solo el usuario acutal sera capaz de acceceder a la clave y usar la aplicacion. Cuando seleccionar credencial de computador, todos los usuario del computador podran acceder a la clave y usar la aplicacion. En este ejemplo seleccionamos a nivel de usuario.

Con esto terminamos el wizard para generar una nueva clave simetrica. El siguiente paso es definir el nombre con el cual nos referiremos a este algoritmo desde el codigo fuente. Cryptography Application Block permite configurar varios algoritmos inditificados por nombres. Como se ve en la imagen abajo lo nombramos "aesTutorial".

Es posible definir un algorito por defecto que podemos usar desde el codigo fuente sin indicar un nombre. Para ello hacemos click en el chevron a la derecha de "Cryptography Settings" lo cual extiende configuraciones adicionales. Para "Default Symetric Crypto Provider" seleccionamos desde la lista nuestro algoritmo "aesTutorial"

Con esto hemos terminado la configuracion de nuestro algoritmo de clave simetrica. Guardamos y cerramos la herramienta de configuracion. Al guardar se crea el archivo almacena la clave simetrica en la ubicacion que definimos, en nuestro caso "c:\MisClave\ClaveTutorialCrypto.key".

Referencias y Espacios de Nombre

Para utilizar Cryptography Application Block debemos agregar referencias a los siguientes ensamblados:

  • Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.dll
  • Microsoft.Practices.EnterpriseLibrary.Common.dll
  • Microsoft.Practices.ServiceLocation.dll

Estos ensamblados se encuentran en el directorio en que instalo Enterprise Library, por defecto: "C:\Program Files\Microsoft Enterprise Library 5.0\Bin\". El tercer ensamblado, "Microsoft.Practices.ServiceLocation.dll" no es estricamente necesario pero lo usaremos para crear la instancias del objeto clave que permite encriptar y desencriptar.

En los archivos de codigo fuente donde usemos el bloque importamos los siguientes espacios de nombre:

using Microsoft.Practices.EnterpriseLibrary.Security.Cryptography;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
Ejemplo Encriptar Texto

En este ejemplo usaremos Cryptography Application Block para encriptar texto. Hay varias formas de acceder a la funcionalidad del bloque, en este ejemplo usaremos EnterpriseLibraryContainer.Current.GetInstance() para obtener una instancia de un objeto CryptographyManager.
El metodo EncryptSymmetric() acepta dos parametros de tipo string, el primero indica el nombre del algoritmo a utilizar, segun fue definido en la configuracion. El segundo es el texto a encriptar.
Cuando es llamado con estos parametros el metodo EncryptSymmetric() devuelve el texto encriptado en formota base64.

public string Encriptar(string texto)
{
    var crypto = EnterpriseLibraryContainer.Current.GetInstance<CryptographyManager>();
    string result = crypto.EncryptSymmetric("aesTutorial", texto);
    return result;
}
Ejemplo Desencriptar Texto

En este ejemplo usaremos Cryptography Application Block para desencriptar texto previamente encriptado con la misma clave simetrica. Para esto usamos el metodo DecryptSymmetric().
El metodo DecryptSymmetric() acepta dos parametros de tipo string, el primero indica el nombre del algoritmo a utilizar, segun fue definido en la configuracion. El segundo es el texto encriptado.
El metodo DecryptSymmetric() devuelve el texto desencriptado.

public string Desencriptar(string textoEncriptado)
{
    var crypto = EnterpriseLibraryContainer.Current.GetInstance<CryptographyManager>();
    string result = crypto.DecryptSymmetric("aesTutorial", textoEncriptado);
    return result;
}
Ejemplo Encriptar un Array de Bytes

En este ejemplo usaremos Cryptography Application Block para encriptar un array de bytes. Para esto usamos el metodo EncryptSymmetric().
El metodo EncryptSymmetric() acepta dos parametros de tipo string, el primero indica el nombre del algoritmo a utilizar, segun fue definido en la configuracion. El segundo es el array de bytes a encriptar.
Cuando es llamado con estos parametros el metodo EncryptSymmetric() devuelve un nuevo array de bytes con la secuencia encriptada.

public byte[] Encriptar(byte[] bytes)
{
    var crypto = EnterpriseLibraryContainer.Current.GetInstance<CryptographyManager>();
    byte[] result = crypto.EncryptSymmetric("aesTutorial", bytes);
    return result;
}
Ejemplo Desencriptar un Array de Bytes

En este ejemplo usaremos Cryptography Application Block para desencriptar un array de bytes. Para esto usamos el metodo DecryptSymmetric().
El metodo DecryptSymmetric() acepta dos parametros, el primero de tipo string indica el nombre del algoritmo a utilizar, segun fue definido en la configuracion. El segundo es el array de bytes encriptado con la misma clave simetrica.
Cuando es llamado con estos parametros el metodo EncryptSymmetric() devuelve un nuevo array de bytes con la secuencia desencriptada.

public byte[] Desencriptar(byte[] bytesEncriptados)
{
    var crypto = EnterpriseLibraryContainer.Current.GetInstance<CryptographyManager>();
    byte[] result = crypto.DecryptSymmetric("aesTutorial", bytesEncriptados);
    return result;
}

Con esto concluimos el tutorial. Configuramos el algoritmo de clave simetrica AES, usamos el wizard de la herramienta de configuracion para crear una nueva clave simetrica. Agregamos las referencias a los ensamblados necesarios, y la un objeto CryptographyManager para encriptar y desencriptar texto y arrays de bytes.


Artículos Relacionados