Este es el primer post en la parte 3 de la serie acerca de los fundamentos de la criptografía. La serie se describe de la siguiente manera:
- cifrado simétrico
- Data Integrity & cifrado autenticado
- cifrado asimétrico con pares de claves públicas/privadas
sumergirse en el mundo de la informática puede ser una tarea desalentadora. Especialmente sola!, En esta serie de blogs, me gustaría ofrecer una visión general de alto nivel sobre los conceptos básicos de la criptografía para aquellos que buscan profundizar en el tema que no necesariamente saben por dónde empezar. Esta visión general se basa específicamente en mis principales conclusiones del curso de criptografía I de Stanford impartido por Dan Boneh, disponible en Coursera.
decidí tomar este curso ya que soy un desarrollador de blockchain que no provenía de un fondo de comp-sci tradicional. Estudié economía en la universidad, pero viré más hacia la programación informática cuando comencé mi carrera., Desde que empecé a programar, he estado en una misión para estar «más cerca de la computadora» – para quitar las capas de abstracción que disfrutaba como desarrollador web y entender lo que está pasando debajo del capó. La transición a la criptomoneda y los sistemas distribuidos desde el desarrollo web ha sido un paso Salvaje y maravilloso en esa dirección de muchas maneras, no menos importante de las cuales fue familiarizarse más con los conceptos de criptografía. Sin embargo, quería una base más sólida., Ya es todo un vasto campo, pensé que valía la pena pagar $70 para utilizar esta información en un foro especialmente curada de la Universidad de Stanford. También puede auditar este curso sin entregar tareas de forma gratuita. ¡Las maravillas de internet!
comencemos.
esencialmente, la criptografía es la práctica de la comunicación segura en presencia de potenciales adversarios de terceros. El concepto de comunicación segura consta de 2 puntos principales:
- Seguridad contra escuchas: esto garantiza la confidencialidad de los datos.,
- Seguridad contra la manipulación de datos: esto garantiza la integridad de los datos, lo que significa que nadie puede manipular los datos que ha enviado y engañar al destinatario para que acepte los datos manipulados como válidos.
la confidencialidad de los datos se logra a través del cifrado, que puede tomar dos formas: simétrica y asimétrica.
- El cifrado simétrico utiliza una sola clave que debe compartirse entre todos los participantes que se comunican.
- El cifrado asimétrico utiliza claves personales., Cada participante tiene su propia Clave Pública y par de claves privadas para cifrar y descifrar mensajes al comunicarse.
(Nota: Este blogpost hablará sobre criptografía en el contexto del cifrado simétrico. En un post de seguimiento, nos sumergiremos en el cifrado asimétrico.)
cifrado de Datos: dos tipos de cifrados
El cifrado garantiza la confidencialidad de los datos e implica dos componentes importantes:
- Una clave secreta: en el contexto del cifrado simétrico, podemos asumir que nuestros participantes, Alice y Bob, tienen una clave secreta compartida.,
- un cifrado: un conjunto de Algoritmos, uno para cifrado y otro para descifrado.
Es importante tener en cuenta que los Algoritmos de cifrado y descifrado son conocidos públicamente. Lo único que se mantiene en secreto es la llave.
dos tipos de cifrados son cifrados de flujo y cifrados de bloque. Un prerrequisito potencial para comprender adecuadamente ambos cifrados es el conocimiento de las operaciones bitwise (operaciones realizadas en bits). Más específicamente, el concepto de exclusiva-or (XOR). He encontrado este blogpost para dar una explicación muy clara de las operaciones bitwise., O puede tratar de entender el concepto de XOR usando la imagen de abajo. Básicamente dos bits se combinan y si son diferentes (un 0 y un 1) el resultado es 1, y si son los mismos, (0 o 1) de ellos como resultado 0. De aquí en adelante, asumiré que el lector entiende el concepto de XOR y que la notación universal para XOR es:
Stream Cipher
un cifrado de flujo es un cifrado de clave simétrica donde el texto plano (en forma de bytes) es XOR’D bit a bit con la clave (también en forma de bytes) para producir el texto cifrado cifrado., El mismo proceso se utiliza para descifrar el texto cifrado. Dada la naturaleza de la operación XOR, si XOR el texto cifrado con la clave, esto resulta con el texto plano original.
Un astuto lector puede darse cuenta de esta descripción que la clave (marcado en la ilustración de arriba como «sistema de Cifrado de flujo») y el texto debe tener algo muy importante en común. ¡Así es! La clave y el texto plano deben tener la misma longitud., Esto, por supuesto, no es extremadamente práctico.
para hacer un cifrado de flujo más práctico, se introduce la idea de un generador pseudoaleatorio. Un generador pseudoaleatorio es un procedimiento determinista que toma una entrada y produce un resultado pseudoaleatorio aún más largo. Ser un procedimiento determinista significa que siempre devolverá la misma salida exacta si se le da la misma entrada (es decir, «abc123» resulta en «8474f24e0d72e1b949ffd2 every» cada vez)., La palabra pseudorandom significa que mientras que la salida no es realmente aleatoria (ya que se determina en base a una entrada particular), es de hecho indistinguible de una cadena verdaderamente aleatoria. En otras palabras, dada una muestra de entradas y salidas, no hay pistas sobre qué salida corresponde a una entrada en particular y viceversa, por lo tanto, es pseudoaleatorio. Es posible usar la clave secreta compartida como entrada para producir una clave pseudoaleatoria aún más larga para actuar como la clave larga para ser XOR’D con el texto plano igualmente largo.,
esta implementación específica de un cifrado de flujo que hemos ilustrado hasta ahora se llama «one-time-pad». Una característica extremadamente importante del One-time-pad es que la tecla one-time-pad solo se puede usar una vez. Una vez que se utiliza por segunda vez, la seguridad de estos mensajes se ve comprometida.
en la imagen de abajo hay una diapositiva del curso. PRG (K) denota la secuencia pseudoaleatoria generada a partir de nuestra clave compartida K. el símbolo den denota XOR. c denota texto cifrado. m denota mensaje (o texto plano).,
Básicamente, esta diapositiva es decir que una vez que la tecla se usa dos veces, podemos XOR la ciphertexts juntos, y que es exactamente igual a XOR ing las dos plaintexts juntos. Dado que hay suficiente redundancia en inglés, Un atacante inteligente puede usar esta información para recuperar los mensajes por completo.
para mantener una clave secreta compartida, se puede usar el concepto de nonce para garantizar que nunca repitamos la clave del pad de una sola vez., Un nonce es un número arbitrario que se puede usar solo una vez en una comunicación criptográfica. Al enviar el texto cifrado, el remitente también puede enviar un nonce over para combinarlo con la clave secreta y luego usarlo como entrada para producir una clave pseudoaleatoria distinta para cada cifrado.
(es posible que haya notado que la diapositiva de arriba dice ataque 1., Como un lado, para aquellos que se preguntan Qué es el ataque 2, El Ataque 2 es el hecho de que mientras que stream cipher ofrece confidencialidad de datos, no proporciona integridad de datos como se define en la primera sección)
Block Cipher
el segundo tipo de cifrado es un cifrado por bloques. Un cifrado por bloques toma una entrada de longitud fija y cifra iterativamente el texto plano una y otra vez usando una clave diferente (una «clave redonda») para cada ronda y, en última instancia, genera un texto cifrado de la misma longitud. 3DES y AES son dos ejemplos de cifrados de bloque que toman una entrada de 48 bits y 128 bits respectivamente.,
La diapositiva anterior se muestra la arquitectura básica de un sistema de cifrado de bloque. Se puede ver que un mecanismo de expansión de clave se utiliza para tener una nueva clave para cada ronda. El texto plano, denotado (m) Para mensaje, se encripta una y otra vez hasta que finalmente se devuelve el texto cifrado correspondiente (c) de la misma longitud.
en aras de la brevedad, cubriré AES en este blogpost., Aunque DES/3DES es históricamente significativo, hoy en día el AES es más ampliamente utilizado y aceptado.
AES es construido como una Sustitución de Permutación de la Red. AES opera en un bloque de 128 bits, igual a 16 bytes. Como se muestra arriba en la parte superior izquierda, escribimos los 16 bytes como una matriz de 4 por 4. Esta matriz sirve como una estructura de datos buena para barajar datos., En cada ronda, el proceso es el siguiente:
- XOR la clave de la ronda, primero (k0), con el mensaje actual
- Luego pasamos por un proceso de sustitución donde los bloques de datos se reemplazan con otros bloques basados en una tabla de sustitución dada (en la imagen anterior (1) ByteSub).
- pasamos por una capa de permutación donde los bits se permutan y se barajan (en la imagen superior (2) ShiftRow & (3) MixColumn).
- luego repetimos este proceso durante 10 rondas.,
en la imagen anterior, notará que la última ronda se salta el paso de la columna de mezcla, XOR es el resultado con nuestra clave de ronda final y produce nuestro texto cifrado resultante. Para descifrar, simplemente invertimos el proceso. El curso ofrece una visión general de alto nivel de este proceso de cifrado y alienta a los estudiantes a profundizar en él si es de Su interés. Por lo tanto, dejaré el funcionamiento interno de AES en esto. Recomendaría a la gente mirar en el procedimiento de red Fiestel de 3DES para una divertida comparación y contraste de diferentes cifrados de bloque.,
en términos de hardware, desde el lanzamiento de Intel Westmere, Intel ha diseñado sus procesadores con instrucciones especiales para la optimización AES integradas directamente en su hardware y AMD siguió su ejemplo poco después.
modos de operación de cifrado por bloques
a diferencia de un cifrado de flujo, un cifrado por bloques solo toma una entrada de longitud fija. Obviamente queremos manejar datos que son más grandes que 16 bytes a la vez. Así que a continuación es importante entender los modos de operación bajo los cuales podemos utilizar cifrados de bloque para cifrar grandes conjuntos de datos., Para aplicar este cifrado por bloques a un conjunto de datos grande, el primer modo de operación que puede venir a la mente se llama «Electronic Code Book» (ECB). ECB simplemente divide los datos en bloques de 16 bytes y realiza el cifrado AES de manera uniforme. Incluso podría hacerse en paralelo. Muy rápido! Pero en realidad no es muy seguro.
Es inseguro porque si una de 16 bytes del mensaje se repite, el texto cifrado también se han repetido los datos., Esto divulga información sobre nuestros datos a un atacante potencial. Podemos aplicar esta vulnerabilidad al caso en el que estamos cifrando una imagen con ECB. Como se puede ver a continuación, está claro que nuestra imagen es un tiro en la cabeza. En la zona muy negra, podemos ver una silueta a través del pelo oscuro y la camisa.
Es importante que nuestros esquemas de cifrado son semánticamente seguro., La seguridad semántica es el concepto de que si tenemos un texto cifrado que corresponde a uno de dos textos planos diferentes, un adversario no puede adivinar con mejor probabilidad que 1/2 a qué texto plano corresponde el texto cifrado. Claramente, el BCE no es semánticamente seguro. Nuestra imagen cifrada nos da mucha información para adivinar su imagen normal correspondiente.
ECB es un ejemplo de un modo de operación de Clave Única (lo que significa que, al igual que el teclado único, una clave solo se puede usar una vez). Otro modo de operación de una sola tecla más seguro es el modo de contador determinista. Usted es libre de investigarlo por su cuenta., Voy a pasar a los modos seguros de operación que permiten muchas teclas de tiempo!
el encadenamiento de bloques de cifrado (CBC) es un modo de operación que encadena cada bloque de 16 bytes de texto plano a través de XOR’ining el texto cifrado del texto plano anterior en nuestro texto plano actual antes de realizar el cifrado de cifrado de bloque (es decir, AES). La imagen de abajo aclara este concepto:
primero vamos a empezar con una muestra aleatoria de IV., IV significa vector de inicialización que se puede definir como: el valor inicial utilizado para iniciar algún proceso iterado. En el caso de CBC, el IV debe ser aleatorio (por lo tanto impredecible) por lo tanto debe ser único para cada transacción. El primer bloque del texto cifrado es simplemente el IV Aleatorio no cifrado. para producir el resto del texto cifrado, primero, el IV aleatorio es XOR con el primer bloque de texto plano (m). El resultado se encripta con la tecla redonda k para devolver el primer bloque de texto cifrado cifrado (c)., Ese texto cifrado luego obtiene XOR’D con el siguiente bloque de texto plano (m), el resultado se cifra con la clave redonda k y devuelve el segundo bloque de texto cifrado cifrado (c). El proceso continúa hasta que todos los bloques hayan sido encriptados.
A descifrar, que acaba de invertir el proceso.
un componente importante del cifrado CBC es que el IV aleatorio es impredecible., Si el IV se vuelve predecible, entonces nuestro esquema de cifrado se vuelve vulnerable a los ataques de texto plano elegidos. Chosen Plaintext Attack (CPA) es un modelo de ataque que presume que el atacante puede obtener textos cifrados para textos planos arbitrarios, y usarlos para revelar información sobre mensajes cifrados. Por lo tanto, se necesita un IV impredecible para garantizar la seguridad de la CPA.
tenga paciencia conmigo mientras trato de explicar cómo funcionaría este ataque: es posible realizar un ataque de texto plano elegido en presencia de IV predecibles debido a la naturaleza de XOR., Si XOR el mismo valor juntos (0101 0 0101) siempre será igual a 0, por lo tanto, se cancela. Así que si sospecha que un texto cifrado observado C corresponde a un texto plano particular m, puede probar su hipótesis con un IV predecible. si el texto plano en cuestión se cifró con IV1 tal que c = E(k, m IV IV1) puede enviar un nuevo texto plano para ser cifrado y ver si obtiene un resultado coincidente: C. ya que puede predecir que el IV será IV2, envíe m IV IV1 IV IV2., El proceso CBC XOR esta entrada con el siguiente IV, IV2 tal que: c = E(K, M IV IV1 IV IV2 IV IV2) por lo tanto IV2 se cancela, y una vez más estamos cifrando E (K, IV1 m m) lo que resultaría una vez más con c y si esto sucede, fuimos capaces de adivinar lo que se cifró PREVIAMENTE CON IV1.
trabajo realmente impresionante si tienes a través de eso – ^
con eso, me gustaría revisar un modo de operación de cifrado por bloques más que concluirá el primer blogpost en esta serie de 3 partes. Si ha sido un gran esfuerzo para llegar hasta aquí, ahora podría ser un buen momento para un descanso rápido antes de Continuar!,
Ok, así que hemos revisado ECB, CBC, y sus vulnerabilidades, pero por último, y probablemente lo más importante voy a introducir el modo contador Aleatorio (CTR). Este es el modo de operación más reciente y seguro, y también es más eficiente que el CBC.
Aleatorizado Modo de Contador, también toma una al azar IV. El IV sirve para un propósito diferente aquí, sin embargo. Nuestra clave se combina (E. G., vía AES) con una versión iterada nuestro IV: arriba seguimos agregando 1 a nuestro IV para cada iteración, o de lo contrario obtendríamos un resultado repetido. Hacemos esto hasta que tengamos un pad tan largo como nuestro mensaje de texto plano. Al igual que el cifrado de flujo de pad de una sola vez, ahora XOR nuestro mensaje de texto plano con nuestro pad pseudoaleatorio para dar como resultado un texto cifrado. Si su hardware tiene varios motores AES, esto es ultra eficiente porque es paralelizable. En CBC, cada texto cifrado dependía del bloque anterior de texto cifrado, por lo que era imposible paralelizarlo.,
ni siquiera necesitamos necesariamente un cifrado por bloques para combinar nuestro IV y clave en un pad pseudoaleatorio. Los cifrados en bloque deben ser reversibles. Si observa de cerca la mecánica del modo contador Aleatorio, notará que el descifrado no requiere que revierta F(k, IV)
. Dada la naturaleza de XOR, todo lo que necesitamos hacer es regenerar el mismo pad pseudoaleatorio y XOR con nuestro texto cifrado. Por lo tanto, para descifrar, debemos repetir la operación, no revertirla.,
abstractamente hablando (hasta ahora he evitado conceptos abstractos), eso significa que el procedimiento que usamos para combinar nuestra clave secreta y IV F(k, IV)
debe ser una función pseudoaleatoria (PRF) en lugar de una permutación pseudoaleatoria (PRP). De hecho, hemos estado aplicando estos conceptos a lo largo de este blogpost. Tanto los PRP como los PRF son procedimientos deterministas que, dada una entrada particular, resultan en una salida pseudoaleatoria. (es decir, AES, XOR). Sin embargo, un PRP es más estricto en el sentido de que debe ser reversible., De hecho, los Términos PRP y block cipher (como AES) se usan a menudo como sinónimos. Sin embargo, un PRF no necesita ser reversible. Si vuelves a las diapositivas anteriores mostradas en este post, ahora entenderás la notación PRF y PRP.
que concluye mi visión general de cifrado simétrico! Cubrimos cifrados de corriente y cifrados de bloque. Luego, dado que los cifrados de bloque solo se pueden realizar en aproximadamente 16 bytes a la vez, cubrimos los modos de operación utilizados para realizar cifrados de bloque en textos planos grandes. También aclaramos los conceptos de PRP vs PRFs.