But say I want the server to encrypt data using the private key and decrypt it using the public key, as a way of distributing data that can be verified to have come from the right server.
Puoi farlo - questo è, ad un livello molto semplicistico, come funziona la firma RSA (nota, semplicistica - c'è un po 'di più in essa).
Rather than modify the code to allow this, can I simply publish the private key and keep the public key secret? Does this affect the security of the system?
Tu non devi pubblicare la chiave privata - RSA è una permutazione trapdoor che significa:
- Se si cripta con una chiave pubblica, è possibile decodificare con la chiave privata.
- Se si cripta con una chiave privata, è possibile decodificare con una chiave pubblica.
Pertanto, RSA supporta sia la firma che la crittografia facendo affidamento sull'utente finale che ha solo la chiave pubblica.
Nel tuo caso, se il cliente desidera verificare i dati provengono dal server, applichi il secondo caso di RSA e decifri i dati delle firme usando la chiave pubblica che hai già.
Inoltre, poiché è una permutazione, non devi assolutamente modificare il tuo codice. Entrambe le chiavi dovrebbero funzionare utilizzando la stessa funzione. Mi aspetterei che qualsiasi libreria crittografica decente abbia API per la verifica delle firme in base ai vari standard esistenti: una di queste sarebbe probabilmente una buona scommessa.
RSA Labs fornisce una bella spiegazione di questo .
Se si desidera estendere questo tra i server, o verificare le comunicazioni client - generare chiavi per ogni entità e scambiare quelle pubbliche. Il processo può quindi essere utilizzato su entrambe le estremità.
Teoricamente parlando, e e d sono intercambiabili (che è il motivo per cui RSA funziona) (uno deve essere designato come segreto e tenuto segreto) ma p e q devono sempre essere tenuti segreti in quanto consentono di derivare d da e e viceversa. Tuttavia, devi essere estremamente attento nella comprensione della chiave privata: il tuo software memorizza p / q nella chiave privata? Se è così, non puoi pubblicarlo così com'è. Inoltre, quando dico intercambiabile - una volta che pubblichi uno di quella coppia (eed con il tuo modulo n) devi proteggere l'altro con la tua vita . In pratica, come Graeme collegato nel commenti e viene spesso scelto come valore piccolo / fisso. Il mio commento su e / d è chiaramente intercambiabile non si applica quando e è facilmente determinato. Fare questo genere di cose ha quindi il potenziale di confusione e cattiva attuazione. Utilizza una libreria di terze parti / non iniziare a pubblicare le chiavi private.