In questo post non mi soffermerò sulla crittografia asimmetrica, ricordo solo che il principio ha una solida base matematica che lo giustifica. Il primo e più famoso algoritmo è l'RSA dalle iniziali di Ron Rivest, Adi Shamir e Len Adleman del MIT. Storicamente prima di essere brevettato dal MIT fu ideato dal matematico britannico Clifford Cocks (piccola nota a margine.. le scoperte matematiche pure non possono essere brevettate sono considerate patrimonio dell'umanità..) quindi io lo chiamerei CRSA...
La classe del .Net che si occupa di tutte queste problematiche è l'AsymmetricAlgorithm e della quale ne abbiamo due implementazioni:
- RSACryptoServiceProvider: q uesta è proprio l'implementazione dell'algoritmo RSA. Ha alcune proprietà caratteristiche che si occupano del get e del set:
- PersistKeyInCsp
- UseMachineKeyStore
- DSACryptoServiceProvider
Tra i metodi della RSACryptoServiceProvider c'è la FromXmlString che ci permette d'importare la key pair da una stringa XML.
Bello l'XML ma Microsoft ci avvisa che:
"Mantenere una stringa XML contenente una chiave privata in una posizione non protetta è una minaccia alla protezione. La protezione dell'applicazione può essere compromessa se una terza parte non autorizzata può accedere alla chiave privata. Per mantenere una chiave privata in modo sicuro, utilizzare un contenitore di chiavi protetto. Per ulteriori informazioni sul mantenimento delle chiavi private in un contenitore di chiavi, vedere Procedura: archiviare chiavi asimmetriche in un contenitore di chiavi"
Ma come "inviamo al mondo" la nostra chiave pubblica ...
RSACryptoServiceProvider mrsa=new RSACryptoServiceProvider();
RSAParameters publicKey=mrsa.ExportParameters(false);
(nota abbiamo il FromXmlString ci sarà anche contrario... certo
RSACryptoServiceProvider.ToXmlString(true);)
Rapidamente vediamo ( i dettagli nella procedura indicata sopra) che una volta create le chivi private occorre aggiungere:
- un oggetto CspParameters
- specificare la proprietà CspParameters.KeyContainerName
- passare al RSACryptoServiceProvider il CspParameters creato
- e settare a true la proprietà PersistKeyInCsp dell'istanza del RSACryptoServiceProvider
Vista l'ora vado a dormire ...la prossima volta vedremo qualcosa sul data padding