Criptografía con .NET

Cómo utilizar las herramientas criptográficas de .NET

Hasta la llegada de .NET, programar aplicaciones que incorporasen sencillas operaciones criptográficas, como cifrar o calcular hashes, se convertía en una tarea complicada y propensa a errores. Gracias a .NET ya no es necesario recurrir al uso de la críptica CryptoAPI o al costoso diseño desde cero. Las nuevas clases de .NET facilitan sobremanera la programación de criptografía.

Desde que el hombre comenzó a comunicarse con sus semejantes ha experimentado la necesidad de proteger su información confidencial de oídos y ojos indiscretos. A lo largo de la historia se han utilizado distintas técnicas de protección, desde la esteganografía para ocultar la existencia de los propios mensajes secretos de manera que pasaran desapercibidos al enemigo -como por ejemplo gracias a la tinta invisible o los micropuntos en letras de libros o periódicos- hasta la criptografía, para cifrar el contenido de los mensajes de forma que sean ininteligibles para cualquiera que no posea la clave de descifrado, como la cifra de César, las rótulas de Tritemio o los cuadrados de Polibio.
En la actualidad, las modernas redes de comunicaciones han aumentado las posibilidades de transmisión de información hasta unos límites antes inimaginables. A medida que más información y de mayor valor circula por las redes, privadas o públicas, crece paralelamente la posibilidad de que sea interceptada subrepticiamente. Hoy en día, la criptografía, ciencia (o arte) de enviar información de manera segura a través de canales inseguros, se está extendiendo a ámbitos cada vez más variados. En repuesta a esta creciente demanda de protección criptográfica de aplicaciones y servicios, Microsoft ha facilitado sobremanera la labor de los programadores poniendo la criptografía al alcance de todos gracias a las nuevas clases de seguridad de .NET.
En esta primera parte repasamos algunos conceptos básicos de criptografía, como son el cifrado simétrico (o de clave secreta), los hashes y la generación de números aleatorios. A continuación se explica cómo han sido implantados por .NET. Después de examinar de forma teórica algunas cuestiones fundamentales de criptografía, se introducen las clases de .NET relacionadas con operaciones criptográficas, contenidas en el espacio de nombres System.Security.Cryptography. En la segunda parte de este artículo se explicará cómo utilizar el cifrado asimétrico (o de clave pública) y las firmas digitales.
El modelo de clases criptográficas de .NET
.NET proporciona implantaciones de numerosos algoritmos criptográficos estándares: cifrado simétrico y asimétrico, hash, generación de números pseudoaleatorios, firma de mensajes, derivación de claves a partir de contraseñas, etc. Estos algoritmos son fáciles de utilizar y disponen de las propiedades predeterminadas más seguras.
El sistema de seguridad de .NET implanta un modelo extensible de herencia de clases derivadas. La jerarquía es la siguiente:
1. En primer lugar, la clase base abstracta que define el tipo genérico de algoritmo, como por ejemplo, SymmetricAlgorithm o HashAlgorithm. Esta clase base abstracta define métodos y propiedades que son comunes a todos los algoritmos derivados de ella.
2. A continuación, la clase abstracta del algoritmo concreto hereda de la clase base abstracta del tipo de algoritmo, como por ejemplo, RC2 para SymmetricAlgorithm o SHA1 para HashAlgorithm. Este nivel también es abstracto. Estas clases abstractas tienen dos funciones. Por un lado, exponen detalles específicos del algoritmo, como tamaños de bloque o de clave. Por otro lado, definen propiedades y métodos que son comunes para todas las implementaciones del algoritmo que representan, pero que no se aplican a otros algoritmos.
3. Por último, la implantación concreta de la clase de algoritmo hereda de la clase abstracta del algoritmo, por ejemplo RC2CryptoServiceProvider para RC2 o SHA1Managed para SHA1. Este nivel está completamente implantado. Es importante señalar que cada vez que se crea un objeto de estas clases, .NET rellena todos los parámetros del algoritmo (claves, vectores de inicialización, modos de operación, etc.) automáticamente, utilizando valores tan seguros como sea posible.
Este modelo de clases derivadas proporciona una gran flexibilidad para los programadores de algoritmos criptográficos, ya que resulta sencillo agregar un nuevo algoritmo o una nueva implantación de un algoritmo existente. Por ejemplo, para crear un nuevo algoritmo de clave pública, heredaría de AsymmetricAlgorithm, mientras que para crear una nueva implantación de un algoritmo específico, como RSA, crearía una clase derivada no abstracta de la clase abstracta RSA.
La convención de nombres para las clases que implantan los algoritmos consiste en utilizar el nombre del algoritmo seguido de una cadena que identifica al origen de la implantación. El sufijo CryptoServiceProvider denota una implantación basada en los Proveedores de Servicios Criptográficos de Microsoft (CSP), integrados en la CryptoAPI. El sufijo Managed denota un algoritmo implantado completamente en código administrado (un lenguaje que se ejecuta sobre el CLR, como C# o VB.Net), que por lo tanto no depende de la CryptoAPI.
El CLR utiliza un diseño basado en secuencias o streams para implantar algoritmos de cifrado simétrico y algoritmos de hash. El núcleo de este diseño es la clase CryptoStream, derivada de la clase System.IO.Stream, que implanta la interfaz ICryptoTransform. ICryptoTransform representa cualquier transformación matem

Viñeta publicada el 20 de febrero de 1870 en La Flaca n.º 35 Tendencias

ny2 ACTUALIDAD

ny2 Sociedad de la información

Día de la Movilidad y el BYOD Coffee Break