Questa è un'idea che vale la pena investigare.
Come mostra @caf, una chiave privata RSA ha molte strutture interne, che sono facilmente riconoscibili. Sarebbe molto difficile progettare uno schema di crittografia basato su password in modo tale che la decrittazione di una chiave RSA crittografata con la password errata restituisca comunque qualcosa che assomiglia a una chiave privata RSA valida.
Tuttavia, questo è relativamente facile da fare con i tasti DSA (e anche con la variante della curva ellittica ECDSA ). Una chiave privata DSA utilizza i parametri chiave (chiamati p , q e g ) che non devono essere segreti (sono presenti anche nella corrispondente chiave pubblica); l'unica parte veramente privata nella chiave è x , un modulo intero q . Qualsiasi modulo intero q è una chiave privata DSA valida. In questo modo puoi creare una crittografia basata su password di x in questo modo:
- Scegli q come numero a 256 bit (cioè 2 255 < q < 2 256 ).
- Utilizza un codice a blocchi con blocchi a 256 bit (ad es. Rijndael - AES è Rijndael con blocchi a 128 bit e 128 bit, 192 bit o 256 bit, ma il Rijndael originale ha anche una modalità con blocchi a 256 bit).
- Per crittografare x con una password, devi prima ottenere una chiave dalla password (usa bcrypt !) e quindi criptare x (come stringa a 256 bit) con Rijndael. Se la stringa risultante non è (se interpretata come un numero) nell'intervallo [0..q-1] , quindi crittografarla di nuovo, e di nuovo, fino a tornare all'intervallo previsto. In media, dovrai chiamare Rijndael meno di due volte, quindi non è molto difficile da calcolare.
- Per decodificare x , basta ricavare una chiave dalla password digitata e applicare la decrittazione di Rijndael. Ancora una volta, fallo in modo ricorsivo finché non torni all'intervallo [0..q-1] .
Quindi questo è fattibile. È una buona idea? Il vantaggio di tale crittografia è che la password non può più essere forzata brutalmente da un utente malintenzionato che ha ottenuto una copia della chiave privata crittografata. D'altra parte, se l'utente malintenzionato ha anche una copia della chiave pubblica, può facilmente verificare che abbia decodificato con la password corretta. Essendo la chiave pubblica, beh, destinata a essere pubblica, non è necessariamente mantenuta riservata come la chiave privata. Il server di destinazione ce l'ha. In realtà, i tutti server per i quali viene utilizzata la chiave privata per l'accesso hanno una copia della chiave pubblica. Quindi la chiave pubblica è solo moderatamente riservata, nel migliore dei casi. Pertanto, il vantaggio offerto dalla "crittografia della password non verificabile" come descritto sopra, sembra debole. D'altra parte, ha il seguente svantaggio: se l'utente digita la sua password, il server è ancora interrogato, e SSH non può più fare la distinzione tra "l'utente armeggia con la sua tastiera" e "c'è qualcosa di sbagliato sul server".
Quindi, mentre quello che chiedi è fattibile almeno per alcuni tipi chiave, è comprensibile che non sia stato ancora implementato (ancora). Non è una vittoria incontrastata; è un compromesso tra usabilità e sicurezza (perdi un po 'di usabilità per guadagnare un po' di sicurezza).