Criptosistema de mochila Merkle-Hellman

Ajustar Compartir Imprimir Citar

El criptosistema de mochila Merkle-Hellman fue uno de los primeros criptosistemas de clave pública. Fue publicado por Ralph Merkle y Martin Hellman en 1978. Adi Shamir publicó un ataque de tiempo polinomial en 1984. Como resultado, el criptosistema ahora se considera inseguro.

Historia

El concepto de criptografía de clave pública fue introducido por Whitfield Diffie y Martin Hellman en 1976. En ese momento, propusieron el concepto general de una "función unidireccional de trampilla", una función cuyo inverso es computacionalmente inviable de calcular sin cierta 'información de trampilla' secreta; pero aún no habían encontrado un ejemplo práctico de tal función. Otros investigadores propusieron varios criptosistemas de clave pública específicos durante los años siguientes, como RSA en 1977 y Merkle-Hellman en 1978.

Descripción

Merkle-Hellman es un criptosistema de clave pública, lo que significa que se utilizan dos claves, una clave pública para la encriptación y una clave privada para la desencriptación. Se basa en el problema de la suma de subconjunto (un caso especial del problema de la mochila). El problema es el siguiente: dado un conjunto de enteros y un entero , encontrar un subconjunto de que suma . En general, se sabe que este problema está completo. Sin embargo, si es superincreciente, lo que significa que cada elemento del conjunto es mayor que la suma de todos los números en el conjunto menos que él, el problema es "fácil" y solvable en el tiempo polinomio con un simple algoritmo codicioso.

En Merkle-Hellman, descifrar un mensaje requiere resolver un problema aparentemente "difícil". La clave privada contiene una lista de números superincreciente , y la clave pública contiene una lista no superincreciente de números , que es en realidad una versión "disguida" de . La clave privada también contiene cierta información de "trapdoor" que se puede utilizar para transformar un problema de knapsack duro utilizando en un problema de knapsack fácil .

A diferencia de otros criptosistemas de clave pública como RSA, las dos claves de Merkle-Hellman no son intercambiables; la clave privada no se puede utilizar para el cifrado. Por lo tanto, Merkle-Hellman no se puede usar directamente para la autenticación mediante firma criptográfica, aunque Shamir publicó una variante que se puede usar para firmar.

Generación de claves

1. Elige un tamaño de bloque . Integers hasta bits de longitud se pueden encriptar con esta clave.

2. Elija una secuencia de superincremento al azar enteros positivos

El requisito de superincremento significa que , para .

3. Elija un entero al azar tales que

4. Elija un entero al azar tales que (es decir, y son coprime).

5. Calcular la secuencia

Donde .

La clave pública es y la clave privada es .

Cifrado

Vamos ser un -bit mensaje consistente en bits , con el pedido más alto. Seleccione cada uno para la cual no es cero, y añadirlos juntos. Equivalentemente, calcular

.

El cifertexto es .

Descifrado

Para descifrar un ciphertext , debemos encontrar el subconjunto de que suma . Lo hacemos transformando el problema en uno de encontrar un subconjunto de . Ese problema se puede resolver en el tiempo polinomio desde entonces es superincreciente.

1. Calcular el inverso modular de modulo usando el algoritmo Extended Euclidean. El inverso existirá desde es coprime .

La computación de es independiente del mensaje, y se puede hacer sólo una vez cuando se genera la clave privada.

2. Calcular

3. Resolver el problema de la suma de subconjunto usando la secuencia superincreciente , por el simple algoritmo codicioso descrito a continuación. Vamos ser la lista resultante de índices de los elementos que suma . (Eso es, .)

4. Construir el mensaje con 1 en cada uno posición del bit y un 0 en todas las posiciones del bit:

Resolviendo el problema de la suma de subconjuntos

Este simple algoritmo codicioso encuentra el subconjunto de una secuencia superincreciente que suma , en tiempo polinomio:

1. Inicializar a una lista vacía.
2. Encontrar el elemento más grande en que es inferior o igual a , di .
3. Subtract: .
4. Apéndice a la lista .
5. Si es mayor que cero, volver al paso 2.

Ejemplo

Generación de claves

Cree una clave para cifrar números de 8 bits mediante la creación de una secuencia supercreciente aleatoria de 8 valores:

La suma de estos es de 706, así que seleccione un valor mayor para :

.

Elija ser coprime :

.

Construir la clave pública multiplicando cada elemento en por modulo :

Por lo tanto .

Cifrado

Que el mensaje de 8 bits sea . Multiplicamos cada bit por el número correspondiente en y añadir los resultados:

 0 * 295
+ 1 * 592
+ 1 * 301
+ 0 * 14
+ 0 * 28
+ 0 * 353
+ 0 * 120
+ 1 * 236
= 1129

El ciphertext es 1129.

Descifrado

Para descifrar 1129, primero utilice el Algoritmo Euclideano Extendido para encontrar el inverso modular de mod :

.

Computación .

Utilice el algoritmo codicioso para descomponer 372 en una suma de valores:

Así , y la lista de índices es . El mensaje ahora puede ser calculado como

.

Cripanálisis

En 1984 Adi Shamir publicó un ataque contra el criptosistema Merkle-Hellman que puede descifrar mensajes cifrados en tiempo polinomio sin usar la clave privada. El ataque analiza la clave pública y busca un par de números y tales que es una secuencia superincreciente. El par encontrado por el ataque puede no ser igual a en la llave privada, pero como ese par se puede utilizar para transformar un problema de knapsack duro utilizando en un problema fácil usando una secuencia superincreciente. El ataque opera únicamente en la clave pública; no es necesario acceder a mensajes cifrados.