security - mensajes - desencriptar archivos gpg en windows
¿Cómo encriptar un mensaje para múltiples destinatarios? (5)
¿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?
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 la 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 encriptar.
Actualización: también me gustaría encontrar una solución que no implique almacenar las claves en absoluto.
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 dos personas puede descifrar el hash de la otra persona y luego combinarlas para descifrar el resto de los datos.
Tal vez hay una mejor solución que esto sin embargo?
En el caso más general, un secreto (en esta aplicación, una clave de descifrado de los datos) se puede dividir en acciones de modo que se requiera un cierto 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 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.
En términos generales, lo que hace es encriptar los datos con una clave generada aleatoriamente, y luego anexar las versiones de esa clave aleatoria que se han encriptado con cada clave conocida. Entonces, cualquier persona con una clave válida puede descubrir la clave ''real'' que se utilizó para encriptar los datos.
La manera habitual de hacerlo 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 forma, solo debe almacenar una copia del mensaje cifrado, pero varias copias de su clave.
Si lo entendí correctamente, tiene algunos datos de que está dispuesto a cifrar y distribuir la clave de cifrado dividida en n ''piezas clave''. (En su caso 2 piezas)
Para eso puedes usar la división basada en XOR, así es como funciona: proporcionas el número requerido de piezas - n, y la clave secreta - K. Para generar n piezas de tu clave, necesitas 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 armar 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 tal fin:
Proyecto GitHub: https://github.com/aivarsda/Secret-Key-Split-Util
También puedes probar la aplicación de demostración Secret Key Splitter que usa esa utilidad:
GooglePlay: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter