2012-06-22 36 views
11

Per quanto ho capito, le chiavi RSA sono generalmente generate in base a un generatore (forte) casuale.Genera coppia di chiavi RSA in javascript, in base a una password

Invece, voglio crearli in base a una password.

O meglio sul suo hash, ad esempio SHA512 (sha512 (password + sale) + password + pepe)

Questo deve essere fatto lato client, in JavaScript.

Qualcuno saprebbe come fare? Esiste una libreria JavaScript semplice che crea coppie di chiavi RSA in modo deterministico, sulla base di un dato input?

(In realtà, sto citando RSA ma qualsiasi crittografia asimmetrica sicuro sarebbe sufficiente, ho solo bisogno di cifratura pubblica-privata)


Aggiunta: Ho bisogno di questo perché mi sto costruendo una soluzione di comunicazione sicuro, che non ha bisogno di fare affidamento sulla connessione o anche sul server per essere sicuro.

Sto crittografando tutto il contenuto con AES utilizzando chiavi casuali e le chiavi sono crittografate con RSA. L'idea è che Alice possa RSA-crittografare il suo contenuto (o in realtà, la chiave AES per il suo contenuto) con la chiave pubblica di Bob (pertanto la chiave pubblica di Bob deve essere archiviata online).

Successivamente, quando Bob immette di nuovo la password, il suo browser può calcolare in modo deterministico la sua chiave privata RSA privata & sul posto, scaricare il contenuto da Alice e decrittografarlo localmente utilizzando la sua chiave privata.

+0

Creazione di chiavi RSA utilizzando JavaScript? Ricordo di averlo provato da solo. Mi ha distrutto tutta la memoria e ho impiegato un'eternità per calcolare. Sono passato a Java allora. – Amberlamps

+0

Uno schema di crittografia asimmetrico diverso da RSA andrebbe bene pure. Ma ho bisogno di generare le chiavi lato client e crittografare i dati (con la chiave privata) prima di inviarli. La chiave pubblica verrà archiviata sul lato server.Non so se gli approcci ECC sono più veloci? –

+1

La crittografia @SheldonPinkman viene eseguita utilizzando la chiave pubblica, non privata. In ogni caso la tua idea è imperfetta. –

risposta

2

Le chiavi RSA non sono solo bit casuali come la maggior parte degli algoritmi simmetrici, sono esponenti e moduli derivati ​​da grandi numeri primi. Pertanto non vedo alcun modo ragionevole per poterli generare da una password. Vedi this wikipedia article.

Per che cosa utilizzate queste coppie di chiavi? Perché devono essere derivati ​​da una password? Se si desidera utilizzare una password per crittografare qualcosa, è possibile utilizzare un SHA256 (password) per derivare una chiave AES256. (assicurati di leggere su key strengthening se hai intenzione di fare questo).

+0

puoi inizializzare il randomizer con la password, e ottenere la chiave che "dipende" dalla password in questo modo. Ma di solito non c'è alcun motivo pratico per farlo (conosco un caso quando è ragionevole però :). –

+1

Beh, suppongo che la mancanza di un RNG sarebbe una buona causa. Ma ho la sensazione che questo intero schema abbia dei seri difetti di progettazione. –

+2

@Petey: So che le chiavi RSA non sono solo bit casuali, ma potrei semplicemente sostituire il generatore casuale (ovunque si trovi in ​​un generatore di chiavi RSA esistente) con qualcosa che deriva dalla password. Potrebbe anche essere un generatore casuale che viene semplicemente seminato con l'hash della password. In questo modo, la stessa password risulterà esattamente nella stessa chiave RSA. –

9

Sembra che Cryptico possa aiutarti, quando inserisci la tua password come seme per RNG.

+0

Impressionante, sembra perfetto! –

+0

il link non funziona. – Akam

+0

@akam link aggiornato, grazie. –

2

Non posso commentare il mio punctuationbut, ma aggiuntivo per quello che ha detto + Eugene_Mayevski_'EldoS

per javascript puro: https://www.npmjs.com/package/cryptico

per nodejs: https://www.npmjs.com/package/cryptico è necessario:

npm install cryptico 

E aggiungi questa riga:

var cryptico = require("cryptico"); 

per creare oggetti:

function cryptoObj(passPhrase) 
{ 
    this.bits = 1024; //2048; 
    this.passPhrase = passPhrase; 
    this.rsaKey = cryptico.generateRSAKey(this.passPhrase,this.bits); 
    this.rsaPublicKey = cryptico.publicKeyString(this.rsaKey); 

    this.encrypt = function(message){ 
    var result = cryptico.encrypt(message,this.rsaPublicKey); 
    return result.cipher; 
    }; 

    this.decrypt = function(message){ 
    var result = cryptico.decrypt(message, this.rsaKey); 
    return result.plaintext; 
    }; 
} 

console.log('---------------------------------------------------------'); 
var localEncryptor = new cryptoObj("XXyour secret txt or number hereXX"); 

var encryptedMessage = localEncryptor.encrypt('new message or json code here'); 
var decryptedMessage = localEncryptor.decrypt(encryptedMessage); 

console.log(''); 
console.log('>>> Encrypted Message: '+encryptedMessage); 
console.log(''); 
console.log('>>> Decrypted Message: '+decryptedMessage); 
+0

quando uso var cryptico = require ("cryptico"); nel mio componente.ts ho un errore ----- "(SystemJS) errore XHR (404 non trovato) caricamento http: // localhost: 5555/node_modules/crypto.js". – Khushi