2008-09-02 18 views
8

¿Cuáles son los fundamentos para lograr el cifrado de datos con exactamente dos claves (que pueden estar basadas en contraseña), pero que solo necesitan una (una) de las dos claves para descifrar los datos?¿Cómo encriptar un mensaje para múltiples destinatarios?

Por ejemplo, los datos se cifran con una contraseña de usuario y la contraseña de su empresa, y luego él o su empresa pueden descifrar los datos. Ninguno de ellos conoce la otra contraseña. Solo se almacena una copia de los datos cifrados.

No me refiero a clave pública/privada. Probablemente a través de la criptografía de clave simétrica y tal vez se trate de algo así como XORing las claves juntas para usarlas para el cifrado.

Actualización: También me gustaría encontrar una solución que no implique almacenar las claves en absoluto.

+0

Ver también: https://superuser.com/q/554513/199930 –

Respuesta

18

La forma en que esto se hace habitualmente es generar una única clave simétrica para encriptar los datos. Luego encriptas la clave simétrica con la clave o contraseña de cada destinatario para que puedan descifrarla por sí mismas. S/MIME (en realidad, la sintaxis de mensajes criptográficos en la que se basa S/MIME) utiliza esta técnica.

De esta manera, solo tiene que almacenar una copia del mensaje cifrado, pero varias copias de su clave.

+0

¿hay problemas de seguridad con este método? Si estoy enviando varios archivos (cada archivo con una clave simétrica diferente) a la misma lista de destinatarios (llámelos A y B). ¿Puede la persona A ver qué es la clave simétrica (texto fuente) y la forma encriptada para la persona B y determinar la clave de la persona B si se envían suficientes mensajes? –

+1

Asa, dependerá del algoritmo utilizado para cifrar la clave de cifrado de contenido (mensaje). Algunos algoritmos podrían ser vulnerables. Normalmente utilizo RSA para cifrar la clave de cifrado de contenido, y allí, el modo de relleno correcto puede defenderse contra los ataques de texto sin formato. Uso OAEP siempre que sea posible. – erickson

+0

erickson, entonces tendría la clave A que se usó para encriptar el mensaje, luego envíe al usuario 1 una copia de A cifrado con la clave de pub 1, envíe al usuario 2 una copia de A cifrado con la clave de pub 2, etc. – user8675309

6

En general, lo que se hace es cifrar los datos con una clave generada aleatoriamente, y luego anexar las versiones de esa clave aleatoria que se han cifrado con cada clave conocida. Entonces, cualquier persona con una clave válida puede descubrir la clave 'real' que se utilizó para encriptar los datos.

0

creo que pensé en una solución que funcionaría:

D = data to encrypt 
h1 = hash(userpassword) 
h2 = hash(companyPassword) 
k = h1 concat h2 

E = function to encrypt 
//C is the encrypted data 
C = E_h1(h2) concat E_h2(h1) concat E_k(D) 

Entonces, o persona puede descifrar el hash de la otra persona y, a continuación, combinarlos para descifrar el resto de los datos.

Quizás haya una mejor solución que esta?

+0

Esa solución funcionará, aunque se vuelve difícil de manejar cuando hay más de 2 claves. –

0

En el caso más general, un secreto (en esta aplicación, una clave de descifrado para los datos) se puede dividir en acciones, de modo que se requiere un número de umbral de estas acciones para recuperar el secreto. Esto se conoce como intercambio secreto o con n recursos compartidos y un umbral de t, un esquema de umbral (t, n).

Una forma de hacerlo es crear un polinomio de orden t-1, establecer el secreto como el primer coeficiente y elegir el resto de los coeficientes al azar. Luego, se seleccionan n puntos aleatorios en esta curva y se convierten en las acciones.

+0

Para su caso de uso, el intercambio secreto sería degenerado, ya que t = 1, y la "curva" sería la línea horizontal que pasa por el secreto. Además, tenga en cuenta que no es importante elegir los puntos compartidos al azar. En la práctica, las acciones a menudo se emiten en secuencia: 1, 2, 3 ... – erickson

1

Si he entendido bien, se tienen algunos datos que están dispuestos para cifrar y distribuir la clave de cifrado dividido en n 'piezas clave'. (En su caso 2 piezas)

Para que usted podría utilizar el División basada en XOR, así es como funciona: Proporciona el número requerido de piezas - n, y la clave secreta - K. Para generar n piezas de su clave, debe crear (n - 1) números aleatorios: R1, R2, R3,. . . , Rn-1. Para eso puede usar un generador de números SecureRandom, que nos evitará duplicados. Luego opera la función XOR en estas piezas Rn-1 y su clave - K:
Rn = R1 ⊕ R2 ⊕ R3 ⊕. . . ⊕ Rn-1 ⊕ K

Ahora tiene sus n piezas: R1, R2, R3, ..., Rn-1, Rn y puede destruir la K. Esas piezas pueden distribuirse en su código o enviarse a los usuarios.

Para volver a montar la clave, utilizamos la operación XOR en nuestras piezas Rn:
K = R1 ⊕ R2 ⊕ R3 ⊕. . . ⊕ Rn-1 ⊕ Rn

Con la función XOR (⊕) cada pieza es intrínsecamente importante en la reconstrucción de la llave; si se cambian los bits en cualquiera de las piezas, la clave no es recuperable.

Para obtener más información y código, puede echar un vistazo a la Utilidad de Android que escribí para ese propósito:
proyecto GitHub: https://github.com/aivarsda/Secret-Key-Split-Util

También se puede probar la aplicación de demostración clave secreta Splitter, que utiliza estos Utilidad:
GooglePlay: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

Cuestiones relacionadas