Ir al contenido

Diferencia entre revisiones de «Criptosistema de Merkle-Hellman»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
Fachotto (discusión · contribs.)
Correcciones de formato. Cambio en el párrafo que explica el cifrado (era muy complicado)
Línea 2: Línea 2:


==Descripción==
==Descripción==
Merkle-Hellman es un criptosistema asimétrico, esto significa que para la comunicación, se necesitan dos llaves: una llave pública y una privada. Otra diferencia con RSA, es que sirve sólo para cifrado, es decir, la llave pública es usada sólo para cifrar(no para verificar firma) y la llave privada es usada sólo para descifrar(no para firmar). De este modo, no se puede usar para tareas de autentificación por firma electrónica.
Merkle-Hellman es un criptosistema asimétrico, esto significa que para la comunicación, se necesitan dos llaves: una llave pública y una privada. Otra diferencia con RSA, es que sirve sólo para cifrado, es decir, la llave pública es usada sólo para cifrar (no para verificar firma) y la llave privada es usada sólo para descifrar (no para firmar). De este modo, no se puede usar para tareas de autentificación por firma electrónica.


El algoritmo de Merkle-Hellman está basado en el problema de la mochila de decisión (un caso especial del [[problema de la mochila]] de optimización): dados una secuencia de números y un valor, el cual es la suma de un subconjunto de estos números, determinar cual es el subconjunto correspondiente. En general, es sabido que este problema es de clase [[NP-completo]]. Sin embargo, si la secuencia de números que pueden ser elegidos es supercreciente -- esto es, que cada elemento de la secuencia es mayor que la suma de todos los anteriores -- el problema es 'fácil', y es posible resolverlo en tiempo polinomial con un simple [[algoritmo voraz]].
El algoritmo de Merkle-Hellman está basado en el [[problema de la mochila]] de decisión (un caso especial del problema de la mochila de optimización): dados una secuencia de números y un número, determinar si existe un subconjunto de la secuencia cuya suma dicho número. En general, es sabido que este problema es de clase [[NP-completo]]. Sin embargo, si la secuencia de números es supercreciente -- esto es, si cada elemento de la secuencia es mayor que la suma de todos los anteriores -- el problema es "fácil", y es posible resolverlo en tiempo polinomial con un simple [[algoritmo voraz]].
===Generación de las claves===
===Generación de las claves===
En Merkle-Hellman, las claves están compuestas por secuencias. La clave pública es una secuencia 'difícil', y la clave privada es una 'fácil', o secuencia de valores supercrecientes, combinado con dos números adicionales , un multiplicador y un módulo, los cuales son usados para convertir la secuencia supercreciente en una secuencia difícil. Estos mismos números son usados para transformar la suma de la subsecuencia de la secuencia 'difícil' en la suma de la subsecuencia de la secuencia 'fácil', la cual se puede solucionar en tiempo polinomial.
En Merkle-Hellman, las claves están compuestas por secuencias. La clave pública es una secuencia "difícil", y la clave privada es una "fácil", o secuencia de valores supercrecientes, junto con dos números adicionales, un multiplicador y un módulo, los cuales son usados para convertir la secuencia supercreciente en una secuencia difícil. Estos mismos números son usados para transformar la suma de la subsecuencia de la secuencia "difícil" en la suma de la subsecuencia de la secuencia "fácil", la cual se puede solucionar en tiempo polinomial.


===Cifrado===
===Cifrado===
Para cifrar un mensaje, una subsecuencia de la secuencia difícil es elegida a partir de una secuencia de bits(el texto claro), del mismo largo que la llave, y haciendo que cada término en la llave pública que corresponde a 1 en el texto claro sea parte de la subsecuencia, y por el contrario dejando fuera de esta subsecuencia a cada término en la llave pública que corresponde a 0 en el texto claro. Luego suman los elementos de la subsecuencia, y resultado de esto es el texto cifrado.
Para cifrar un mensaje, el cual debe ser una secuencia de bits de la misma longitud de la secuencia difícil, se eligen los elementos de la secuencia difícil que correspondan a bits en 1 del mensaje (mientras que los elementos correspondientes a bits en 0 son descartados). Luego se suman los elementos así elegidos, y el resultado de esto es el texto cifrado.

En caso que el mensaje no sea de la misma longitud de la llave, se subdivide en secuencias que tengan esta longitud y se aplica el mismo procedimiento.


===Descifrado===
===Descifrado===
El descifrado es posible, porque el multiplicador y el módulo usados para transformar la secuencia supercreciente(la llave privada) y por tanto 'fácil' en la secuencia general(la llave pública) y por tanto difícil, también pueden ser usados para transformar el texto cifrado(representado por un número) en la suma de los elementos que conforman la subsecuencia supercreciente(una subsecuencia de una secuencia supercreciente, también es supercreciente). Luego, usando un algoritmo voraz, el problema 'fácil' de la mochila puede ser resuelto usando O(n) operaciones, con lo cual se logra descifrar el mensaje.
El descifrado es posible, porque el multiplicador y el módulo usados para transformar la secuencia supercreciente (la llave privada) y por tanto "fácil" en la secuencia general (la llave pública) y por tanto difícil, también pueden ser usados para transformar el texto cifrado (representado por un número) en la suma de los elementos que conforman la subsecuencia supercreciente (una subsecuencia de una secuencia supercreciente, también es supercreciente). Luego, usando un algoritmo voraz, el problema "fácil" de la mochila puede ser resuelto usando O(n) operaciones, con lo cual se logra descifrar el mensaje.


==Método Matemático==
==Método Matemático==
Línea 19: Línea 21:
Para encriptar un mensaje de ''n''-bits, elegir una [[secuencia]] supercreciente :
Para encriptar un mensaje de ''n''-bits, elegir una [[secuencia]] supercreciente :


:<math> w =(w_1, w_2, ..., w_n) \mbox{ tal que } w_{i+1} > \sum_{j=1}^i w_j</math>

<math> w =(w_1, w_2, ..., w_n) \mbox{ tal que } w_{i+1} > \sum_{j=1}^n w_j</math>


de ''n'' [[números naturales]] (distintos de cero). Elegir un número ''q'' (preferiblemente al azar), tal que
de ''n'' [[números naturales]] (distintos de cero). Elegir un número ''q'' (preferiblemente al azar), tal que


<math> q > \sum_{i = 1}^n w_i</math>
:<math> q > \sum_{i = 1}^n w_i</math>


y otro número entero, ''r'' tal que mcd(r,q) = 1.
y otro número entero, ''r'' tal que mcd(r,q) = 1.


''q'' es escogido de esta forma para asegurar la unicidad del texto cifrado. Si fuera menor podrían haber varios textos claros que resultarían en el mismo texto cifrado. ''r'' debe ser [[coprimo]] con ''q'' puesto que de otra forma podría no tener inverso en <math>\pmod{q}</math>. La existencia del inverso de ''r'' es necesaria para que se puedea realizar el descifrado.
''q'' es escogido de esta forma para asegurar la unicidad del texto cifrado. Si fuera menor, podría haber varios textos claros que resultarían en el mismo texto cifrado. ''r'' debe ser [[coprimo]] con ''q'' puesto que de otra forma podría no tener inverso en <math>\pmod{q}</math>. La existencia del inverso de ''r'' es necesaria para que se pueda realizar el descifrado.


A continuación, se calcula la secuencia:
Cálculo de la secuencia pública


<math> \mathbf \beta =(\beta_1, \beta_2, ..., \beta_n) \mbox{ tal que } \beta_i = rw_i \pmod{q}</math>
:<math> \mathbf \beta =(\beta_1, \beta_2, ..., \beta_n) \mbox{ tal que } \beta_i = rw_i \pmod{q}</math>


La clave pública es <math>\beta</math> , mientras que la llave privada es <math> (w, q, r) </math>.
La clave pública es <math>\beta</math> , mientras que la llave privada es <math> (w, q, r) </math>.


Línea 41: Línea 40:
Para cifrar un mensaje de ''n''-bits
Para cifrar un mensaje de ''n''-bits


<math> \mathbf \alpha =(\alpha_1, \alpha_2, ..., \alpha_n)</math>
:<math> \mathbf \alpha =(\alpha_1, \alpha_2, ..., \alpha_n)</math>

donde <math>\mathbf\alpha_i</math> es el ''i''-ésimo bit del mensaje y <math> \mathbf \alpha_i \in \{0, 1\} </math>, calcular
donde <math>\mathbf\alpha_i</math> es el ''i''-ésimo bit del mensaje y <math> \mathbf \alpha_i \in \{0, 1\} </math>, calcular


Línea 56: Línea 54:
Para el descifrado se debe encontrar un entero ''s'' tal que es el inverso de ''r'' módulo ''q''. Esto es, ''s'' satisface la ecuación :
Para el descifrado se debe encontrar un entero ''s'' tal que es el inverso de ''r'' módulo ''q''. Esto es, ''s'' satisface la ecuación :


<math> rs \equiv 1 \pmod{q}</math>
:<math> rs \equiv 1 \pmod{q}</math>


o equivalentemente, existe un entero ''k'' tal que ''sr'' = ''kq'' + 1. Dado que ''r'' fue escogido como un coprimo de ''q''
o equivalentemente, existe un entero ''k'' tal que ''sr'' = ''kq'' + 1. Dado que ''r'' fue escogido como un coprimo de ''q''
es posible encontrar ''s'' y ''k'' usando el Algoritmo euclidiano extendido. Luego el receptor del criptograma ''c'' calcula:
es posible encontrar ''s'' y ''k'' usando el [[Algoritmo de Euclides extendido]]. Luego el receptor del criptograma ''c'' calcula:


<math>c'\equiv cs \pmod{q}.</math>
:<math>c'\equiv cs \pmod{q}.</math>


Por tanto
Por tanto
Línea 77: Línea 75:




Este problema es fácil debido a que la secuencia ''w'' supercreciente.
Este problema es fácil debido a que la secuencia ''w'' es supercreciente.

El algoritmo aváro para resolver esto consiste en lo siguiente:

Tomar el elemento más grande en <math> w</math>, digamos <math>w_k</math>.

Si <math>w_k > c' </math>, luego <math>\alpha_k = 0</math>,

Sino <math>\alpha_k = 1</math>


El algoritmo avaro para resolver esto consiste en lo siguiente:
Disminuímos c' en <math>w_k \alpha_k</math>


Tomar el elemento más grande en <math> w</math>, digamos <math>w_k</math>.
y repetimos estos pasos hasta que se haya alcanzado c'.
Si <math>w_k > c' </math>, luego <math>\alpha_k = 0</math>,
Sino <math>\alpha_k = 1</math>
Disminuímos c' en <math>w_k \alpha_k</math>
y repetimos estos pasos hasta que se haya alcanzado c'.


El pseudo código para este algoritmo sería:
El pseudo código para este algoritmo sería:


While <math>( c' > 0 )</math>{
While <math>( c' > 0 )</math>{
<math> w_k=\mbox{ extract-max } (w) </math>
<math> w_k=\mbox{ extract-max } (w) </math>
If <math> (w_k > c') </math>
If <math> (w_k > c') </math>
then <math> \alpha_k = 0 </math>,
then <math> \alpha_k = 0 </math>,
Else <math> \alpha_k = 1</math>
Else <math> \alpha_k = 1</math>
<math> c' = c' -w_k * \alpha_k</math>
<math> c' = c' -w_k * \alpha_k</math>
}
}


Este algoritmo no se puede usar para firmar puesto que el criptograma es un número (c), y no un texto, de este modo no se puede descifrar un mensaje claro y por ende no se puede firmar .
Este algoritmo no se puede usar para firmar puesto que el criptograma es un número (c), y no un texto, de este modo no se puede descifrar un mensaje claro y por ende no se puede firmar.


==Referencias==
==Referencias==

Revisión del 15:28 23 jun 2008

Merkle-Hellman (MH) fue uno de los primeros criptosistemas de llave pública y fue inventado por Ralph Merkle y Martin Hellman en 1978.[1]​ Aunque sus ideas eran elegantes, y mucho más simples que RSA, no tuvo el mismo éxito que éste último, debido a que MH ya fue roto, [2]​ y además no ofrece funcionalidades para firmar.

Descripción

Merkle-Hellman es un criptosistema asimétrico, esto significa que para la comunicación, se necesitan dos llaves: una llave pública y una privada. Otra diferencia con RSA, es que sirve sólo para cifrado, es decir, la llave pública es usada sólo para cifrar (no para verificar firma) y la llave privada es usada sólo para descifrar (no para firmar). De este modo, no se puede usar para tareas de autentificación por firma electrónica.

El algoritmo de Merkle-Hellman está basado en el problema de la mochila de decisión (un caso especial del problema de la mochila de optimización): dados una secuencia de números y un número, determinar si existe un subconjunto de la secuencia cuya suma dé dicho número. En general, es sabido que este problema es de clase NP-completo. Sin embargo, si la secuencia de números es supercreciente -- esto es, si cada elemento de la secuencia es mayor que la suma de todos los anteriores -- el problema es "fácil", y es posible resolverlo en tiempo polinomial con un simple algoritmo voraz.

Generación de las claves

En Merkle-Hellman, las claves están compuestas por secuencias. La clave pública es una secuencia "difícil", y la clave privada es una "fácil", o secuencia de valores supercrecientes, junto con dos números adicionales, un multiplicador y un módulo, los cuales son usados para convertir la secuencia supercreciente en una secuencia difícil. Estos mismos números son usados para transformar la suma de la subsecuencia de la secuencia "difícil" en la suma de la subsecuencia de la secuencia "fácil", la cual se puede solucionar en tiempo polinomial.

Cifrado

Para cifrar un mensaje, el cual debe ser una secuencia de bits de la misma longitud de la secuencia difícil, se eligen los elementos de la secuencia difícil que correspondan a bits en 1 del mensaje (mientras que los elementos correspondientes a bits en 0 son descartados). Luego se suman los elementos así elegidos, y el resultado de esto es el texto cifrado.

En caso que el mensaje no sea de la misma longitud de la llave, se subdivide en secuencias que tengan esta longitud y se aplica el mismo procedimiento.

Descifrado

El descifrado es posible, porque el multiplicador y el módulo usados para transformar la secuencia supercreciente (la llave privada) y por tanto "fácil" en la secuencia general (la llave pública) y por tanto difícil, también pueden ser usados para transformar el texto cifrado (representado por un número) en la suma de los elementos que conforman la subsecuencia supercreciente (una subsecuencia de una secuencia supercreciente, también es supercreciente). Luego, usando un algoritmo voraz, el problema "fácil" de la mochila puede ser resuelto usando O(n) operaciones, con lo cual se logra descifrar el mensaje.

Método Matemático

Generación de las claves

Para encriptar un mensaje de n-bits, elegir una secuencia supercreciente :

de n números naturales (distintos de cero). Elegir un número q (preferiblemente al azar), tal que

y otro número entero, r tal que mcd(r,q) = 1.

q es escogido de esta forma para asegurar la unicidad del texto cifrado. Si fuera menor, podría haber varios textos claros que resultarían en el mismo texto cifrado. r debe ser coprimo con q puesto que de otra forma podría no tener inverso en . La existencia del inverso de r es necesaria para que se pueda realizar el descifrado.

A continuación, se calcula la secuencia:

La clave pública es , mientras que la llave privada es .

Cifrado

Para cifrar un mensaje de n-bits

donde es el i-ésimo bit del mensaje y , calcular

.

El criptograma o texto cifrado es c.

Descifrado

Para descifrar el criptograma c el receptor tiene que encontrar los bits del mensaje tales que satisfacen

.

Este problema sería difícil de resolver si los fueran valores aleatorios, debido a que el receptor tendría que resolver una instancia del problema de la mochila, el cual se sabe que es NP-hard. Sin embargo, los valores fueron elegidos de forma que el descifrado sea fácil si la clave privada es conocida.

Para el descifrado se debe encontrar un entero s tal que es el inverso de r módulo q. Esto es, s satisface la ecuación :

o equivalentemente, existe un entero k tal que sr = kq + 1. Dado que r fue escogido como un coprimo de q es posible encontrar s y k usando el Algoritmo de Euclides extendido. Luego el receptor del criptograma c calcula:

Por tanto

Ya que y entonces

Con esto

La suma de todos los valores es menor que q y por ende también está en el intervalo .

De este modo el receptor tiene que resolver el siguiente problema de la mochila.


Este problema es fácil debido a que la secuencia w es supercreciente.

El algoritmo avaro para resolver esto consiste en lo siguiente:

   Tomar el elemento más grande en , digamos . 
   Si , luego ,
   Sino 
   Disminuímos  c'  en  
   y repetimos estos pasos hasta que se haya alcanzado c'.

El pseudo código para este algoritmo sería:

   While {
       
       If 
          then ,
       Else 
          
   }

Este algoritmo no se puede usar para firmar puesto que el criptograma es un número (c), y no un texto, de este modo no se puede descifrar un mensaje claro y por ende no se puede firmar.

Referencias

  1. Ralph Merkle and Martin Hellman, Hiding Information and Signatures in Trapdoor Knapsacks, IEEE Trans. Information Theory, 24(5), September 1978, pp525–530.
  2. Adi Shamir, A Polynomial Time Algorithm for Breaking the Basic Merkle-Hellman Cryptosystem. CRYPTO 1982, pp279–288. http://dsns.csie.nctu.edu.tw/research/crypto/HTML/PDF/C82/279.PDF