¿Qué tan seguro es que la implementación de OTP use páginas más pequeñas que la carga útil?

1

Me pregunto cómo es que debo implementar el cifrado de una sola vez en mi código.

Utilizo páginas de 16 bytes en este momento, y la implementación en Golang desde la página: enlace (la línea 83 es el método Encrypt() ).

Sin embargo, los datos que necesito para cifrar a veces (no siempre) son más grandes que 16 bytes.

// Page must be at least as long as plain text
if len(page) < len(payload) {
    return nil, fmt.Errorf("otp: insufficient page size")
}

result := make([]byte, len(payload))

for i := 0; i < len(payload); i++ {
    plainText := int(payload[i])
    secretKey := int(page[i]) // ln 95
    cipherText := (plainText + secretKey) % 255
    result[i] = byte(cipherText)
}

Lo que hice fue comentado en la verificación de la longitud de la página, por lo que el cifrado ahora ignora el problema de la longitud; usando módulo mientras se indexa page (línea 95):

secretKey := int(page[i % len(page)])

Entonces, si cifro el búfer de datos de 10 megabytes, ¿sigue siendo seguro y, si no, por qué?

    
pregunta Tany 07.04.2018 - 19:40
fuente

2 respuestas

8

Esto es un realmente , realmente , really mala idea. En primer lugar, esto no es un pad de una sola vez, ya que está usando el mismo pad para cifrar múltiples bloques de datos. Esto es exactamente lo mismo que enviar varios mensajes cifrados por separado con el mismo teclado.

Hay varios ataques triviales contra este esquema:

  1. Si tiene algún texto sin formato conocido, el atacante puede xor bytes del texto sin formato conocido contra el texto cifrado y recuperar los bytes de su pad. Luego, pueden moverse a cada posición donde se reutiliza ese byte de relleno (es decir, +/- len(page) ), xor del byte de relleno y recuperar más texto sin formato.
  2. El análisis de frecuencia en cada posición es potencialmente trivial.
  3. Dado que el valor de cada byte de relleno solo afecta a los bytes de salida coincidentes, los ataques de fuerza bruta son posibles contra cada byte por separado (aunque será más difícil saber cuál es el valor correcto, seguirá siendo posible).
respondido por el David 07.04.2018 - 19:56
fuente
5

Si usas un byte más de una vez, ya no es un pad de una vez.

Si su clave se repite, el resultado puede romperse, ya que los datos subyacentes probablemente contienen redundancias. Buscar en Google algo como "romper la repetición de la clave xor" te ayudará a comenzar con las técnicas.

    
respondido por el manduca 07.04.2018 - 19:50
fuente

Lea otras preguntas en las etiquetas