| Artículos | 01 ENE 2004

Criptografía con .NET

Tags: Histórico
Cómo utilizar las herramientas criptográficas de .NET
Gonzalo Álvarez.
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ática bloque a bloque, como es la operación de cifrado de un cifrador simétrico en bloque o como son las operaciones de codificación, por ejemplo, en Base64.
Las transformaciones sobre secuencias se realizan envolviendo un ICryptoTransform alrededor de la secuencia de entrada utilizando la clase CryptoStream. El CryptoStream se crea especificando: a) la secuencia de entrada, b) el ICryptoTransform a aplicar sobre los datos de entrada, y c) el modo de operación (lectura o escritura). Más adelante se explica este funcionamiento con varios ejemplos.
La configuración criptográfica permite resolver una implantación específica de un algoritmo, facilitando la extensibilidad de las clases de criptografía de .NET. Puede agregar su propia implantación de hardware o software de un algoritmo y asignarle el nombre del algoritmo que elija.

Algoritmos de cifrado simétrico
El cifrado consiste en transformar mediante un algoritmo matemático un texto en claro inteligible por todos en un texto cifrado, totalmente ininteligible excepto para el legítimo destinatario del mismo, que será el poseedor de la clave secreta. Se distinguen dos métodos generales de cifrado: cifrado simétrico y cifrado asimétrico. Trataremos este último en la segunda parte del artículo.
Cuando se emplea la misma clave en las operaciones de cifrado y descifrado, se dice que el criptosistema es simétrico o de clave secreta. Estos sistemas son mucho más rápidos que los de clave pública, por lo que resultan apropiados para el cifrado de grandes volúmenes de datos. Ésta es la opción utilizada para cifrar el cuerpo de los mensajes en el correo electrónico o los datos intercambiados en las comunicaciones digitales a través de Internet o el contenido de un archivo del disco duro o los registros de una base de datos.
Estos criptosistemas pueden di

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información