Criptografia
 

Criptografía y Criptoanálisis
 

Criptología = Criptografía + Criptoanálisis
Etimológicamente criptología quiere decir escritura secreta. Actualmente tiene el significado de ciencia de la comunicación segura, su objetivo es que dos partes puedan intercambiar información sin que una tercera parte no autorizada, a pesar de que capte los datos, sea capaz de descifrar la información. La criptografía actúa mediante criptosistemas; un criptosistema o sistema cifrado es un sistema que permite cifrar los mensajes de tal forma que una persona no autorizada no pueda descifrar el mensaje. La criptografía es la ciencia de diseñar criptosistemas.
El criptoanálisis trata de romper los criptosistemas para apoderarse de la información cifrada.
Criptosistemas Clásicos(Simétricos)
Un criptosistema clásico está formado por un quinteto de conjuntos (P, C, K, E, D), donde:
P es un conjunto finito cuyos elementos se llaman ?textos claros? (plain text), estos serían los mensajes que se quieren enviar tal cual.
 
C es un conjunto finito cuyos elementos se llaman ?criptotextos?, esto sería lo que resulta una vez que la información se cifra.
 
K es un conjunto finito cuyos elementos se llaman ?claves? (keys).
 
E = {Ek / k pertenece K} donde Ek : P --> C, Ek --> transformaciones criptograficas
 
D = {Dk / k pertenece K} donde Dk : C --> P, cumpliendo que Dk(Ek(x)) = x para todo x peteneciente a P.


                                               c
        p-->  c = Ek(p) ------------------------------>  p = Dk(c) --> p

Esto se basa en que las 2 partes se ponen de acuerdo en la clave y en mantenerla secreta.

La clave k da las transformaciones Ek y Dk.
 
Un criptoanalista intercepta c pero como no conoce la clave k no es capaz de recuperar p. Cualquier persona que conozca la clave k puede descifrar el mensaje. La clave debe intercambiarse por un canal seguro y además el conjunto de las claves debe ser enorme.
Este criptosistema se llama simétrico ya que el conocimiento de la clave permite las operaciones de cifrar y descifrar.

a --> 0
b --> 1
.
.
z --> 26
z27 --> Alfabeto

1-P = C = K = Z27
Para cada k perteneciente a Z27

Ek(x) := x + k (mod 27) para x perteneciente a Z27
Dk(x) := x - k (mod 27) para x perteneciente a Z27

k=3

E3(CESAR) = FHVDQ
E3(ZAMORA)=CDORUD

Este sistema se conoce como cifra de César. Como sólo hay 27 posibles claves se prueban todas las posibles claves hasta que se encuentra la correcta.
2-P = C = Z27
K = S27 = {d: Z27 --> Z27 / d es biyectiva(permutacion)}      ***** d es delta *****

Ed(x) := d(x)   para todo x perteneciente a Z27
Dd(x) := d-1(x)   para todo x perteneciente a Z27
|K| = 27! > 1028

El que |K| sea tan grande implica que este criptosistema no se pueda analizar a lo bruto.

Este criptosistema se llama criptosistema de sustitución.
 
Principio de Kerchhoff: El criptoanalista conoce el criptosistema que se usa.
 
Este criptosistema es fácilmente analizable. Su debilidad es el análisis de frecuencias, esto es debido a la redundancia inherente de los lenguajes naturales. Cada lenguaje natural tiene una distribución de frecuencias del alfabeto que es característica; por
ejemplo, en castellano:
e --> 14.75 %
a --> 13.25 %
Cualquier idioma tiene una distribución de frecuencias característica.
Se compara la distribución de frecuencias del texto claro con la distribución de frecuencias de los símbolos del criptotexto.
También se puede hacer una análisis de frecuencias de pares de letras consecutivas, de ternas de letras...
 
Estos dos criptosistemas son criptosistemas de sustitución monoalfabética, la transformación sustituye una letra por otra, pero siempre es la misma.
 
Criptosistema afín.
P = C = Z27
K = {(a,b) perteneciente a Z27 x Z27 / mcd (a,27) = 1}
Si k = (a,b)
 
Ek(x) := ax+b (mod 27)   para todo  x perteneciente a Z27
Dk(x) := a-1(x-b) (mod 27)   para todo  x perteneciente a Z27
 
a se toma primo con 27 para que tenga inverso en Z27. En este caso |K| = 27 · 29. Este es un subsistema del caso anterior.
Se diseñaron los sistemas polialfabéticos en los que cada símbolo del alfabeto se sustituye por otro pero dependiendo de la posición de la letra se cambia por una letra u  otra, así analizando la distribución de símbolos en el criptotexto no permite descifrar el mensaje.
Criptosistemas de sustitución monoalfabética -> Análisis de frecuencias
 
Criptosistemas Polialfabéticos:
 
Ejemplo:
Cifra de Vigêner
P = C = K = (Z27)m, con m perteneciente a Z27, m distinto de cero
k perteneciente a K, k = (k1, k2,...,km) con ki perteneciente a Z27

Ek(x1....xm) = (x1+k1, x2+k2, ....,xm+km) ( mod 27)
Dk(x1....xm) = (x1-k1, x2-k2, ....,xm-km) ( mod 27)

Consideramos una sucesión periódica de desplazamientos. El primer símbolo se desplaza k1 posiciones, el segundo k2 posiciones y así hasta el último y luego repetimos el proceso para los siguiente m símbolos.

k = VIGENERE , m = 8

k = (22, 9, 7, ...)
MENSAJE SECRETO se cifraría como:
m --> 13 --> (13 + 22) (mod 27) = 8
e --> 5   -->  (5 + 9) (mod 27) = 14
n --> 14 -->  (14 + 7) (mod 27) = 21

El criptotexto ya no se puede analizar mediante el análisis de frecuencias. Esta cifra perduró durante siglos, hasta que en el s. XIX se descifró. Se debe aplicar el Test de Kasiski: En los textos hay palabras que se repiten a menudo y si la distancia entre partes iguales del texto es múltiplo de m entonces se van a cifrar de la misma forma. Se buscan estas coincidencias a lo largo del texto. Al conocer la longitud de la palabra se puede aplicar análisis de frecuencias sobre los símbolos en las posiciones congruentes módulo m.

Shanonn demostró que se puede encontrar un criptosistema incondicionalmente seguro, esto es aunque el criptoanalista disponga de infinitos recursos de computación y de infinito tiempo no va a poder descifrar el criptosistema.

Cifra de Vernam:

m >= 1

P = C = K = (Z2)m
k perteneciente a Z2m , k = (k1, k2,?.km)
Ek(x1....xm) = (x1+k1, x2+k2,?.xm+km) (mod 2)
Dk(y1....ym) = (y1+k1, y2+k2,?.ym+km) (mod 2)
Este criptosistema tiene seguridad incondicional. En este caso la longitud de la clave es igual a la longitud del texto.
Si generamos una clave aleatoria todas las sucesiones de m bits son igualmente probables. Este sistema se denomina one-time pad; la clave sólo se usa una vez. Este sistema en la práctica sirve de poco ya que genero una clave de igual tamaño que lo que queremos transmitir, pero en criptosistemas simétricos ambas partes deben conocer la clave y debe haber un canal seguro por el que se puedan transmitir los m bits de la clave, pero si podemos hacer esto entonces podemos transmitir los m bits del texto sin cifrar por este canal seguro.
DES (Data Encrytion Standart):
 
Fue diseñado en USA(70) con la idea de que fuese un estándar y fuese usado por las empresas en las transacciones. Fue criticado ya que usa una clave secreta de 64 bits, pero de éstos sólo 56 son la clave ya que hay 8 bits de control (corrección de errores).Este sistema no ofrecía seguridad suficiente. El espacio de claves es enorme pero con ordenadores potentes se puede encontrar la clave.
AES (Advanced Encryption Standart):
Este criptosistema es mucho más avanzado que el anterior y está en fase de proyecto.
Todos los criptosistemas clásicos se han ido rompiendo.
 
Problemas fundamentales de los criptosistemas clásicos:
    - El problema de la seguridad (Shanonn 1949, Bell System Journal). Shanonn dio una definición de lo que es la seguridad de un criptosistema; definió la seguridad incondicional, ésta se establece cuando un criptosistema es seguro con independencia de los medios disponibles (infinita potencia de cálculo). Si un criptosistema es incondicionalmente seguro no se puede romper. Se demostró la existencia de criptosistemas de seguridad incondicional (cifrar de Vernann) aunque d.p.v práctico no tienen utilidad. Los criptosistemas más modernos se basan en la seguridad computacional. La idea es considerar un criptosistema computacionalmente seguro cuando aunque haya un algoritmo que rompa el sistema éste requiera un tiempo de computación tan grande que sea inviable llevarlo a la práctica.
    - El problema del manejo y distribución de claves. Los criptosistemas clásicos son de clave secreta, cualquiera que conozca la clave puede descifrar la información. Estos criptosistemas son vulnerables aunque no se sepa como criptoanalizarlos si se intercepta la clave secreta.
    - El problema de la autentificación. Los criptosistemas convencionales no proporcionan ningún método para que el receptor del mensaje pueda tener la seguridad de que quien envió el mensaje es quien debería haberlo enviado y no una tercera parte. El mensaje podría ser alterado y no se podría saber si esta situación se ha producido.
Criptografía de Clave Pública
En un criptosistema clásico hay un espacio de claves y para cada clave k hay una  función Ek de encriptación y otra Dk de desencriptación. Cualquier persona que conozca k conoce Ek y Dk; pero además si se conoce Ek se conoce Dk y viceversa; así k, Ek y Dk deben ser secretas.
En 1976 se trató de buscar un criptosistema en el cual el conocimiento de cómo encriptar no implicase el conocimiento de cómo desencriptar. Esto permite usar un criptosistema en el cual Ek fuese pública pero no fuese factible calcula Dk. Ek y Dk deben ser inversas pero si uno conoce Ek no se debe poder obtener Dk. Esto apareció por primera vez en un artículo de W. Diffie y M. Hellman (New direction cryptography).
Estos criptosistemas se basan en la función de dirección única. Una función de dirección única:
                                                        f
                                                X --------> Y
es una función tal que es ?fácil? d.p.v computacional calcular f(x) para todo x perteneciente a X pero que por el contrario es ?difícil? para la mayoría de los y pertenecientes a Y encontrar un x perteneciente a X / f(x) = y (suponiendo que exista).
Por el momento no se ha demostrado la existencia de funciones de dirección única pero si se conocen funciones que se piensa que son de dirección única y que se usan en la práctica ya que de momento nadie ha sido capaz de invertir las funciones.
Si Ek fuese de dirección única ni siquiera el destinatario sería capaz de desencriptar .
Una de las primeras y presumible función de dirección única fue:


f(x), Zp(x)
p = 264 - 59
f(x) = x2elevado(24) + 17 + a1x2elevado(24)+3 + a1x3 + a3x2 + a4x + a5
ai = enteros de 19 digitos.

En un criptosistema no servirían las funciones de dirección única. Se usa una variante que son las funciones de dirección única con trampa (trapdoor), que son funciones en las que es ?fácil? calcular f(x), es fácil calcular x / f(x) = y dado y es posible revelar un algoritmo eficiente para calcular f ?hacia delante? sin que el conocimiento del mismo proporcione un algoritmo eficiente para calcular f ?hacia atrás?. Con esta función el destinatario ya puede desencriptar la información. Esto llevó al concepto de criptosistema de clave pública en el que hay una clave pública que conoce todo el mundo y otra secreta para desencriptar que sólo conoce el destinatario, con lo que ya no hay que intercambiar la clave secreta.

Criptosistemas de Clave Pública (CCP) o Criptosistemas asimétricos:

Cada usuario del criptosistema se construye una función de encriptación Eu y una función de desencriptación Du que cumplen las siguientes propiedades:

CP1- Du(Eu(x)) = x para todo mensaje x y todo usuario u.

CP2- Existen algoritmos eficientes para calcular Eu(x) y Du(x) para todo x.
CP3- Existe una clave secreta (conocida sólo por u) que permite obtener rápidamente
Dua partir de Eu pero el conocimiento de Eu no hace factible hallar un algoritmo Du* que ratifica Du*(Eu(x)) = x para todo x.
 
Cada usuario u hace público el algoritmo para calcular Eu, los Eu se ponen en un directorio que es público. El algoritmo que permite calcular Du es mantenido en secreto por u.
Si A quiere enviar un mensaje m a B, A busca EB en el directorio y calcula EB(m), A envía c = EB(m) y B calcula DB(EB(m)). Un criptoanalista conoce c = EB(m).
CP4- Eu(Du(x)) = x
CP5- No es factible encontrar a partir de Eu una función Du* tal que Eu(Du*(x)) = x
Definición: Una función H: X ->Y con |X| = l, |Y| = k y k mucho menor que l se llama ?función hash? si es fácil calcular H(x) para todo x perteneciente a X y cumple:


1) No es factible encontrar dos valores distintos x != x' tales que H(x) = H(x') ("H es resistente a la colisión")
2) Dada y perteneciente a Im H no es factible encontrar x perteneciente a X tal que H(x) = y ("H es resistente a la preimagen")

A envía m a B firmado. A calcula H = H(m) y envía a B el par (m,H(m)). B aplica H a m y obtiene H(m), si coincide con H sabe que el mensaje es auténtico suponiendo que H proviene realmente de A.

A envía m a B firmado, A calcula H = H(m). A calcula EBDA(H) y envía a B(m, EBDA(H)) (se encripta la firma). B calcula EADB(EBDA(H)) = EADA(H) = H. A continuación B comprueba que H(m) = H.
Al aplicar EA la única forma de obtener la firma desencriptada es que previamente haya sido encriptada con Da que sólo A conoce.
Si A negase haber enviado el mensaje B podría ir a una 3ª parte y demostrar que A ha enviado el mensaje (sólo A ha podido utilizar DA).
 

El Criptosistema RSA
 

Riverest-Shamir-Adleman: Criptosistema RSA (A method for obtaining digital signatures and public key cryptosystems- Comunications of the ACM 1978)
Se piensa que el criptosistema RSA es tan seguro como lo era en 1978.
?Exponenciación modular con exponente y módulos fijos?
gm,n : Zm --> Zn
gm,n := xm (mod n)

Se piensa que esta es una función de dirección única con trampa.

?Extracción de raíces módulo n?: Dados y, m, n perteneciente a Z+ hallar (en caso de que exista) un x tal que xm sea equivalente a y (mod n)

Es fácil calcular las imágenes pero la extracción de raíces módulo n no es factible computacionalmente a menos que se conozca una información adicional, que si se conoce entonces es fácil volver hacia atrás; esto se logra conociendo la factorización de m en números primos ya que es fácil obtener las raíces m-ésimas.

Dados m y n nadie conoce un algoritmo eficiente para la extracción de raíces módulo n pero no se ha demostrado que este algoritmo no exista.
RSA:
 
RSA = (P, C, K, E, D) donde:
P = C = Zn, con n = pq p y q primos
K = {(n, e, d)/ ed equivalente a 1 (mod þ(n))}
Para cada k = (n, e, d)
Ek(x) : = xe (mod n) para todo x perteneciente a Zn
Dk(x) : = xd (mod n) para todo x perteneciente a Zn
Ek(x) : = xe (mod n) para todo x perteneciente a Zn
þ(n)  = número de enteros positivos menores que n y primos con n.
Zn = {0, 1, ..., n-1}
En Zn sólo tienen inverso los x tales que mcd(x,n) = 1
Zn* = {x perteneciente a Zn / mcd(x,n) = 1} es un grupo finito
| Z*n | = þ(n)
En el caso del sistema RSA:
þ(n) = þ(pq) = þ(p)þ(q) = (p-1)(q-1)
| Zn*| = p-1 si p es primo
Para todo x perteneciente a ZnDk(Ek(x)) = x
Teorema (Lagrange): Si G es un grupo finito y x pertenece a G, entonces x|G| = 1

Corolario (Euler): Si x pertenece a  Z+, mcd(x,n) = 1, entonces xþ(n) equivalente a  1 (mod n)

Corolario (Teorema pequeño de Fermat): Si p es primo, xp equivalente a x (mod p)

x perteneciente a Zp*

xp-1 equivalente a 1 (mod p)
xp equivalente a  x (mod p)
x perteneciente a Zn*
Ek(x) equivalente a xe (mod n)
Dk(Ek(x)) equivalente a (xe)d ( (mod n) equivalente a xed (mod n) equivalente a xtþ(n)+1 (mod n) equivalente a
(xþ(n))t x (mod n)  equivalente a x (mod n)
ed equivalente a 1 (mod þ(n)) <=> ed = tþ(n) +1

 

El par (n,e) constituye la clave pública mientras que d, p y q se mantienen en secreto.

Cada usuario u elige dos primos distintos grandes (512 bits = 154 dígitos decimales) pu y qu y calcula nu = pu * qu (n recibe el nombre de módulo).
Se calcula þ(nu)) = (pu- 1)(qu - 1) = |Z*nsubindice(u)| . u elige un entero eu tal que 1 < eu < þ(nu) y mcd(eu,þ(nu) = 1.
A continuacion se calcula el inverso de eu  enZ*þ(nu), es decir, se calcula el entero du tal que 1 < du < þ(nu) y eudu equivalente a 1 (mod þ(nu))

eu --> exponente de encriptacion
du --> exponente de desencriptacion

Clave pública : (nu, eu)

Eu(x) := xe subindice(u) (mod nu)
Du(x) := xd subindice(u) (mod nu)

u mantiene secreto pu, qu y du.

Los números más difíciles de factorizar son los que se factorizan como 2 primos que tienen el mismo número de dígitos.

Se presentan dos problemas:

    - Reconocimiento de primos (primality test)

    - Factorización de enteros.
Al usar el RSA queremos que otra parte no rompa el sistema, cualquier persona que conozca la descomposición de un en factores primos puede desencriptar, esto lleva al problema de la factorización de enteros; nadie conoce un método eficiente para factorizar enteros generales.
A --> B
 
A busca (nB,eB)
A envía a B xeB  (mod nB)
B calcula (xeB )dB (mod nB) = x
Un criptoanalista tiene xeB (mod nB), debe hallar la raíz eB de x, para esto debe conocer þ(nB) y para ello debe conocer qB y dB.
p = 47 q = 59
n = pq = 47·59 = 2773


þ(n) = þ(p)·þ(q) = 46·58 = 2668

e = 1225
mcd(1225,2668) = 1
1 = 257·1225 - 118·2668
257·1225 equivalente a 1 (mod 2668)
d = 257
Clave pública (2773,1225)
Clave privada (2773,257)
x1225 (mod 2773)
Exponenciación binaria:
1225 = (10011001001)2 = 210 + 27 + 26 + 23 + 20
x1225 = x(2e10+2e7+2e6+2e3+2e0) = x2e10 x2e7x2e5 x2e3 x
1 <--> cx
0 <--> c
c = elevado al cuadrado
x = multiplicar
cxcccxcxcccxccx
(((((((((x2)2)2·x)2·x)2)2)2·x)2)2)2)·x (mod 2773)
Haciendo esto calculamos directamente x1225 (mod 2773); hacemos esto con sólo 14 multiplicaciones.
Vamos a ver que se cumplen las condiciones CP1...CP5
    - CP1 se cumple.
    - D y E se calculan mediante algoritmos factibles ya que el algoritmo de exponenciación binaria es eficiente. CP2 se cumple.
    - CP3 permite asegurar que el RSA es seguro. Eu es fácil de calcular pero obtener Du a partir de Eu no es factible. Existe la conjetura de que criptoanalizar RSA es equivalente a poder factorizar n. Lo máximo que se ha llegado a factorizar son números de 130 dígitos. Los mejores algoritmos de factorización que se conocen son subexponenciales pero aún así el tiempo de computación es grande. Existe una creencia de que el RSA requiere la factorización de n y esto es difícil.

 
Encriptación:
                                x --> x1225(mod 2773) = c
Desencriptación:
                                c --> c257(mod 2773)
257 = (100000001)2
cxccccccccx
c257 = (((((((c2)2)2)2)2)2)2)2)c (mod 2773)

 

Problemas:

    - Manejo y distribución de claves. Este sistema de clave pública resuelve este problema inmediatamente ya que 2 partes no tienen necesidad de intercambiarse clave alguna. Un usuario elige los primos y el exponente de Exponenciación y hace pública una clave pero la clave privada no se intercambia con nadie.

    - Identificación. Los criptosistemas clásicos no permiten saber que el mensaje proviene de quien realmente dice. Suponiendo que el RSA sea seguro (CP1 ... CP5) se resuelve este problema.
    - Seguridad. Este problema está encerrado en la condición CP3. No está demostrado que el RSA es seguro, existen una serie de hechos matemáticos que hacen pensar que el RSA es seguro. La seguridad del RSA se basa en la creencia de que la función de encriptación es una función de dirección única con trampa.
El que RSA sea seguro se basa en 2 premisas:
        a) Se cree que romper RSA es equivalente a saber factorizar n. Esta sin demostrar que no puede existir otra forma de romper RSA que no pase por factorizar n. No está demostrado que romper RSA sea equivalente a factorizar n.
        b) Si aceptamos la premisa anterior de que romper RSA pasa por factorizar n tenemos que la factorización de n para tamaños grandes de n es un problema intratable d.p.v. computacional.
    Se ha demostrado que factorizar el criptosistema de Rabin, que es parecido al RSA, es equivalente a factorizar el módulo. La factorización de enteros equivale a estudiar RSA.

 

Complejidad computacional:

La teoría de la complejidad computacional trata de clasificar los problemas computacionales de acuerdo con su complejidad, esto se corresponde con la idea intuitiva de complejidad.

Factorización NFS (Number Field Sieve - Criba del cuerpo de números)

NFSnet: orca.st.usm.edu/~cwcurry/nfs/nfs.html

 

Factorización ECM (Eliptic Curve Method):

No sirve para factorizar números tan grandes como el NFS pero tiene ciertas ventajas para ciertos factores. El tiempo del NFS depende del tamaño del número, no de los factores que lo componen; en cambio ECM encuentra más fácilmente los factores si éstos son más pequeños.

Para romper RSA es mejor el NFS ya que ECM no puede con números de más de 50 dígitos.
ECPNET:
www.loira.fr/~zimmerma/records/ecmnet.html
Cunningham proyect:
www.cerios.purdme.edu/ssw/cum//index.html
www.npac.sgr.edu/factoring.html
www.utm.edu/research/primes
Aquí se pueden encontrar los primos más grandes que se conocen.
P. Ribenbaim: ?The new book of Prime number records?. Springer- Verlay (1995)
1984: Yates ?Sinkes of the Titanics?

titanic prime = primo de más de 1000 dígitos decimales

En 1984 se conocían 110 primos titánicos

Gigantic primer = primo de más de 10000 dígitos decimales

Primos de Fermat:

Fm = 22em +  1

Estos números sólo son primos hasta m = 5

Primos de Marsenne: 2p-1 (p primo)

Para ver si un número de esta forma es primo o no se aplica el test de Lucas-Lehmer.

www.marsenne.org/prime.htm : GIMPS (Great Internet Marsenne Prime Search)

entropia.com/ips

Mp = 2p - 1

1996 --> M1257787 (Cray T94) (Slawinski & Gage) (378632 dígitos decimales)

1996 --> M1398269 (P 90 MHZ) (J Aeannengand, Woltman, GIMPS) (420921 dígitos decimales)
1997 --> M2976221 (P 100 MHz)
1998 --> M3021377 (P 200 MHz) (909526 dígitos decimales)
1999 --> M69672593 (P 350 MHz) (Hajratwala) ( 2098960 dígitos decimales)
Direcciones sobre criptografía:
www.cryptome.org
www.comterpone.com  (Bruce Schneier : Cryptogam)
www.certicon.com (Criptografía de curvas elípticas)
www.iec.csic.es/criptonomicon
www.kriptopolis.com
theory.lcs.mit.edu/~rivest/crypto-security.html
UBASIC (Yuji Kida) --> MPQS (Multiple Polynomial Quadratic Sieve)
http://150.93.96.124/~kida
ftp://rkmath.rikkyo.ac.jp/pub/ubim
www.indigo.ie/~rmscott
MIRALCL ( Multiple Precission Integer and Rational C Library)
www.panillac.inria.fr/algo/morain
www.lix.polytechnique.fr/morain/Prgms/eccp.english.html
www.reality.sgi.com/chango/tech/math/prime/merdigit/index.html
                                                    fa,n : Zn --> Zn
                                                    fa,n(x) := ax (mod n)

?Problema del logaritmo discreto?: Dados a, n, y encontrar, si existe, un entero x tal que ax equivalente a y (mod n).

Se piensa que esta función es de dirección única. Esto se usa para alamacenar passwords.

Sea G un grupo finito y g perteneciente a G. Sea <g> el subgrupo de G generado por g. Problema del logaritmo discreto:

Dado y perteneciente a <g> encontrar un entero x tal que gx = y
No hay algoritmos eficientes que premitan calcular esto.
DIFFIE HELLMAN EXCHANGE:
Se usa el logaritmo discreto para intercambiar claves entre usuarios. La clave es pequeña, así no hay problema en transmitirla, no ocurre esto con los mensajes. La principal desventaja de los criptosistemas de clave pública frente a los de clave privada es la eficiencia, los criptosistemas de clave pública son varios órdenes de magnitud más lentos. El DES, p. ej., permite codificar y descodificar a velocidades enormes, si esto se hiciese con el RSA se necesitaría mucho más tiempo de transmisión y más espacio de almacenamiento. En algunos casos conviene usar un criptosistema de clave privada pero realizando el intercambio de clves mediante un criptisistema de clave pública. Se propuso utilizar el logaritmo discreto para hacer esto.
Sea Fp = Zp = {0, 1, ... p-1 }
Fp*= Fp - {0} = {1,2, ... p-1}
Fp* es un grupo para la multiplicación y es, de hecho, un grupo cíclico (exite g perteneciente a Fp* tal que Fp* = <g>).
?Dados un generador g perteneciente Fp* y dado y perteneciente a Fp*, hallar x perteneciente a Fp* / gx = y ?
                                                El canal el público
                                         A <----------------------> E
                                                                ^
                                                                 |
                                                                 |
                                                                 |
                                                                O

 

A y B se ponen de acuerdo en un primo grande p (512 bits), así O conoce p, además, se ponen de acuerdo en un elemento g pertenece a Fp*.

A elige un entero positivo kA, 0 < kA < p, y aproximadamente del orden de p y calcula gkA (mod p) y esto es lo que le envía a B.
B elige un entero positivo kB, 0 < kB < p, y aproximadamente del orden de p y calcula gkB (mod p) y esto es lo que le envía a A.
La clave que van a compartir es:
                    gkAkB(mod p) perteneciente a Fp*
A calcula (gkB)kA(mod p) = gkAkB(mod p)
A calcula (gkA)kB(mod p) = gkAkB(mod p)
Para que O pueda encontrar la clave secreta debe resolver el problema de Diffie-Hellman:
Dados g, gkA, gkB pertenecientes a gkAkB.
Se cree que este problema es equivalente al problema del logaritmo discreto que es intratable computacionalmente.