Domanda
Mi è stato assegnato il compito di implementare una libreria PKI in C # per un progetto aziendale e non sono stato in grado di trovarne una buona implementazione. Sembra che ci siano più librerie e molti collegamenti interrotti che puntano a librerie MSDN che sono state rimosse. Ho visto persone che usano Crypt32.dll, persone che costruiscono le proprie librerie, persone che usano P / Invoke per accedere agli archivi di certificati di sistema, persone che estendono le librerie integrate, esempi che semplicemente non si applicano a C # (ad esempio esempi Java), e biblioteche commerciali.
La mia domanda è: quale implementazione / libreria è più consigliata per la semplice crittografia / decrittografia dei dati?
Come sfondo per ciò che ho intenzione di fare con esso, ho semplicemente bisogno di crittografare i messaggi utilizzando una chiave privata (.pfx) e decrittografare con chiavi pubbliche (.cer). La firma e l'autenticazione dei messaggi non sono richieste a questo livello del progetto, anche se potrebbe essere in futuro. Ho visto riferimenti a lunghezze di crittografia che mi rendono inquieto. Dobbiamo essere in grado di crittografare qualsiasi messaggio di lunghezza (entro limiti ragionevoli, ovviamente!). È qualcosa di cui devo preoccuparmi e, in tal caso, c'è un modo per affrontarlo?
Preferirei non archiviare le chiavi pubbliche / private nel gestore certificati di Windows, se possibile, ma se rende l'implementazione significativamente più semplice, così sia.
Mi rendo conto che la PKI e la crittografia sono un argomento ampio e complesso, ma spero comunque in una libreria relativamente semplice ... (si può sperare, vero?)
Grazie!
Soluzione
Bene, non hai detto che la classe integrata non copre le tue necessità, quindi che ne dici di System.Security.Cryptography.RSACryptoServiceProvider ?
Ha una vasta gamma di modi qualificati per crittografare / decrittografare asimmetricamente i flussi.
Esistono diversi tutorial / guide che ti accompagneranno lungo il percorso:
http://www.codeproject.com/KB/security/RSACryptoPad.aspx
http://www.eggheadcafe.com/articles/20020630.asp
Ce ne sono molte altre da trovare in Google .
Aggiorna : per quanto riguarda i limiti di lunghezza, non dovrebbero esserci problemi se si implementa lo stesso algoritmo buffer su entrambi i lati, crittografia e decrittografia.
Aggiornamento2 : Sì, il mio esempio era RSACryptoProvider , ma è possibile utilizzare qualsiasi classe derivata da System.Security.Cryptography.AsymmetricAlgorithm , se vuoi una chiave pubblica / privata -soluzione. O costruisci il tuo ... o forse no :)
Altri suggerimenti
Sì, cosa c'è che non va nelle classi integrate?
E se non vuoi usare l'archivio certificati di Windows puoi usare qualcosa del genere
RSACryptoServiceProvider rscp = new RSACryptoServiceProvider();
rscp.FromXmlString("<RSAKeyValue><Modulus>key data gere</Modulus><Exponent></Exponent></RSAKeyValue>");
Non sono sicuro che questa sia una buona idea per le chiavi private, tuttavia.
Esiste un buon tutorial sull'argomento qui