Exportar (0) Imprimir
Expandir todo

Información general sobre criptografía

La criptografía ayuda a proteger los datos contra su visualización o modificación, y ayuda a ofrecer un medio de comunicación seguro a través de canales que, de lo contrario, resultarían inseguros. Por ejemplo, los datos pueden cifrarse usando un algoritmo criptográfico transmitido en un estado cifrado que, después, descifrará el interesado en cuestión. Si un tercero intercepta los datos cifrados, le resultará difícil descifrarlos.

En una situación típica donde se usa la criptografía, dos partes (Alicia y Roberto) se comunican en un canal inseguro. Ambos desean garantizar que su comunicación no la comprenda nadie que pueda estar escuchando. Además, como Alicia y Roberto se encuentran en ubicaciones remotas, Alicia desea estar segura de que la información que recibe de Roberto no la ha modificado nadie durante la transmisión. Por último, debe asegurarse de que la información se origina realmente en Roberto y no proviene de alguien que le suplanta.

La criptografía se utiliza para lograr los objetivos siguientes:

  • Confidencialidad: para ayudar a proteger la identidad de un usuario o evitar que se lean sus datos.

  • Integridad de los datos: para ayudar a evitar su alteración.

  • Autenticación: para garantizar que los datos se originen en una parte en particular.

Para alcanzar estos objetivos, se puede usar una combinación de algoritmos y prácticas conocidas como primitivas criptográficas para crear un esquema criptográfico. En la tabla siguiente se enumeran las primitivas criptográficas y su uso.

Primitiva criptográfica Uso

Cifrado de clave secreta (criptografía simétrica)

Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza una clave secreta compartida para cifrar y descifrar los datos.

Cifrado de clave pública (criptografía asimétrica)

Realiza la transformación de los datos, impidiendo que terceros los lean. Este tipo de cifrado utiliza un par de claves pública y privada para cifrar y descifrar los datos.

Firmas criptográficas

Ayuda a comprobar que los datos se originan en una parte específica mediante la creación de una firma digital única para esa parte. En este proceso también se usan funciones hash.

Valores hash criptográficos

Asigna datos de cualquier longitud a una secuencia de bytes de longitud fija. Los valores hash son únicos estadísticamente; el valor hash de una secuencia de dos bytes distinta no será el mismo.

Cifrado de clave secreta

Los algoritmos de cifrado de clave secreta utilizan una clave secreta única para cifrar y descifrar datos. Debe asegurarse de que agentes no autorizados no obtengan acceso a la clave puesto que podrían utilizarla para descifrar los datos. El cifrado de clave secreta también se denomina cifrado simétrico puesto que se utiliza la misma clave para el cifrado y el descifrado. Los algoritmos de cifrado de clave secreta son muy rápidos (comparados con los de clave pública) y son adecuados para las transformaciones criptográficas en grandes secuencias de datos.

Normalmente, los algoritmos de clave secreta, denominados de cifrado de bloques, se utilizan para cifrar un bloque de datos a la vez. Los cifrados de bloques (como RC2, DES, TripleDES y Rijndael) transforman criptográficamente un bloque de entrada de n bytes en un bloque de salida de bytes cifrados. Si desea cifrar o descifrar una secuencia de bytes, debe hacerlo bloque a bloque. Como n es pequeño (n = 8 bytes para RC2, DES y TripleDES; n = 16 [el valor predeterminado], n = 24 o n = 32 bytes para Rijndael), los valores mayores que n deben cifrarse bloque a bloque.

Las clases de cifrado de bloques que ofrece la biblioteca de clases base utilizan un modo de encadenamiento denominado CBC (Cipher Block Chaining, encadenamiento de bloques de cifrado), que utiliza una clave y un IV (Initialization Vector, vector de inicialización) para realizar transformaciones criptográficas en los datos. Para una clave secreta k determinada, un cifrado de bloques simple que no utiliza un vector de inicialización codificará el mismo bloque de entrada de texto sin cifrar en el mismo bloque de salida de texto cifrado. Si hay bloques duplicados dentro la secuencia de texto sin cifrar, habrá bloques duplicados en la secuencia de texto cifrado. Si usuarios no autorizados saben algo acerca de la estructura de un bloque del texto sin cifrar, pueden utilizar esa información para descifrar el bloque de texto cifrado conocido y, posiblemente, recuperar la clave. Para combatir este problema, la información del bloque anterior se mezcla en el proceso de cifrado del bloque siguiente. Así pues, el resultado de dos bloques idénticos de texto sin cifrar es distinto. Como esta técnica utiliza el bloque anterior para cifrar el bloque siguiente, se utiliza un IV para cifrar el primer bloque de datos. Con este sistema, los encabezados de los mensajes comunes que un usuario no autorizado podría conocer no pueden utilizarse para aplicar técnicas de ingeniería inversa en una clave.

Un modo de comprometer los datos cifrados con este tipo de cifrado es realizar una búsqueda exhaustiva de todas las claves posibles. En función del tamaño de la clave utilizada para realizar el cifrado, este tipo de búsqueda llevará mucho tiempo aunque se utilicen los equipos más rápidos y, por lo tanto, no es factible. Los tamaños de clave mayores son más difíciles de descifrar. Aunque el cifrado no garantiza totalmente que un adversario no recupere los datos cifrados, aumenta considerablemente la dificultad. Si se tardan tres meses en realizar una búsqueda exhaustiva para recuperar datos que sólo son significativos durante varios días, este método de búsqueda es poco práctico.

La desventaja del cifrado de clave secreta es que presupone que dos partes han acordado una clave y un vector de inicialización, y que han comunicado sus valores. Asimismo, la clave debe mantenerse en secreto a salvo de usuarios no autorizados. Debido a estos problemas, el cifrado de clave secreta a menudo se utiliza junto con el cifrado de clave pública para comunicar en privado los valores de la clave y el vector de inicialización.

Suponiendo que Alicia y Roberto desearan comunicarse a través de un canal inseguro, utilizarían un cifrado de clave secreta como sigue. Alicia y Roberto acuerdan utilizar un algoritmo en particular (Rijndael, por ejemplo) con una clave y vector de inicialización en concreto. Alicia redacta un mensaje y crea una secuencia de red donde enviarlo. A continuación, cifra el texto usando la clave y el vector de inicialización, y lo envía por Internet. No envía la clave y el vector a Roberto. Roberto recibe el texto cifrado y lo descifra utilizando la clave y el vector acordado anteriormente. Si se intercepta la transmisión, el interceptor no podrá recuperar el mensaje original porque no conoce la clave ni el vector. En este caso, la clave debe permanecer en secreto, lo que no se requiere para el vector de inicialización. En un ejemplo real, Alicia o Roberto genera una clave secreta y utiliza el cifrado (asimétrico) de clave pública para transferir la clave (simétrica) secreta a la otra parte. Para obtener más información, vea la sección referente al cifrado de clave pública que figura más adelante en este mismo tema.

.NET Framework proporciona las siguientes clases que implementan algoritmos de cifrado de clave secreta:

Cifrado de clave pública

El cifrado de clave pública utiliza una clave privada que debe mantenerse en secreto y a salvo de los usuarios no autorizados, así como una clave pública que puede comunicarse. La clave pública y la privada están vinculadas matemáticamente; los datos cifrados con la clave pública sólo pueden descifrarse con la clave privada y los datos firmados con la clave privada sólo pueden comprobarse con la clave pública. La clave pública está a disposición de cualquier persona y se utiliza para cifrar los datos que se envían a quien guarda la clave privada. Ambas claves son únicas para la sesión de comunicación. Los algoritmos criptográficos de clave pública también se conocen como algoritmos asimétricos porque se necesita una clave para cifrar los datos y otra para descifrarlos.

Los algoritmos criptográficos de clave pública utilizan un tamaño de búfer fijo mientras que los de clave secreta usan un búfer de longitud variable. Los algoritmos de clave pública no se pueden usar para encadenar datos juntos en secuencias como sucede con los de clave secreta, ya que sólo pueden cifrarse pequeñas cantidades de datos. Por lo tanto, las operaciones asimétricas no utilizan el mismo modelo de secuencia que las simétricas.

Dos partes (Alicia y Roberto) podrían utilizar cifrado de clave pública del modo siguiente. En primer lugar, Alicia genera un par de claves pública y privada. Si Roberto desea enviar a Alicia un mensaje cifrado, le pide la clave pública. Alicia envía a Roberto su clave pública en una red insegura y Roberto utiliza esta clave para cifrar un mensaje. Si Roberto recibiera la clave de Alicia en un canal inseguro, como una red pública, debería comprobar con ella que tiene la copia correcta de su clave pública. Roberto envía el mensaje cifrado a Alicia y ésta lo descifra utilizando su clave privada.

Sin embargo, durante la transmisión de la clave pública de Alicia, un agente no autorizado podría interceptarla. Además, el mismo agente podría interceptar el mensaje cifrado de Roberto. No obstante, el agente no puede descifrar el mensaje con la clave pública. El mensaje sólo puede descifrarse con la clave privada de Alicia, que no se ha transmitido. Alicia no utiliza su clave privada para cifrar un mensaje de respuesta a Roberto, porque cualquiera que tenga la clave pública podría descifrarlo. Si Alicia desea enviar un mensaje a Roberto, le pide su clave pública y cifra su mensaje con ella. Seguidamente, Roberto descifra el mensaje utilizando su clave privada asociada.

En un caso real, Alicia y Roberto utilizan un cifrado de clave pública (asimétrica) para transferir una clave secreta (simétrica) y utilizan el cifrado de clave secreta para el resto de la sesión.

El cifrado de clave pública tiene un espacio de claves, o intervalo de valores posibles para la clave, mucho mayor y, por lo tanto, es menos susceptible a ataques exhaustivos que prueban cada clave posible. Una clave pública es fácil de distribuir porque no tiene que protegerse. Los algoritmos de clave pública se pueden utilizar para crear firmas digitales con el fin de comprobar la identidad del remitente de los datos. No obstante, los algoritmos de clave pública son muy lentos (comparados con los de clave secreta) y no están diseñados para cifrar grandes cantidades de datos. Son útiles sólo para transferir cantidades muy pequeñas de información. Normalmente, el cifrado de clave pública se utiliza para cifrar la clave y el vector de inicialización que serán utilizados por un algoritmo de clave secreta. Después de transferir la clave y el vector, el cifrado de clave secreta se utiliza para el resto de la sesión.

.NET Framework proporciona las clases siguientes que implementan algoritmos de cifrado de clave pública:

Firmas digitales

Los algoritmos de clave pública también se pueden usar para formar firmas digitales. Las firmas digitales autentican la identidad de un remitente (si se fía de la clave pública de éste) y ayudan a proteger la integridad de los datos. Con una clave pública generada por Alicia, el remitente de los datos de Alicia puede comprobar que ésta los envió si compara la firma digital de los datos de Alicia y la clave pública de ésta.

Para utilizar cifrado de clave pública con el objeto de firmar digitalmente un mensaje, Alicia aplica primero un algoritmo hash al mensaje para crear una síntesis del mismo. La síntesis del mensaje es una representación compacta y única de los datos. Seguidamente, Alicia cifra la síntesis del mensaje con su clave privada para crear su firma personal. Después de recibir el mensaje y la firma, Roberto descifra esta última utilizando la clave pública de Alicia para recuperar la síntesis del mensaje y envía éste de forma aleatoria mediante el mismo algoritmo hash que utilizó Alicia. Si la síntesis del mensaje que calcula Roberto coincide exactamente con la que ha recibido de Alicia, Roberto puede estar seguro de que el mensaje provino del poseedor de la clave privada y de que no se han modificado los datos. Si Roberto confía en que Alicia es la poseedora de la clave privada, sabe que el mensaje proviene de Alicia.

Hay que tener en cuenta que cualquiera puede comprobar una firma, ya que la clave pública del remitente es de dominio público y normalmente se incluye en el formato de firma digital. Este método no mantiene la confidencialidad del mensaje; para que sea secreto, también se debe cifrar.

.NET Framework proporciona las siguientes clases que implementan algoritmos de firma digital:

Valores hash

Los algoritmos hash asignan valores binarios de longitud arbitraria a valores binarios pequeños de longitud fija, denominados valores hash. Un valor hash es una representación numérica, única y muy compacta de un dato. Si aplica un algoritmo hash a un párrafo de texto sin cifrar y cambia sólo una letra del párrafo, el valor hash subsiguiente producirá un valor distinto. Técnicamente es improbable encontrar dos entradas distintas cuyo valor hash sea el mismo.

Las funciones hash de MAC (Message Authentication Code, Código de autenticación de mensajes) se usan normalmente para firmar datos mientras que las funciones hash de MDC (Message Detection Code, Código de detección de mensajes) se emplean para asegurar la integridad de los datos.

Dos partes (Alicia y Roberto) podrían utilizar una función hash del modo siguiente para garantizar la integridad de los datos. Si Alicia escribe un mensaje para Roberto y crea un valor hash de ese mensaje, Roberto podrá calcular el valor hash del mensaje posteriormente y compararlo con el valor hash original. Si los valores hash son idénticos, el mensaje no se alteró, por el contrario, si no lo son, el mensaje fue modificado después de que Alicia lo escribiera. Para que este sistema funcione, Alicia debe ocultar el valor hash original a todos excepto a Roberto.

.NET Framework proporciona las siguientes clases que implementan algoritmos de firma digital:

Generación de números aleatorios

La generación de números aleatorios es propia de muchas operaciones criptográficas. Por ejemplo, las claves criptográficas deben ser lo más aleatorias posible para que no se puedan reproducir. Los generadores de números aleatorios criptográficos deben generar un resultado que, mediante cálculos, no se puedan predecir con una probabilidad mayor que < 0,05; es decir, cualquier método para predecir el siguiente bit del resultado no debe ser más eficaz que el cálculo aleatorio. Las clases de .NET Framework utilizan generadores de números aleatorios para generar claves criptográficas.

La clase RNGCryptoServiceProvider es una implementación de un algoritmo generador de números aleatorios.

Vea también

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft