¿Herramienta para la criptografía de clave pública donde contraseña es la clave privada?

11

¿Hay algún archivo gratuito & herramienta de código abierto para criptografía de clave pública, donde la clave privada es solo una contraseña elegida?

Esto es lo que necesito:

  • Quiero hacer copias de seguridad cada hora usando un script
  • Quiero usar solo herramientas de código abierto.
  • Las copias de seguridad deben estar cifradas,
  • Necesito poder descifrarlos sin ningún archivo.

No puedo usar el cifrado simétrico para las copias de seguridad, porque la contraseña no se puede dar en el script en texto sin formato, y no se me puede preguntar cada vez que se realiza una copia de seguridad de la contraseña (por ejemplo, porque cuando estoy en vacaciones de 1 mes, las copias de seguridad aún deben realizarse).

Así que pensé en la criptografía de clave pública, pero todas las herramientas que leí sobre almacenan la clave privada en un archivo. Tengo miedo de perderla, al igual que todos los demás datos (es por eso que hago copias de seguridad en primer lugar). Imagine que mi disco sufre una falla de hardware, alguien lo roba, se quema en un incendio, etc. Claro, tengo copias de seguridad, pero no puedo descifrarlas sin el archivo de clave privada, ¡que ahora está perdido! Por supuesto, podría tener copias de seguridad de mi archivo de clave privada, pero simplemente no quiero confiar en un archivo para descifrar mis datos.

Encontré una solución (al menos desde el punto de vista matemático, porque no encuentro ninguna herramienta implementando esto). Digamos que tengo mi contraseña. Generemos un par de números primos (p1, p2) usando la siguiente función p2rsapk:

(p1,p2) = p2rsapk(password) = {
  bits = password as vector of bits
  (n1,n2) = split bits into two parts in deterministic way, e.g. just take halves
  p1 = find prime based on n1, e.g. lowest prime p1 s.t. p1 > 2^n1-2
  p2 = find prime based on n2
}

Voila! Acabamos de tomar una contraseña y la convertimos en nuestro par de claves privada / pública. Ahora podría cifrar mi copia de seguridad con la clave pública (utilizada por el script) y descifrarla cuando sea necesario sin necesidad de ningún archivo de clave privada (porque mi contraseña ES mi clave privada con la ayuda de la función p2rsapk).

También podría enviar mi clave pública a mis amigos para que me envíen mensajes cifrados, y puedo descifrarlos desde cualquier lugar sin el acceso a mi archivo de clave privada que ya no necesito.

Sin embargo, aunque la idea es bastante simple, no he encontrado ninguna herramienta que la implemente. ¿Se conoce este enfoque? ¿Y hay herramientas para esto?

EDITAR: No puedo enfatizar lo suficiente lo importante que es para mí no confiar en un archivo como clave privada. Soy muy consciente del enfoque en el que uno almacena la clave privada en un archivo (posiblemente protegido por contraseña) y sus ventajas y desventajas, y reconozco que es la forma más segura de ir en muchos escenarios. Hay muchos libros, tutoriales y páginas de manual que describen cómo proceder si uno quiere la clave privada en un archivo. Lo sé, pero al responder, tenga en cuenta que es un requisito estricto que no haya un archivo para almacenar la clave privada.

EDIT2: Soy perfectamente consciente de los problemas con contraseñas débiles. Sé que la contraseña es el enlace más débil, así que supongamos que usaré una contraseña segura (con un mínimo de 50 caracteres, incluyendo letras en mayúsculas y minúsculas, dígitos, símbolos y sin palabras del diccionario).

    
pregunta user 29.09.2012 - 13:51
fuente

4 respuestas

9

La generación de la clave privada de manera determinista a partir de una contraseña es conocida y funciona; sin embargo, tiene el siguiente inconveniente: cualquiera puede intentar forzar la contraseña, ya que la clave pública es pública . Basta con volver a ejecutar el algoritmo de generación de claves desde cualquier contraseña potencial y ver si el resultado coincide con la clave pública.

Rara vez queremos que las contraseñas estén en la línea del frente, porque somos seres humanos con un cerebro limitado, y las contraseñas que estamos listos para recordar son bastante débiles. Los métodos más comunes de usar la contraseña para cifrar el archivo de clave privada permiten agregar cierto nivel de seguridad adicional al administrar las ubicaciones donde se guardan las copias del archivo de clave privada (usted quiere varias copias, porque la clave no debe perderse, pero tener una copia en un lugar seguro no es lo mismo que hacerlo público).

Además, un archivo de clave privada cifrada con una contraseña puede convertirse en dos archivos de clave privada, cada uno cifrado con una contraseña específica: de esta manera, dos personas pueden abrir las copias de seguridad. Después de todo, se preocupa por perder sus datos, pero si esto está en una configuración empresarial, sus colegas también podrían preocuparse por perder los datos y, desde su punto de vista , , la pérdida de datos puede tomar La forma en que eres atropellado por un autobús. En la configuración de la contraseña es clave privada, la protección contra la pérdida de la contraseña debe compartir la contraseña, que no es muy flexible.

Si desea seguir el camino de la contraseña es clave privada, probablemente tendrá que escribir su propia herramienta. A continuación, le resultará mucho más fácil utilizar una tecla ElGamal , que es solo un módulo entero, un valor dado q (el orden del grupo, que es público). El formato OpenPGP es compatible con las claves de ElGamal, por lo que debería ser relativamente fácil de desarrollar con una biblioteca OpenPGP, como GnuPG .

    
respondido por el Thomas Pornin 29.09.2012 - 15:20
fuente
2

Cualquier software para generar pares de claves asimétricas utiliza una entrada aleatoria. Si el generador de claves recibe la misma entrada aleatoria dos veces, generará el mismo par de claves. Por lo tanto, puede generar un par de claves basado en su contraseña al reemplazar la entrada aleatoria con su contraseña. Por ejemplo, esto se puede hacer en OpenSSL sembrando el PRNG con su contraseña (o un hash de su contraseña) antes de llamar a RSA_generate_key.

Si no codifica en C, Cryptico es una herramienta de JavaScript con un método para generar pares de claves RSA basados en un contraseña.

Dicho esto, la solución más sencilla para sus necesidades sería generar un par de claves asimétricas aleatorias, cifrar la clave privada con una clave simétrica basada en contraseña y publicar la clave privada cifrada para que nunca se pierda.

    
respondido por el David Wachtfogel 30.09.2012 - 02:16
fuente
1

En la criptografía asimétrica, la clave debe satisfacer varias relaciones matemáticas entre las claves pública y privada. Los trabajos toman varias variables (pueden ser primos aleatorios, grandes o similares según el algoritmo) y al colocarlas en 2 conjuntos diferentes de ecuaciones, uno devuelve una clave pública y el otro conjunto devuelve la clave privada.

Esto no es cierto para la criptografía de clave simétrica donde la clave es solo una cadena de la longitud necesaria.

Por lo tanto, puede usar una contraseña / frase y insertarla en una función de derivación de clave basada en contraseña para asignarla a una clave de la longitud necesaria para la criptografía de clave simétrica, no hay forma de usarla para asignar una contraseña ya sea a esas variables o la clave final en criptografía asimétrica.

    
respondido por el ewanm89 29.09.2012 - 14:30
fuente
1
  

No puedo usar el cifrado simétrico para las copias de seguridad, porque la contraseña no se puede dar en el script en texto sin formato, y no se me puede preguntar cada vez que se realiza una copia de seguridad de la contraseña (por ejemplo, porque cuando estoy en vacaciones de 1 mes, las copias de seguridad aún deben realizarse).

¿Podrías generar una clave simétrica usando PBKDF2? La secuencia de comandos no tendría la contraseña en texto simple (aunque la clave sería obviamente accesible), por lo que si el problema es simplemente que la contraseña no se puede almacenar de esa manera, esta es una opción.

    
respondido por el Stephen Touset 30.09.2012 - 05:10
fuente

Lea otras preguntas en las etiquetas