cal que sigui segura i pràctica
el problema és que el requeriment definit fins ara de confidencialitat incondicional no pot generar
xifrats pràctics
(ja que $\|k\| = \|m\|$)
aquell que, a partir del text xifrat, no permet deduir
cap propietat
del text original en clar,
encara que l'atacant tingui capacitat computacional infinita
habitualment no ens caldrà confidencialitat (o seguretat) incondicional, sino que podem admetre un cert risc de que el sistema/algorisme no sigui confidencial (segur) en front d'un atacant que tingui recursos computacionals finits
aquesta "cessió" la farem a canvi de tenir uns algorismes més pràctics:
$\|k\| \ll \|m\|$
per exemple suposem que tenim $k$ i $m$ de les següents longituds:
$\begin{aligned} \|k\| &= 32 \\ \|m\| &= 8·10^{6} \end{aligned}$
és a dir tenim un nombre de possibles $k$ i $m$:
$\begin{aligned} |k| &= 2^{32} = 4294967296\\ |m| &= 2^{8·10^{6}} = 923234126834\cdots \\ |c| &= 2^{8·10^{6}} = 923234126834\cdots \end{aligned}$
la desproporció entre $|k|$ i $|c|$ fa que només una de les claus ens torni un missatge intel·ligible, per tant, podem saber quina era la clau i el missatge
si la trobem
si l'espai de claus es prou gran ($|k|$) no podrem probarles totes
(Moltes claus
i Vigenère: espai de claus)
podem provar $10^6$ k/CPU/s $\approx 2^{20}$ k/CPU/s
ò $10^{13}$ k/CPU/any $\approx 2^{43}$ k/CPU/any
ò $10^{16}$ k/any amb $1000$ CPU $\approx 2^{53}$ k/any
ò $10^{19}$ k/any amb $10^6$ CPU $\approx 2^{63}$ k/any
$\vdots$
$\vdots$
ò $10^{25}$ claus amb $10^6$ CPU un milió d'anys $\approx 2^{83}$ k
ò $10^{29}$ claus amb $10^6$ CPU des del Big Bang $\approx 2^{96}$ k
$\vdots$
si tinc una "sort mitja" només em caldrà la meitat de proves (e.g. necessitarem "només" la meitat de l'edat de l'Univers per a trobar la clau en l'últim escenari)
i si tinc molta sort...
...la probabilitat de que et toqui la grossa comprant només un número és $10^{-5}$ ($2^{-17}$)
la probabilitat de que et toqui la grossa comprant només un número, $5$ sortejos seguits, és $10^{-25}$ ($2^{-83}$)...
...aquesta és la probabilitat de que trobis la clau per força bruta en un temps negligible
(1 milió d'anys amb 1 milio de CPU's...)
amb hardware ad-hoc podem arribar a multiplicar per $10^4$/$10^5$ vegades
($2^{13}$/$2^{17}$ vegades)
Exemple BitCoin: SHA-256 en hardware massivament paral·lel
En criptografia simètrica farem servir algorismes de xifrat sobre els que el mecanisme més eficient per a un atacant serà provar totes les claus fins trobar la bona
el NIST recomana (2015)
claus que un atacant
hagi de fer $2^{112}$ proves
Més exactament, diu que les claus han de tenir una longitud
$\|k\| = 112$ b, mínim
A partir del 2030 recomanarà $\|k\| = 128$ b, mínim
Security Strength: bits de seguretat o seguretat equivalent
NIST: National Institute of Standards and Technology (EUA)
el NIST recomana les següents longituds de clau (security strength) pels propers anys
l'amença coneguda que pot modificar el calendari és la computació quàntica $\Rightarrow$ AES-256
hi ha dos tipus de xifrat simètric
ambdós els podem veure com una evolució del
bloc d'un sol ús:
És una implementació pràctica dels blocs
d'un sol ús (one-time-pad)
en el cas dels blocs d'un sol ús necessitàvem
$\|k\| = \|m\|$
per a després fer:
$c = k \oplus m$
el que farem és generar $k_{\text{generat}}$...
$\|k_{\text{generat}}\| = \|m\|$
...a partir d'una clau $k$ de longitud curta:
$k \overset{f}{\longrightarrow} k_{\text{generat}}$
per a després fer:
$c = k_{\text{generat}} \oplus m$
$k \xrightarrow{\text{PRNG}} k_{\text{generat}}$
la funció PRNG* és un generador de bits que té com entrada una llavor (que serà la
clau de xifrat $k$) i té com a sortida el flux de bits que aplicarem sobre el missatge per a
xifrar-lo amb XOR
:
$c = k_{\text{generat}} \oplus m$
*) PRNG: Pseudo Random Number Generator
el xifrat anirà tant ràpid com siguem capaços de generar bits de $k_{\text{generat}}$
(ja que la funció XOR
té un cost negligible en
comparació a “$\xrightarrow{\text{PRNG}}$”)
una hipotètica funció PRNG és realment PRNG sii cap atacant pot distingir entre les dues seqüències:
amb una probabilitat rellevantment diferent a $\frac{1}{2}$
*) RNG: Random Number Generator (o TRNG) és un sistema que genera una seqüencia de bits no predible sense caldre cap llavor; no pot ser realitzat de forma algorísmica
Com implementem un RNG si no és algorísmic?
*) HSM: Hardware Secure Module
dedicarem una estona a RNG quant veiem HSM
equivalents als RNG:
Òbviament la segona suposant que no és conegui la
llavor del PRNG (la clau de xifrat)
llavor$|k \xrightarrow{\text{PRNG}}$ seqüència pseudo-aleatòria$|k_{\text{generat}}$
Suposem que tenim una funció PRNG, i fem servir una clau $k$ per xifrar un flux de dades en una connexió (e.g. TLS)
hem de vigilar de no reutilitzar $k \xrightarrow{\text{PRNG}} k_{\text{g}}$, si no:
$\begin{aligned} c_1 &= k_{\text{g}} \oplus m_1 \\ c_2 &= k_{\text{g}} \oplus m_2 \\ c_1 \oplus c_2 &= m_1 \oplus m_2 \end{aligned}$
hem eliminat les claus de l'equació!
canviar de claus a cada transmissió
correcte, però costós (poc pràctic)
generar variacions de les claus a cada transmissió
suposem que tenim una funció
$\begin{aligned} k' &= f(k, r) \\ {k'}_{\text{generat}} &= \text{PRNG}(k') \\ c &= {k'}_{generat} \oplus m \end{aligned}$
i enviem cada $r$ juntament amb cada $c$
correcte i pràctic
en resum: hem de generar un $r$ diferent per a cada missatge
(anomenat nonce)
si tenim una comunicació bidireccional com
HTTPS (TLS) cal:
el xifrat de flux serà tan segur com:
\[ \begin{aligned} X & = \{ a,b,c,d \} \\ Y & = \{ 1,2,3,4 \} \\ \end{aligned} \\ \]
$f(a) = 1 \quad f(b) = 4 \quad f(c) = 2 \quad f(d) = \text{n.d.}$
per tant $f$ no és una funció sobre $X$
(o al menys no és una funció "ben definida" sobre $X$)
\[ \begin{aligned} X & = \{ a,b,c \} \\ Y & = \{ 1,2,3,4 \} \\ \end{aligned} \\ f : X \rightarrow Y \]
$f(a) = 1 \quad f(b) = 4 \quad f(c) = 2$
\[ \begin{aligned} X & = \{ a,b,c \} \\ Y & = \{ 1,2,3,4 \} \\ \end{aligned} \\ f : X \rightarrow Y \\ \]
La funció completa és:
$f(a) = 1 \quad f(b) = 4 \quad f(c) = 2$
e.g. la imatge de $b$ és $4$, la preimatge de $4$ és $b$
Tots els elements d'$Y$ que tenen preimatge segons $f$ és
$Im(f) = \{1,2,4 \}$
tots els elements d'$Y$ tenen preimatge o el que és equivalent: $Im(f) = Y$ (per tant, $|X|=|Y|$)
per tant, la inversa d'$f$ (que simbolitzarem $f^{-1}$) està "ben definida"
la funció inversa de l'anterior $f^{-1}$
tots els elements d'$X$ tenen preimatge
i la inversa d'$f^{-1}$ está (òbviament) "ben definida"
per tant $f^{-1}$ també és bijectiva
\[ \begin{aligned} X & = \{ a,b,c \} \\ \end{aligned} \\ f : X \rightarrow X \]
una permutació és una funció bijectiva d'$X$ sobre sí mateix
podem representar el xifrat amb una permutació $f$
$f : X\rightarrow X$
on $X$ és el conjunt de possibles blocs (tant de text en clar i xifrat)
i podem representar la funció de desxifrat com a la seva inversa $f^{-1}$
$f^{-1} : X\rightarrow X$
és a dir:
$\begin{aligned} c &= f(m) \\ m &= f^{-1}(c) \end{aligned}$
$\begin{aligned} f &: X \rightarrow X \\ f &: \{0,1\}^n \rightarrow \{0,1\}^n \end{aligned}$
si implementem $f$ en una taula amb $2^n$ entrades, ocupem $n·2^n$ bit
si tenim missatges més llargs d'$n$ haurem de segmentar-los en
blocs de mida $n$
aquestes $2^{n}$ entrades (de longitud $n$) les haurem d'escollir de forma aleatòria
de forma que no podrem conèixer $f(x)$ sense conèixer la taula
$\downarrow$
RP: Random Permutation
per exemple, per DES que té una mida de bloc d'$n=64\text{ b}$ ens calen:
$64·2^{64} \text{ b} = 2^{70} \text{ b} = 2^{67}\text{ B} = 2^{37}\text{ GB} = 128\text{ EB}$
... per a cadascuna de les claus $k$
òbviament no és factible implementar els xifrats moderns directament amb una taula indexada
en realitat per a que el xifrat sigui segur necessitarem una "família" de funcions equivalents però diferents. Les indexarem en funció de la clau, $k$:
$\begin{aligned} f_k &: X \rightarrow X \\ f_k &: \{0,1\}^n \rightarrow \{0,1\}^n \end{aligned}$
o també, podem redefinir $f$ i afegir-li $k$ com a paràmetre:
$\begin{aligned} f &: K \times X \rightarrow X \\ f &: \{0,1\}^{\|k\|} \times \{0,1\}^n \rightarrow \{0,1\}^n \end{aligned}$
on $K$ és l'espai de claus $k$ (o conjunt de claus)
igual que per al xifrat de flux ens calia un flux de bits aparentment aleatoris per a qui no tingués la llavor (la clau $k$)...
...per a xifrat de bloc farem servir permutacions pseudoaleatòries (PRP*) en les que la permutació serà aparentment aleatòria per algú que no conegui la clau
això ens permetrà fer xifrats de bloc factibles, intercanviant una quantitat immensa de memòria per una computació abordable
PRP: Pseudo Random Permutation
com en el cas de PRNG, per seguretat cal que les PRP siguin indistingibles de les RP
a més a més cal que tant $f_k$ com $f_k^{-1}$ es puguin calcular de forma eficient
hi ha dues classes de xifrat de bloc
(és a dir, dues maneres d'implementar
PRP)
a partir d'ara farem servir $e()$ i $d()$ en lloc
de les $f()$ i $f^{-1}()$ usades fins ara
per si sols, les 3 classes bàsiques de xifrat de bloc són insegures
però combinant-les podem obtenir seguretat creixent
per a un bloc de longitud $t$ elements, el que fem és fer servir $t$ permutacions $e()$ independents
$m$ | pos1 | pos2 | pos3 | pos4 |
$c=e(m)$ | $f($pos1$)$ | $f($pos2$)$ | $f($pos3$)$ | $f($pos4$)$ |
i simplement: $d$ és la seqüència de permutacions inverses $f^{-1}$
(el xifrat de Vigenère és un tipus de xifrat de substitució polialfabètica)
com en el cas de Vigenère podem recuperar el text original mitjançant anàlisi freqüencial
per a un bloc de longitud $t$ elements, el que fem és moure els mateixos elements entre sí
per exemple, en un sistema amb blocs de 4 lletres una funció $e$ de xifrat podria ser:
$m$ | pos1 | pos2 | pos3 | pos4 |
$c=e(m)$ | pos3 | pos1 | pos4 | pos2 |
i simplement: $d = e^{-1}$
òbviament són insegurs ja que no només la freqüència dels símbols d'entrada és manté, si no que els propis símbols es mantenen (tot i que en posicions modificades)
una composició de $n$ xifrats de bloc, la podem escriure:
$\begin{aligned} c_1 &= e_1(k_1, m)\\ c_2 &= e_2(k_2, c_1)\\ &\vdots\\ c &= e_1(k_n, c_{n-1})\\ \end{aligned}$
cadascuna de les claus $k_i$ pot ser independent, però habitualment és genera en un procés anomenat
expansió de clau:
$k \xrightarrow{\text{PRNG}} \{k_1, k_2, \dotsc, k_n\}$
objectius de la composició:
etapes o rounds: les dues funcions s'agrupen en parelles i s'apliquen diferents cops (amb diferents claus) fins a obtenir un xifrat segur
$c_i = e_1(k_i, c_{i-1})$
Advanced Encryption Standard
AES és un xifrat de bloc amb:
cadascuna de les 10|12|14 etapes es composa de
SubBytes
: substitució de bytes en funció d'una taula fixa de 256 entradesShiftRows
: transposició de bytes fixaMixColumns
: 4
multiplicacions modulars de 4 Byte, valors fixesAddRoundKey
: $\text{bloc} \oplus k_{i}$ (subclau $k_{i}$)això xifra el bloc, i es passa al següent on es fa el mateix canviant la la subclau
SubBytes
(font Wikipedia)
ShiftRows
(font Wikipedia)
MixColumns
(font Wikipedia)
AddRoundKey
(font Wikipedia)
Cadascuna de les etapes (rounds) fa servir una subclau $k_{i}$ diferent
cadascuna de les subclaus $k_{i}$ es deriva de la clau $k$
Nota 1: les subclaus s'apliquen ($\oplus$) "entre" les etapes per tant cal una subclau més que etapes (11|13|15)
Nota 2: calen més etapes en els AES de clau llarga per "aplicar" el major espai de claus sobre el missatge en clar
...l'estadística del missatge en clar apareix a al text xifrat igual que en el xifrat del Cèsar (!)
ara els blocs són de $16$ B, no d'$1$ B per tant l'estadística és menys important
($|\text{bloc}|=2^{128}$), però en seqüències constants
(per exemple, com les d'imatges bitmap) es poden donar blocs sencers idèntics
(font Wikipedia)
aquesta "vulnerabilitat" és una propietat de tots els xifrats de bloc
la contramesura és per tots la mateixa: no xifrar mai bloc a bloc, cal acumular part del xifrat anterior en el bloc actual
aquest encadenament se'n diu mode d'operació
(i no és opcional)
els modes d'operació s'han d'aplicar a tots els xifrats de bloc
si acumulem estat durant el xifrat, podem fer servir aquest estat sobre el xifrat del següent bloc
ECB: Electronic Code-Book
(font Wikipedia)
CBC: Cipher Block Chaining
(font Wikipedia)
OFB: Output Feedback
(font Wikipedia)
CTR: Counter
(font Wikipedia)
els diferents encadenats requereixen d'una llavor incial, prèvia, per començar l'encadenat
això fa que en lloc de transmetre $n$ blocs com en ECB, calgui transmetre'n $n+1$
AES_128_CTR és efectivament un xifrat de flux fent servir AES_128_CTR com a PRNG (sent $k$ la llavor, i l'$IV$ el nonce)
AEAD: Authenticated Encryption with Associated Data
actualment apareixen modes d'operació que a més a més ofereixen MAC aconseguint un rendiment superior a fer servir xifrat + MAC (només lleugerament inferiors al xifrat sol)
els dos exemples més usats i recomanats en l'actualitat són:
Intel, AMD o ARM disposen d'instruccions específiques per a tal d'accelerar el des/xifrat AES (i alguns d'ells també tenen instruccions per a GCM)
Segons l'anàlisi de 戴维 (Wei Dai) els rendiments en implementacions purament software mesurades en Intel Core 2 (2009, MMX/SSE2, 32 b):
bps: bits per segon (ò b/s)
bps: bits per segon
hi ha diversos atacs que permeten realitzar cerques de forma més ràpida que un atac de força bruta
no són rellevants en quan a la seguretat pràctica
aquestes són les vulnerabilitats conegudes...
AES porta des del 2000 públic: això implica un escrutini públic o secret sever
segons els "papers d'Edward Snowden" l'NSA està estudiant-ne les vulnerabilitats (no públicament)
altres "grans" organitzacions és probable que hi dediquin recursos
algorismes quàntics: amb l'algorisme de Grover les cerques en bases de dades no ordenades tenen complexitat $O(2^{b/2})$
(òbviament, en computació clàssica té complexitat $O({2^b})$)
Nota: $b$ són els bits de longitud de la clau AES: $128$, $192$ ò $256$
per tant, es considera que la criptografia simètrica és robusta en front de la computació quàntica...
Data Encryption Standard
16 etapes
insegur, vulnerable a atacs de força bruta
El xifrat és $c = e(k_1, d(k_2, e(k_1, m)))$
per què no doble-DES? o per què no $k=k_1|k_2|k_3$?
atacs Meet in the Middle
suposem que volem ampliar la seguretat de DES xifrant dues vegades amb DES estàndard:
$c = e(k_1, e(k_2, m))$
(condició) suposem que tenim el xifrat d'un bloc $c$, i en sabem el valor en clar $m$ (això no sempre és possible, però és perfectament factible)
$c = e(k_1, e(k_2, m))$
i girem
$e(k_2, m) = d(k_1, c)$
Calculem $x = e(k_i, m) \, \forall i \,$ (cost $2^{56}$)
situem els valors una llista i els ordenem segons $x$ (cost $2^{56}·\log_2{2^{56}}\approx2^{62}$, cost en memòria $2^{56}$)
calculem $x' = d(k_i, c) \, \forall i \,$
mirem si hi ha un $x \overset{?}{=} x'$ (cost 1)
...cost total $\approx2^{62}$ (cost en memòria $2^{56}$)