Pregunta

¿Cuáles son los fundamentos para lograr el cifrado de datos con exactamente dos claves (que podrían estar basadas en contraseñas), pero necesitando solo una (cualquiera) de las dos claves para descifrar los datos?

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

No me refiero a clave pública/privada.Probablemente a través de criptografía de clave simétrica y tal vez implique algo como unir las claves mediante XOR para usarlas para cifrar.

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

¿Fue útil?

Solución

La forma habitual de hacerlo es generar una única clave simétrica para cifrar los datos.Luego, cifra la clave simétrica con la clave o contraseña de cada destinatario para que puedan descifrarla por su cuenta.S/MIME (en realidad, la sintaxis de mensajes criptográficos en la que se basa S/MIME) utiliza esta técnica.

De esta manera, sólo tendrás que almacenar una copia del mensaje cifrado, pero varias copias de su clave.

Otros consejos

En términos generales, lo que se hace es cifrar los datos con una clave generada aleatoriamente y luego agregar versiones de esa clave aleatoria que han sido cifradas con cada clave conocida.De modo que cualquiera que tenga una clave válida puede descubrir la clave "real" que se utilizó para cifrar los datos.

Si le entendí correctamente, tiene algunos datos que está dispuesto a cifrar y distribuir la clave de cifrado dividida en n 'partes clave' (en su caso, 2 piezas).

Para eso puedes usar la división basada en XOR, así es como funciona:Usted proporciona el número requerido de piezas - n, y la clave secreta - K.Para generar n piezas de su clave, necesita crear (n – 1) números aleatorios:R1, R2, R3,..., Rn-1.Para eso, puede utilizar un generador de números SecureRandom, que 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 tienes tus n piezas:R1, R2, R3,…, Rn-1, Rn y podrás destruir la K.Esas piezas pueden difundirse 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 inherentemente importante en la reconstrucción de la clave; si se cambia algún bit en cualquiera de las piezas, entonces la clave no es recuperable.

Para obtener más información y código, puedes 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 puedes probar la aplicación de demostración Secret Key Splitter que utiliza esa utilidad:
Google Play: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

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)

Luego, cualquiera de las personas puede descifrar el hash de la otra y luego combinarlos para descifrar el resto de los datos.

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top