Red de conocimiento informático - Aprendizaje de código fuente - Los principios y funciones del cifrado de datos y las firmas de datos

Los principios y funciones del cifrado de datos y las firmas de datos

El cifrado puede ayudar a proteger los datos para que no sean vistos ni modificados, y puede ayudar a proporcionar un medio de comunicación seguro a través de canales que de otro modo serían inseguros. Por ejemplo, los datos pueden cifrarse mediante un algoritmo de cifrado, transmitirse en un estado cifrado y luego el destinatario previsto los puede descifrar. Si un tercero intercepta datos cifrados, será difícil descifrarlos.

En un escenario típico donde se utiliza cifrado, ambas partes (Xiao Hong y Xiao Ming) se comunican a través de un canal inseguro. Xiaohong y Xiaoming quieren asegurarse de que cualquiera que esté escuchando no pueda entender sus comunicaciones. Además, dado que Xiaohong y Xiaoming están muy separados, Xiaohong debe asegurarse de que la información que recibe de Xiaoming no haya sido modificada por nadie durante la transmisión. Además, debe asegurarse de que el mensaje sea enviado por Xiao Ming y no por alguien que imite a Xiao Ming.

El cifrado se utiliza para los siguientes fines:

Confidencialidad: ayuda a proteger la identidad o los datos de un usuario para que no sean leídos.

Integridad de los datos: Ayuda a proteger los datos de cambios.

Autenticación: Garantiza que los datos sean enviados desde una parte específica.

Para lograr estos objetivos, se crean esquemas de cifrado utilizando combinaciones de algoritmos y convenciones, llamadas primitivas criptográficas. La siguiente tabla enumera las primitivas de cifrado y su uso.

Las criptoprimitivas realizan transformaciones en los datos mediante

cifrado de clave privada (cifrado simétrico) para que no puedan ser leídos por terceros. Este tipo de cifrado utiliza una única clave secreta compartida para cifrar y descifrar datos.

El cifrado de clave pública (cifrado asimétrico) realiza una transformación de los datos para que no puedan ser leídos por terceros. Este tipo de cifrado utiliza pares de claves pública/privada para cifrar y descifrar datos.

Las firmas criptográficas ayudan a verificar que los datos se originaron en una parte específica mediante la creación de una firma digital que es exclusiva de esa parte. Este proceso también utiliza funciones hash.

El hash criptográfico asigna datos de longitud arbitraria a una secuencia de bytes de longitud fija. Los hash son estadísticamente únicos; diferentes secuencias de doble byte no tendrán el mismo valor.

Cifrado de clave privada

Los algoritmos de cifrado de clave privada utilizan una única clave privada para cifrar y descifrar datos. Dado que cualquier parte que tenga la clave puede usarla para descifrar datos, la clave debe estar protegida de agentes no autorizados. El cifrado de clave privada también se denomina cifrado simétrico porque se utiliza la misma clave tanto para el cifrado como para el descifrado. Los algoritmos de cifrado de clave privada son muy rápidos (en comparación con los algoritmos de clave pública) y son particularmente adecuados para realizar transformaciones criptográficas en flujos de datos más grandes.

Normalmente, se utiliza un algoritmo de clave privada (llamado cifrado de bloque) para cifrar los datos un bloque a la vez. Los cifrados de bloque como RC2, DES, TrippleDES y Rijndael cifran para convertir un bloque de entrada de n bytes en un bloque de salida de bytes cifrados. Si desea cifrar o descifrar una secuencia de bytes, deberá hacerlo bloque por bloque. Debido a que n es pequeño (n = 8 bytes para RC2, DES y TripleDES; n = 16 [predeterminado]; n = 24; n = 32 para Rijndael), los valores mayores que n deben cifrarse un bloque a la vez.

Las clases de cifrado de bloques proporcionadas en la biblioteca de clases base utilizan un patrón de encadenamiento llamado encadenamiento de bloques de cifrado (CBC), que utiliza una clave y un vector de inicialización (IV) para realizar una transformación criptográfica en los datos. Para una clave privada k determinada, un cifrado de bloque simple que no utiliza un vector de inicialización cifrará el mismo bloque de entrada de texto sin formato en el mismo bloque de salida de texto cifrado. Si hay bloques duplicados en la secuencia de texto sin formato, habrá bloques duplicados en la secuencia de texto cifrado. Si un usuario no autorizado sabe algo sobre la estructura del bloque de texto sin formato, puede usar esa información para descifrar un bloque de texto cifrado conocido y potencialmente descubrir su clave. Para superar este problema, la información del bloque anterior se puede mezclar en el proceso de cifrado del siguiente bloque. De esta forma, la salida de dos bloques de texto plano idénticos será diferente. Dado que esta técnica utiliza el bloque anterior para cifrar el siguiente bloque, se utiliza un IV para cifrar el primer bloque de datos.

Al utilizar este sistema, los encabezados de mensajes públicos que podrían ser conocidos por un usuario no autorizado no podrían usarse para realizar ingeniería inversa en la clave.

Una forma de comprometer los datos cifrados con este tipo de cifrado es realizar una búsqueda exhaustiva de todas las claves posibles. Dependiendo del tamaño de las claves utilizadas para realizar el cifrado, dicha búsqueda consumiría mucho tiempo y, por tanto, sería difícil de implementar, incluso con los ordenadores más rápidos. El uso de un tamaño de clave mayor dificultará el descifrado. Si bien, en teoría, el cifrado no imposibilita que un adversario recupere los datos cifrados, sí aumenta significativamente el costo de hacerlo. Si llevaría tres meses realizar una búsqueda exhaustiva para recuperar datos que sólo son significativos al cabo de unos pocos días, entonces el enfoque de búsqueda exhaustiva no es práctico.

La desventaja del cifrado de clave privada es que supone que ambas partes han acordado la clave y el IV y se han comunicado los valores de la clave y el IV entre sí. Además, la clave debe mantenerse en secreto para usuarios no autorizados. Debido a estos problemas, el cifrado de clave privada se utiliza a menudo junto con el cifrado de clave pública para comunicar en secreto la clave y el valor IV.

Suponiendo que Xiaohong y Xiaoming son dos partes que desean comunicarse a través de un canal inseguro, pueden utilizar el cifrado de clave privada de la siguiente manera. Tanto Xiaohong como Xiaoming aceptan utilizar un algoritmo específico (como Rijndael) con una clave y un IV específicos. Xiaohong redacta un mensaje y crea un flujo de red para enviar el mensaje. Luego, cifra el texto usando la clave y IV y envía el texto a través de Internet. Ella no envió la llave ni la vía intravenosa a Xiao Ming. Xiao Ming recibe el texto cifrado y lo descifra utilizando la clave acordada previamente y IV. Si la transmisión es interceptada, el interceptor no podrá recuperar el mensaje original porque no conoce la clave o el IV. En este esquema, la clave debe mantenerse en secreto, pero no es necesario mantener en secreto la vía intravenosa. En un escenario práctico, Xiaohong o Xiaoming generarían una clave privada y pasarían la clave privada (simétrica) a la otra parte mediante cifrado de clave pública (asimétrica). Para obtener más información, consulte la sección sobre cifrado de clave pública más adelante en este tema.

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

DESCryptoServiceProvider

RC2CryptoServiceProvider

RijndaelManaged

TripleDESCryptoServiceProvider

Cifrado de clave pública

El cifrado de clave pública utiliza una clave privada que debe mantenerse en secreto para usuarios no autorizados y una clave pública que puede revelarse a cualquiera. Tanto la clave pública como la privada están relacionadas matemáticamente; los datos cifrados con la clave pública sólo se pueden descifrar con la clave privada, mientras que los datos firmados con la clave privada sólo se pueden verificar con la clave pública. La clave pública se puede entregar a cualquier persona; la clave pública se utiliza para cifrar los datos enviados al titular de la clave privada. Ambas claves son exclusivas de la sesión de comunicación. Los algoritmos de cifrado de clave pública también se denominan algoritmos asimétricos porque se requiere una clave para cifrar los datos y otra clave para descifrarlos.

Los algoritmos de cifrado de clave pública utilizan un tamaño de búfer fijo, mientras que los algoritmos de cifrado de clave privada utilizan búferes de longitud variable. Los algoritmos de clave pública no pueden vincular datos en flujos como los algoritmos de clave privada porque solo pueden cifrar pequeñas cantidades de datos. Por tanto, las operaciones asimétricas no utilizan el mismo modelo de flujo que las operaciones simétricas.

Ambas partes (Xiaohong y Xiaoming) pueden utilizar el cifrado de clave pública de las siguientes maneras. Primero, Xiaohong genera un par de claves pública/privada. Si Xiao Ming quiere enviar un mensaje cifrado a Xiao Hong, le pedirá su clave pública. Xiaohong envía su clave pública a Xiaoming a través de una red no segura, y Xiaoming luego usa la clave para cifrar el mensaje. (Si Xiaoming recibe la clave de Xiaohong en un canal no seguro, como una red pública, Xiaoming debe verificar con Xiaohong que tiene una copia correcta de su clave pública). Xiaoming envía el mensaje cifrado a Xiaohong, y Xiaohong descifra el mensaje usando su clave privada. .

Sin embargo, durante la transmisión de la clave pública de Xiaohong, un agente no autorizado podría interceptar la clave. Además, es posible que el mismo agente haya interceptado mensajes cifrados de Xiao Ming.

Sin embargo, el agente no puede descifrar el mensaje con la clave pública. El mensaje sólo pudo descifrarse con la clave privada de Xiaohong, que no fue transmitida. Xiao Hong no usa su clave privada para cifrar el mensaje de respuesta a Xiao Ming porque cualquiera con la clave pública puede descifrar el mensaje. Si Xiaohong quiere enviar un mensaje a Xiaoming, le pedirá a Xiaoming su clave pública y la usará para cifrar su mensaje. Luego, Xiao Ming usa la clave privada asociada a él para descifrar el mensaje.

En un escenario práctico, Xiao Hong y Xiao Ming utilizan cifrado de clave pública (asimétrica) para transmitir la clave privada (simétrica) y utilizan cifrado de clave privada durante el resto de su sesión.

El cifrado de clave pública tiene un mayor espacio de clave (o rango de valores posibles para una clave) y, por tanto, es menos susceptible a ataques exhaustivos que prueban todas las claves posibles. Como la clave pública no tiene que estar protegida, es fácil de distribuir. Se pueden utilizar algoritmos de clave pública para crear firmas digitales para verificar la identidad del remitente de los datos. Sin embargo, los algoritmos de clave pública son muy lentos (en comparación con los algoritmos de clave privada) y no son adecuados para cifrar grandes cantidades de datos. Los algoritmos de clave pública sólo son útiles para transmitir cantidades muy pequeñas de datos. La criptografía de clave pública se utiliza normalmente para cifrar la clave y el IV que utilizará un algoritmo de clave privada. Una vez transmitidas la clave y el IV, el resto de la sesión se cifra utilizando la clave privada.

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

DSACryptoServiceProvider

RSACryptoServiceProvider

Firma digital

Los algoritmos de clave pública también se pueden utilizar para formar firmas digitales. Las firmas digitales verifican la identidad del remitente (si confía en la clave pública del remitente) y ayudan a proteger la integridad de los datos. Utilizando la clave pública generada por Xiaohong, el destinatario de los datos de Xiaohong puede verificar si Xiaohong envió los datos comparando la firma digital con los datos de Xiaohong y la clave pública de Xiaohong.

Para firmar digitalmente un mensaje utilizando cifrado de clave pública, Xiaohong primero aplica un algoritmo hash al mensaje para crear un resumen del mismo. El resumen del mensaje es una representación compacta y única de los datos. Luego, Xiaohong cifra el resumen del mensaje con su clave privada para crear su firma personal. Al recibir el mensaje y la firma, Xiao Ming usa la clave pública de Xiao Hong para descifrar la firma para recuperar el resumen del mensaje y procesa el mensaje utilizando el mismo algoritmo hash utilizado por Xiao Hong. Si el resumen del mensaje calculado por Xiao Ming es exactamente el mismo que el resumen del mensaje recibido de Xiao Hong, Xiao Ming puede estar seguro de que el mensaje proviene del titular de la clave privada y que los datos no han sido modificados. Si Xiao Ming cree que Xiao Hong es el poseedor de la clave privada, entonces sabe que el mensaje proviene de Xiao Hong.

Tenga en cuenta que, dado que la clave pública del remitente es bien conocida y suele estar incluida en el formato de firma digital, cualquiera puede verificar la firma. Este método no mantiene el mensaje en secreto; para mantenerlo privado, el mensaje también debe estar cifrado.

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

DSACryptoServiceProvider

RSACryptoServiceProvider

Valor hash

El algoritmo hash asigna un valor binario de cualquier longitud a un valor binario más pequeño de longitud fija. Este pequeño valor binario se denomina valor hash. Un valor hash es una representación numérica única y extremadamente compacta de un dato. Si aplica un hash a un fragmento de texto plano y cambia incluso una letra del párrafo, los cálculos hash posteriores producirán valores diferentes. Es computacionalmente imposible encontrar dos entradas diferentes que tengan el mismo valor.

Las funciones hash del Código de autenticación de mensajes (MAC) se utilizan a menudo junto con firmas digitales para firmar datos, mientras que las funciones hash del Código de detección de mensajes (MDC) se utilizan para la integridad de los datos.

Ambas partes (Xiaohong y Xiaoming) pueden utilizar la función hash de la siguiente manera para garantizar la integridad de los datos. Si Xiaohong redacta un mensaje para Xiaoming y crea un hash del mensaje, Xiaoming puede posteriormente codificar el mensaje y comparar su hash con el hash original.

Si los dos valores hash son iguales, el mensaje no se ha cambiado; si los valores no son iguales, el mensaje se ha cambiado después de que Xiaohong lo escribió. Para que este sistema funcione, Xiaohong debe mantener el hash original en secreto para todos excepto para Xiaoming.

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

HMACSHA1

MACTripleDES

MD5CryptoServiceProvider

SHA1Managed

SHA256Managed

SHA384Managed

SHA512Managed

Generación de números aleatorios

La generación de números aleatorios no es posible para muchas operaciones criptográficas Componentes segmentados. Por ejemplo, las claves de cifrado deben ser lo más aleatorias posible para que las claves generadas sean difíciles de reproducir. Un generador criptográfico de números aleatorios debe producir una salida que no pueda deducirse computacionalmente (con una probabilidad inferior a p lt; 0,05; es decir, cualquier método para deducir el siguiente bit de salida no debe tener una probabilidad de éxito mayor que la adivinación aleatoria). Las clases de .NET Framework utilizan generadores de números aleatorios para generar claves de cifrado.

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