Algoritmo de teclado de una sola vez sin compartir claves

2

En mi caminata al trabajo de hoy, pensé en el siguiente algoritmo de encriptación y no pude determinar la falla. Utiliza una vez las almohadillas que no necesitan ser compartidas y tiene un sabor de intercambio de clave Diffie-Hellman:

  1. Digamos que Alice quiere enviar un mensaje M a Bob para que genere un azar una vez el pad A y envía M '= (M xor A) a Bob.

  2. Bob también genera un pad B de una sola vez y envía M '' = (M 'xor B) de vuelta     a Alice.

  3. Luego, Alice vuelve a usar su teclado de una sola vez y envía M '' '= (M' 'xor A)         de vuelta a Bob.

  4. Bob simplemente recupera el mensaje original que es (M '' '             xor B).

El código enviado en el paso 1 es (M xor A). El envío cifrado en el paso 2 es (M xor A xor B). El remitente cifrado en el paso 3 es (M xor A xor B xor A) = (M xor B). Bob puede descifrar el mensaje final M = (M xor B xor B). Todos los intrusos solo ven mensajes cifrados con una combinación segura de las claves A y B. Aunque Bob puede determinar el único teclado A de Alice en el paso 3, nunca hubo necesidad de compartir claves. p>

Aquí hay un ejemplo simple de 32 bits (^ = xor):

M = 1234ABCD  secret message
A = 4A3109AD  Alice's key
B = F499803C  Bob'e key

M         = 1234ABCD
M^A       = 5805A260
M^A^B     = AC9C225C
M^A^B^A   = E6AD2BF1
M^A^B^A^B = 1234ABCD

¿Por qué esto no es perfectamente seguro? (P.S., estoy ignorando los problemas de confianza y los asuntos de intermediarios, que pueden estar donde está el problema).

    
pregunta wcochran 16.09.2016 - 21:51
fuente

2 respuestas

7

Un intruso verá los tres mensajes (M xor A) , (M xor A xor B) y (M xor B)

Los combina con (M xor A) xor (M xor A xor B) xor (M xor B) , lo que da M

    
respondido por el Jeff 16.09.2016 - 22:04
fuente
-2

Has ido y has hecho algo casi exactamente como mi algoritmo de cifrado. El problema es que el One Time Pad solo funciona con la adición modular; eso significa que cada byte debe agregarse a un byte en el flujo de claves. La operación genérica sería:

M="¡Hola mundo!"

K="MyKeypadding"

Supongamos que la codificación es UTF-8

M="\ x48 \ x65 \ x6C \ x6C \ x6F \ x20 \ x77 \ x6F \ x72 \ x6C \ x64 \ x21"

K="\ x4D \ x79 \ x4B \ x65 \ x79 \ x70 \ x61 \ x64 \ x64 \ x69 \ x6E \ x67"

Agrega cada byte y módulo 16

para (i = 1; i < = 11; i + 1) {// i < message_length

M[i] = (M[i] + K[i]) % 0xff

}

Lo que hace que M '= "\ x95 \ xDE \ xB7 ..."

Y para resolverlo, solo resta la clave. Si la diferencia es menor que 0, agregue la diferencia negativa a 0xff (255).

    
respondido por el Brian 17.09.2016 - 01:05
fuente

Lea otras preguntas en las etiquetas