Cifrado usando dos claves

4

El caso de uso es análogo al acceso a una caja de seguridad en un banco. Existe una clave por usuario, única para cada usuario, ya sea generada por el sistema o con hash de la contraseña del usuario. Y hay una clave maestra de todo el sistema para todos los usuarios. Se requieren ambas claves para poder descifrar datos. ¿Cuál es la mejor manera de implementarlo?

  1. encriptación múltiple . Parece que puedo seguir la recomendación en la página Wiki y usar el método descrito por Bruce Schneier.

  2. Cifre la clave por usuario con la clave maestra. Use la clave cifrada para cifrar y descifrar.

  3. Concatene la clave por usuario con la clave maestra. Utilice la clave concatenada para cifrar y descifrar.

Especialmente 2 y 3 serían más simples que 1. ¿Pero están libres de fallas? No pude encontrar ejemplos de ellos.

    
pregunta neurite 26.10.2014 - 18:53
fuente

2 respuestas

8

El punto importante es determinar quién debe manejar las teclas. Sin el cifrado múltiple, entonces debe haber, tras el cifrado y el descifrado, un sistema que al menos aprende de forma transitoria todas las claves. Por ejemplo, si la "clave maestra" y la "clave de usuario" están concatenadas (su "método 3"), ambas claves están presentes simultáneamente en la RAM de la computadora que utiliza la concatenación para cifrar o descifrar.

Si eso no es un problema, entonces el caso general es Shamir's Secret Sharing : el valor secreto (el la clave de cifrado real) se divide en acciones n , de modo que cualquier acción t es suficiente para reconstruir el secreto, pero las acciones t-1 no dan información alguna. En su situación, n = t = 2; El algoritmo de uso compartido es, en su mayoría, un XOR de los dos recursos compartidos (la clave de usuario y la clave maestra), que corresponde a lo que @rossum sugirió como comentario.

Por otra parte, si desea evitar que un sistema aprenda ambas claves en cualquier momento, deberá utilizar el cifrado múltiple. Si los datos son cifrados por el usuario primero, luego por el banco, entonces el descifrado se realizará en orden inverso; el usuario no aprenderá la clave del banco, el banco no aprenderá la clave del usuario y el banco tampoco aprenderá los datos de texto claro.

    
respondido por el Thomas Pornin 31.10.2014 - 12:22
fuente
4

Ninguna de las anteriores. Debe crear una clave de mensaje por entrada y cifrar esa clave de mensaje con la clave de usuario y la clave de back-office. Luego use la clave de mensaje para cifrar / descifrar los datos del usuario. De esta manera, las claves pueden permanecer independientes y se puede usar para cifrar / descifrar. Es posible que desee considerar el uso de un par de claves públicas / privadas asimétricas para el usuario y / o las claves de back-office.

Así que almacenarías:

E(K_b, K_d) | E(K_u, K_d) | E(K_m, M)

donde E es el cifrado, el primer argumento es la clave, K_m es la clave de backoffice (o, K_u es la clave de usuario y K_m es la clave aleatoria generada para cifrar el mensaje.

Siempre almacene también algún identificador de protocolo (por ejemplo, byte inicial) para que pueda actualizar su protocolo más adelante.

    
respondido por el Maarten Bodewes 26.10.2014 - 20:59
fuente

Lea otras preguntas en las etiquetas