Von RSACryptoServiceProvider Konstrukteur :
Wenn kein Standardschlüssel gefunden wird, wird ein neuer Schlüssel erstellt.
Dieser Konstruktor erzeugt ein Exchange-Schlüsselpaar, das geeignet ist, Sitzungsschlüssel zu verschlüsseln, so dass sie sicher gespeichert und mit anderen Benutzern ausgetauscht werden können. Der erzeugte Schlüssel entspricht einem Schlüssel, der mit dem AT_KEYEXCHANGE-Wert erzeugt wurde, der in der nicht verwalteten Microsoft Cryptographic API (CAPI) verwendet wird.
Es wird also nur ein neues Schlüsselpaar generiert, wenn es kein bereits erstelltes findet; Sie sollten dies nur für sitzungsbasierte Daten verwenden.
Ein wenig Hintergrundwissen (ich nehme an, Sie verwenden Windows): Asymmetrische Schlüsselpaare sind mit Zertifikaten verbunden. Diese Zertifikate werden verwendet, um asymmetrischen Schlüsseln Vertrauen zu schenken. Jedes Zertifikat kann von einer Zertifizierungsstelle signiert werden (die Stelle, die die asymmetrischen Schlüssel ausstellt). Wenn Sie der Zertifizierungsstelle vertrauen, dann vertrauen Sie auch den asymmetrischen Schlüsseln, die zu einem von dieser Stelle signierten Zertifikat gehören. Alle diese Zertifikate werden in Ihrem "Zertifikatspeicher", auch "Schlüsselspeicher" (Java), "Schlüsselring" (Mac) genannt, gespeichert.
Sie können Ihre Zertifikate einsehen, indem Sie Start > Run > certmgr.msc
. Ihre Zertifikate finden Sie unter Persönlich > Zertifikate. Wenn Sie eines davon öffnen und auf die Seite Certificate Path
sehen Sie die Zertifikatskette bis hin zu einer Zertifizierungsstelle. Wenn das "Root"-Zertifikat, das zur Zertifizierungsstelle gehört, in Ihrem Trusted Root Certification Authorities > Certificates
speichern, dann gilt das Zertifikat als gültig und vertrauenswürdig.
Wenn Sie etwas für einen Benutzer verschlüsseln wollen, sollten Sie in seinen Zertifikatspeicher gehen und sein Verschlüsselungszertifikat herausziehen. Öffnen Sie dazu den Schlüsselspeicher "Aktueller Benutzer", gehen Sie alle Zertifikate darin durch und wählen Sie diejenigen mit der Schlüsselverwendung "Schlüsselverschlüsselung" aus, und wenn es mehrere gibt, fragen Sie den Benutzer, welches er verwenden möchte.
Wenn Sie etwas über ein Dienstkonto verschlüsseln möchten (z. B. einen Webserver), sollten Sie Zertifikate aus dem Schlüsselspeicher "Lokale Maschine" verwenden und Ihrem Dienstkonto nur Lesezugriff auf den privaten Schlüssel gewähren, der mit dem zu verwendenden Zertifikat verbunden ist.
Dies kann geschehen durch X509Store-Klasse zum Beispiel:
X509Store certificateStore = new X509Store("MY", StoreLocation.CurrentUser);
X509Certificate2Collection allCertificates = certificateStore.Certificates;
//Iterate through all certificates
"MY" steht für persönliche Zertifikate, der Rest ist zu finden unter aquí . CurrentUser steht für Benutzerschlüssel, die andere Option ist LocalMachine.
Sobald Sie das gewünschte Zertifikat haben, sollten Sie den öffentlichen Schlüssel zur Verschlüsselung und den privaten Schlüssel zur Entschlüsselung in Verbindung mit einem symmetrischen Schlüssel verwenden. Wenn Sie also einen großen Datensatz zu verschlüsseln haben, würden Sie wie folgt vorgehen:
- Zertifikat erhalten
- Öffentlichen Schlüssel aus dem Zertifikat ziehen
- Symmetrischen Schlüssel generieren (AES)
- Verschlüsseln von Daten mit symmetrischem Schlüssel
- Verschlüsselung des symmetrischen Schlüssels mit dem öffentlichen Schlüssel
- Speichern Sie den verschlüsselten symmetrischen Schlüssel zusammen mit den verschlüsselten Daten und einer Kennung (Seriennummer) für das Zertifikat, das Sie zum Verschlüsseln verwendet haben.
Wenn Sie entschlüsseln, sollten Sie:
- Lesen der Seriennummer aus verschlüsselten Daten
- Zertifikat mit dieser Seriennummer aus dem Schlüsselspeicher ziehen
- Privaten Schlüssel aus dem Zertifikat ziehen
- Entschlüsselung des symmetrischen Schlüssels mit diesem privaten Schlüssel
- Entschlüsselung von Daten mit diesem symmetrischen Schlüssel
- Daten verwenden
Ich habe eine Reihe von Codebeispielen, die dies bewerkstelligen, wenn Sie einen Blick darauf werfen möchten, lassen Sie mich einfach wissen, bei welchem Abschnitt Sie Hilfe benötigen.
Das war wahrscheinlich etwas verwirrend, also lassen Sie mich wissen, was Sie klarstellen möchten.