La NSA selecciona un algoritmo de cifrado de IBM para comunicaciones de la administración: DES (Data Encryption Standard)
Whitfield Diffie y Martin Hellman generan el primer algoritmo práctico de criptografía asimétrica
Hasta los '70 la criptografía servía para dificultar que un tercero pudiera discernir lo que se envía (confidencialidad)
$c = e(k,m)$
un mensaje $m$ (plain-text) se cifra con la función de cifrado $e()$, que se
le pasa junto a una clave $k$ para dar el mensaje
cifrado $c$ (cipher-text)
$m = d(k,c)$
para descifrar hace falta la clave $k$ y el mensaje cifrado $c$ a la función de descifrado
$m=d(k,c)$
El resultado $m$ es el mensaje en claro de vuelta
Hasta los '70 la criptografía o era "insegura" o no era "práctica"
Cambiamos cada letra de un mensaje, por una letra alternativa del alfabeto
Por ejemplo, para $k=3$
la función de cifrado $e(3,m)$ genera la siguiente tabla:
$m$ | $c$ | |
A | $\rightarrow$ | X |
B | $\rightarrow$ | Y |
C | $\rightarrow$ | Z |
D | $\rightarrow$ | A |
E | $\rightarrow$ | B |
... | ... |
Giremos la tabla
$c$ | $m$ | |
A | $\rightarrow$ | D |
B | $\rightarrow$ | E |
C | $\rightarrow$ | F |
D | $\rightarrow$ | G |
E | $\rightarrow$ | H |
... | ... |
HOLAMUNDO
ELIXJRKAL
¿qué podemos hacer si tenemos acceso al texto cifrado ELIXJRKAL
?
$0 < k < 26 \implies $ podemos hacer un ataque de fuerza bruta
si el mensaje es suficientemente largo, podemos analizar la frecuencia de aparición de los carácteres
$0 < k < 26 \implies $ podemos hacer un ataque de fuerza bruta
Un ataque de fuerza bruta implica probar sobre el mensaje cifrado $c$ todas las posibles claves $k_i$ hasta que encontremos la "buena":
el segundo paso no siempre es posible
exige que el espacio de mensajes contenga mensajes válidos (pocos) y mensajes inválidos (muchos)
hace falta redundancia
que en el ejemplo anterior la redundancia la tenemos ya que no cualquier combinación de carácteres genera "palabras" comprensibles
una contramedida contra el ataque de fuerza bruta contra el cifrado del César es minimizar la redundancia de los mensajes (compresión, etc.)
el primer punto implica conocer el algoritmo de
(des)cifrado $d(\circ,\circ)$
Principio de Kerckhoffs: siempre supondremos que un atacante conoce $d(\circ,\circ)$
la única cosa que no debe conocer es la clave $k$
Las contramedidas contra los ataques de fuerza bruta son:
que la operación sea costosa tiene el problema que quien descifra lícitamente tiene un coste innecesario: actualmente esto no se recomienda
que el atacante esté obligado a probar muchas claves
en una CPU "estándar" se prueban $1.000.000$ clave/CPU/s
es decir: $10^6$ clave/CPU/s
es decir: se prueban $10^{9}$ clave/s en $1000$ CPU
es decir: se prueban $3,6·10^{12}$ clave/h en $1000$ CPU
en AWS EC2 una c4.large cuesta 10 céntimo/h
es decir $3,6·10^{11}$ clave/€
si tenemos capacidad de diseñar/fabricar $d(\circ,\circ)$ en hardware (ASIC) los costes bajan después de un periodo de amortización
$10^{11}$ clave/€ en números redondos
e.g. si nuestro "secreto" tiene un coste de 1000 €,
nos hacen falta $2·10^{14}$ claves diferentes ($\approx2^{48}$)
$2^{1} = 2$ | $10^{0.301\cdots} \approx 2$ |
$2^{2} = 4$ | |
$2^{3} = 8$ | |
$2^{3.322\cdots} \approx 10$ |
$10^{1} = 10$ |
$2^{4} = 16$ | |
$2^{10} = 1.024$ | $10^{3} = 1.000$ |
$2^{20} = 1.048.576$ | $10^{6} = 1.000.000$ |
$2^{30} = 1.073.741.824$ | $10^{9} = 1.000.000.000$ |
$2^{40} $ | $10^{12} $ |
$2^{50} $ | $10^{15} $ |
$2^{60} $ | $10^{18} $ |
$\begin{aligned} 2^{x} &\longrightarrow 10^{\frac{\log(2)}{\log(10)} x} \\ 2^{\frac{\log(10)}{\log(2)} y} &\longleftarrow 10^{y} \end{aligned}$
$\begin{aligned} \frac{\log(2)}{\log(10)} &= 0.301\cdots \\ \frac{\log(10)}{\log(2)} &= 3.322\cdots \end{aligned}$
HOLAMUNDO
ELIXJRKAL
¿qué podemos hacer si tenemos acceso al texto cifrado ELIXJRKAL
?
$0 < k < 26 \implies $ podemos hacer un ataque de fuerza bruta
si el mensaje es suficientemente largo, podemos analizar la frecuencia de aparición de los carácteres
la estadística se mantiene en textos diferentes
¡la estadística se mantiene inalterada después del cifrado!
podemos aprovechar que la estadística se mantiene
para poder encontrar la clave $k$
Similar al cifrado del César, pero $k$ ahora será una secuencia de números en lugar de un sólo número (e.g. antes $k=3$):
e.g. $k = \{3,18,23\}$
Nota: habitualmente se escriben las letras corresponendientes a los números: $k = \{\text{X},\text{I},\text{D}\}$
ejemplo:
HOLAMUNDO
XIDXIDXID
EWOXUXKLR
Ahora el espacio de claves es (clave de $3$ carácteres):
$\begin{eqnarray} 0 & < k & < {26}^{3} \\ 0 & < k & < 17576 \end{eqnarray}$
no cuesta mucho incrementar el espacio de claves utilizando
"contraseñas" más largas
en general, para $n$ carácteres:
$0 < k < {26}^{n}$
e.g. $n=8 \implies 26^{8} = 2·10^{11}$ (0,50 €)
e.g. $n=12 \implies 26^{12} = 10^{17}$ (200.000 €)
e.g. $n=16 \implies 26^{16} = 4·10^{22}$ (0,1 B€)
Si segmentamos el texto cifrado de acuerdo a la longitud de la contraseña, cada fragmento de texto mostrará las mismas estadísticas del idioma...
sólo hace falta saber la longitud de la "contraseña" o...
...como el espacio de longitudes será probablemente limitado, podemos probarlos uno por uno hasta que tenemos una estadística reconocible
un espacio de claves grande no es suficiente
en general, seguridad incondicional
a partir del texto cifrado, no se puede deducir
ninguna propiedad*
del texto original en claro,
aunque el atacante tenga capacidad computacional infinita
*) a parte de la longitud
*) a parte del momento de enviarlo
*) a parte del número de mensajes
*) a parte de la latencia de la respuesta
(responsabilidad del protocolo)
sí,
y fue inventada y patentada por Vernam en 1917
y fue demostrada su "perfección" por Shannon en 1945
el cifrado de Vigenère sufría un problema similar al del César:
manifestaba la estadística del mensaje en claro
en el mensaje cifrado
podemos evitar que se manifieste la estadística en el texto cifrado, si utilizamos cada letra de la contraseña una sola vez
tenemos confidencialidad perfecta sii usamos Vigenére con una contraseña tan larga como el mensaje y no conocida por el atacante (aleatoria)
Vernam definió el one-time-pad de una manera similar (pero equivalente)
La función de cifrado $c = e(k, m)$ se implementa:
$e(k, m) = k \oplus m$
donde $\|k\| = \|m\|$
Nota:
$\oplus$ es la or-exclusiva o XOR
$\|\circ\|$ es la longitud en bits de $\circ$
XOR
$0 \oplus 0 = 0$
$0 \oplus 1 = 1$
$1 \oplus 0 = 1$
$1 \oplus 1 = 0$
XOR
$\cdots00000\cdots \oplus \cdots00000\cdots = \cdots00000\cdots$
$\cdots10010\cdots \oplus \cdots11000\cdots = \cdots01010\cdots$
$\cdots11111\cdots \oplus \cdots11000\cdots = \cdots00111\cdots$
$\cdots00011\cdots \oplus \cdots11100\cdots = \cdots11111\cdots$
$\cdots10101\cdots \oplus \cdots01010\cdots = \cdots11111\cdots$
etc.
"$e(k, m) = k \oplus m$
donde $\|k\| = \|m\|$"
se traduce en, por ejemplo:
$\begin{aligned} m &= 10011001 \\ k &= 01010101 \\ c &= 11001100 \end{aligned}$
$d(k, c) = k \oplus c$
es fácil demostrar que funciona ya que:
$\begin{aligned} m &= d(k, c) \\ m &= d(k, e(k, m)) \\ m &= k \oplus c \\ m &= k \oplus (k \oplus m) \\ m &= (k \oplus k) \oplus m \\ m &= \{0\}^{\|k\|} \oplus m \\ m &= m \end{aligned}$
"$e(k, m) = k \oplus m$
donde $\|k\| = \|m\|$"
se traduce en, por ejemplo:
$\begin{aligned} m &= 10011001 \\ k &= 01010101 \\ c &= 11001100 \end{aligned}$
clica sobre la imagen y abre el fichero con Gimp
mira que está compuesto por dos capas (Ctrl+L
):
la clave $k$ y el mensaje $m$ combinadas con substract (XOR
)
Shannon demostró que los bloques de un solo uso son "perfectos", y además demostró que la longitud en bits de la clave $k$:
$\|k\| \geq \|m\|$
y por tanto, que los bloques de un solo uso hiciesen servir
$\|k\| = \|m\|$
era la manera más eficiente de obtener confidencialidad perfecta
todos los mensajes posibles se pueden obtener dada la clave apropiada a partir de un bloque cifrado $c_i$
$
\begin{aligned}
m_{ai} &= d(k_a, c_i) \\
m_{bi} &= d(k_b, c_i) \\
m_{ci} &= d(k_c, c_i) \\
& \quad \vdots
\end{aligned}
$
cada clave aplicada a $c_i$ me dará todos los mensajes posibles de $\|m\|$ bits
($\|m\| = \|k\|$ combinaciones)
un atacante no puede aprender nada a partir de $c_i$
$\Downarrow$
la confidencialidad es “perfecta”
cero (incluso es invulnerable a los ataques de fuerza bruta)...
...mientras se cumplan las hipótesis de trabajo:
Hasta los '70 la criptografía o era "insegura" o no era "práctica"
$\|k\| = \|m\|$
cuesta tanto acordar $k$ de forma segura, como enviar directamente $m$ en claro por el mismo canal seguro
El teléfono rojo entre Washington y Moscú fue en realidad un teletipo que usaba cifrado de bloque de un solo uso
La clave $k$ se intercambiaba por valija diplomática en cinta perforada que se entregaba en ambos sentidos. Mientras no hacía falta, se guardaba protegida. Y se destruía después de ser usada
En este caso la clave se acordaba/se preparaba por adelantado para cuando hiciera falta enviar algún mensaje poderlo hacer de forma inmediata
Además, el one-time-pad permitía trabajar de forma segura sin intercambiar ningún algoritmo secreto que diera ventaja técnica al enemigo