Esa es una idea que vale la pena investigar.
Como muestra @caf, una clave privada RSA tiene una gran cantidad de estructura interna, que es fácilmente reconocible. Sería muy difícil diseñar un esquema de cifrado basado en contraseñas, de modo que el descifrado de una clave RSA cifrada con la contraseña incorrecta aún produzca algo que parece una clave privada RSA válida.
Sin embargo, esto es relativamente fácil de hacer con las teclas DSA (y también con la variante de curva elíptica ECDSA ). Una clave privada de DSA utiliza parámetros clave (llamados p , q y g ) que no deben ser secretas (También están presentes en la clave pública correspondiente); la única parte realmente privada en la clave es x , un módulo de enteros q . Cualquier módulo entero q es una clave privada válida de DSA. Así que puedes hacer un cifrado basado en contraseña de x de esa manera:
- Elija q para que sea un número de 256 bits (es decir, 2 255 < q < 2 256 ).
- Use un cifrado de bloque con bloques de 256 bits (por ejemplo, Rijndael : el AES es Rijndael con bloques de 128 bits y claves de 128 bits, 192 bits o 256 bits, pero el Rijndael original también tiene un modo con bloques de 256 bits).
- Para cifrar x con una contraseña, primero derive una clave de la contraseña (use bcrypt !) y luego encripta x (como una cadena de 256 bits) con Rijndael. Si la cadena resultante no está (cuando se interpreta como un número) en el rango [0..q-1] , encripta nuevamente, y nuevamente, hasta que regreses al rango esperado. En promedio, deberás llamar a Rijndael menos de dos veces, por lo que no es difícil computacionalmente.
- Para descifrar x , simplemente derive una clave de la contraseña escrita y aplique el descifrado de Rijndael. De nuevo, hazlo de forma recursiva hasta que vuelvas al rango [0..q-1] .
Así que esto es factible. Es una buena idea ? La ventaja de este cifrado es que la contraseña ya no puede ser impuesta por un atacante que obtuvo una copia de la clave privada cifrada. Por otro lado, si el atacante también tiene una copia de la clave pública, entonces puede verificar fácilmente que se ha descifrado con la contraseña correcta. Dado que la clave pública debe ser pública, no necesariamente se mantiene tan confidencial como la clave privada. El servidor de destino lo tiene. En realidad, los servidores todos para los que se utiliza la clave privada para iniciar sesión tienen una copia de la clave pública. Así que la clave pública es moderadamente confidencial, en el mejor de los casos. Por lo tanto, la ventaja proporcionada por el "cifrado de contraseña no verificable" como se describe anteriormente, parece tenue. Por otro lado, tiene el siguiente inconveniente: si el usuario escribe mal su contraseña, el servidor sigue siendo interrogado, y SSH ya no puede distinguir entre "usuario hurgó con su teclado" y "hay algo mal en el servidor".
Entonces, mientras que lo que solicita es factible para al menos algunos tipos clave, es comprensible que aún no se haya implementado. No es una victoria indiscutible; es una compensación entre usabilidad y seguridad (perderías un poco de usabilidad para obtener un poco de seguridad).