Strumento per la crittografia a chiave pubblica in cui la password è la chiave privata?

11

C'è qualche & libero strumento open source per la crittografia a chiave pubblica, in cui la chiave privata è solo una password scelta?

Ecco di cosa ho bisogno:

  • Voglio fare i backup ogni ora usando uno script
  • Voglio utilizzare solo strumenti open source.
  • I backup devono essere crittografati,
  • Devo essere in grado di decrittografarli senza file.

Non posso usare la crittografia simmetrica per i backup, perché la password non può essere fornita nello script in testo semplice e non posso essere chiesta ogni volta che viene effettuato un backup per la password (ad es. perché quando sono in vacanza di 1 mese, i backup devono essere ancora fatti).

Quindi ho pensato alla crittografia a chiave pubblica, ma tutti gli strumenti che ho letto su memorizzano la chiave privata in un file. Ho paura di perderlo, proprio come tutti gli altri dati (è per questo che sto facendo i backup in primo luogo). Immagina che il mio disco soffra di guasti hardware, qualcuno lo ruba, brucia in un incendio, ecc. Certo, ho dei backup, ma non riesco a decodificarli senza il file della chiave privata, che ora è perso! Naturalmente potrei avere i backup del mio file di chiave privata, ma semplicemente non voglio fare affidamento su un file per decrittografare i miei dati.

Ho trovato una soluzione (almeno dal punto di vista matematico, perché non riesco a trovare nessuno strumento che la implementa). Diciamo che ho la mia password. Facciamo generare una coppia di numeri primi (p1, p2) usando la seguente funzione 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! Abbiamo appena preso una password e l'abbiamo trasformata nella nostra coppia di chiavi privata / pubblica. Ora potrei crittografare il mio backup con la chiave pubblica (usata dallo script) e decodificarlo quando devo senza la necessità di alcun file di chiave privata (perché la mia password è la mia chiave privata con l'aiuto della funzione p2rsapk).

Potrei anche inviare la mia chiave pubblica agli amici, in modo che possano inviarmi messaggi crittografati e posso decrittografarli da qualsiasi luogo senza l'accesso al mio file di chiave privata non più necessario.

Tuttavia, mentre l'idea è abbastanza semplice, non ho trovato nessuno strumento che la implementa. È noto questo approccio? E ci sono strumenti per questo?

EDIT: Non posso sottolineare abbastanza quanto sia importante per me non fare affidamento su un file come chiave privata. Sono ben consapevole dell'approccio in cui si memorizza la chiave privata in un file (eventualmente protetto da password) e i suoi vantaggi e svantaggi, e riconosco che è il modo più sicuro per affrontare molti scenari. Ci sono molti libri, tutorial e pagine man che descrivono come procedere se si desidera la chiave privata in un file. Lo so, ma quando rispondi tieni presente che è un requisito rigoroso che non ci siano file per l'archiviazione della chiave privata.

EDIT2: Sono perfettamente consapevole dei problemi con password deboli. So che la password è il link più debole, quindi supponiamo che userò una password sicura (minimo 50 caratteri incluse lettere maiuscole e minuscole, cifre, simboli e nessuna parola del dizionario).

    
posta user 29.09.2012 - 13:51
fonte

4 risposte

9

Generare la chiave privata deterministicamente da una password è noto e funziona; tuttavia, ha il seguente svantaggio: chiunque può quindi provare a forzare la tua password, poiché la chiave pubblica è pubblica . È sufficiente rieseguire l'algoritmo di generazione della chiave da qualsiasi password potenziale e verificare se il risultato corrisponde alla chiave pubblica.

Raramente vogliamo che le password siano in prima linea, perché siamo esseri umani con cervelli limitati e le password che siamo pronti a ricordare sono piuttosto deboli. I metodi più comuni di utilizzare la password per crittografare il file della chiave privata consentono di aggiungere un certo livello di sicurezza extra gestendo le posizioni in cui sono conservate le copie del file della chiave privata (si desidera più copie, perché la chiave non deve essere persa, ma avere una copia in sicurezza da qualche parte non equivale a renderlo pubblico).

Inoltre, un file di chiave privata crittografato con una password può diventare due file di chiavi private, ciascuno crittografato con una password specifica: in questo modo, due persone possono potenzialmente aprire i backup. Dopotutto, ti preoccupi di perdere i tuoi dati, ma se questo è in una configurazione aziendale, i tuoi colleghi potrebbero preoccuparsi di perdere i dati e, dal punto di vista loro , la perdita di dati può richiedere la forma di essere investiti da un autobus. Nella configurazione password-is-private-key, la protezione contro la perdita della password deve essere condivisa con la password, che non è molto flessibile.

Se si desidera seguire la strada con la chiave password-is-private, sarà probabilmente necessario scrivere il proprio strumento. Troverai quindi molto più semplice usare una chiave ElGamal , che è solo un intero modulo un valore dato q (l'ordine di gruppo, che è pubblico). Il formato OpenPGP supporta le chiavi ElGamal, quindi questo dovrebbe essere relativamente semplice da sviluppare con una libreria OpenPGP, come GnuPG .

    
risposta data 29.09.2012 - 15:20
fonte
2

Qualsiasi software per generare coppie di chiavi asimmetriche usa input casuali. Se il generatore di chiavi riceve lo stesso input casuale due volte, genererà la stessa coppia di chiavi. Quindi puoi generare una coppia di chiavi basata sulla tua password sostituendo l'input casuale con la tua password. Ad esempio, questo può essere fatto in OpenSSL seminando il PRNG con la tua password (o un hash della tua password) prima di chiamare RSA_generate_key.

Se non si scrive codice in C, Cryptico è uno strumento JavaScript con un metodo per generare coppie di chiavi RSA basate su un password.

Detto questo, la soluzione più semplice per le tue esigenze sarebbe quella di generare una coppia di chiavi asimmetriche casuali, crittografare la chiave privata con una chiave simmetrica basata su password e pubblicare la chiave privata crittografata in modo che non possa mai essere persa.

    
risposta data 30.09.2012 - 02:16
fonte
1

Nella crittografia asimmetrica la chiave deve soddisfare diverse relazioni matematiche tra le chiavi pubbliche e private. Funziona prendendo diverse variabili (potrebbero essere numeri primi casuali o grandi o simili a seconda dell'algoritmo) e metterle attraverso 2 diversi gruppi di equazioni, una restituisce una chiave pubblica, l'altra serie di equazioni restituisce la chiave privata.

Questo non è vero per la crittografia a chiave simmetrica in cui la chiave è solo una stringa della lunghezza necessaria.

Mentre è possibile utilizzare una password / frase e inserirla in una funzione di derivazione della chiave basata su password per mapparla su una chiave della lunghezza necessaria per la crittografia a chiave simmetrica, non è possibile utilizzarla per mappare una password a quelle variabili o alla chiave finale in crittografia asimmetrica.

    
risposta data 29.09.2012 - 14:30
fonte
1

I cannot use symmetric encryption for backups, because the password cannot be given in the script in plaintext, and I cannot be asked each time a backup is made for the password (e.g. because when I'm on 1-month holidays, the backups need to be still made).

Potresti generare una chiave simmetrica usando PBKDF2? Lo script non avrebbe la password in chiaro (sebbene la chiave sarebbe ovviamente accessibile), quindi se il problema è semplicemente che la password non può essere memorizzata in quel modo, questa è un'opzione.

    
risposta data 30.09.2012 - 05:10
fonte

Leggi altre domande sui tag