RSA in .NET Core implementieren

9

Ich versuche, einige Daten mit RSA zu verschlüsseln und zu entschlüsseln. Ich habe die RSA -Klasse nachgeschlagen, aber ich sehe nur die abstrakte Klasse Ссылка

Ich habe gelesen, dass sich die RSA-Klasse in DNX5 von der in .NET unterscheidet. 4.6 Ist das eine andere als die, die ich sehe? Wenn ja, wo kann ich die Dokumentation finden, um diese zu verwenden? Es scheint auch, dass RSACryptoServiceProvider in .net core nicht funktioniert und ich nur Zugriff auf die abstrakte Klasse RSA habe.

    
mysticalstick 01.02.2017, 18:26
quelle

2 Antworten

31

Sie sollten vermeiden, RSACryptoServiceProvider zu verwenden, wenn Sie können. Es funktioniert nur unter Windows (und es ist die weniger gute RSA-Implementierung unter Windows). Bleiben Sie bei der Basisklasse RSA und erstellen Sie neue Instanzen über RSA.Create()

Ephemere Schlüssel (Erstellung)

.NET Core

%Vor%

.NET Framework

Leider ist der Standardwert für RSA.Create () in .NET Framework RSACryptoServiceProvider, der set_KeySize nicht berücksichtigt. Wenn Sie also ephemere Schlüssel benötigen, müssen Sie für .NET Framework und .NET Core anderen Code verwenden:

%Vor%

Oder, wenn Sie Versionen vor 4.6 unterstützen müssen (wo RSACng nicht existierte) / 4.6.2 (wo das meiste von .NET Framework glücklich mit RSACng-Objekten anstatt mit RSACryptoServiceProvider-Objekten funktionierte), können Sie weiterhin das verwenden ältere Implementierung:

%Vor%

Ephemere Schlüssel (Import)

Obwohl RSACng im Allgemeinen einfacher zu verwenden ist als RSACryptoServiceProvider, sollte RSACryptoServiceProvider in diesem Kontext gut funktionieren, sodass RSA.Create () auf allen Plattformen gut ist:

%Vor%

Aus einem Zertifikat:

.NET Core 1.0+, .NET Framework 4.6 +

%Vor%

oder

%Vor%

.NET Framework & lt; 4.6

%Vor%

Benannte / beibehaltene Schlüssel verwenden (nur Windows)

Ich wollte einige Beispiele über RSACryptoServiceProvider (WinXP + / CAPI) und RSACng (Win7 + / CNG) hinzufügen, die benannte Schlüssel erstellen / öffnen, aber das ist kein sehr häufiges Szenario in .NET; und es ist sicherlich nicht portierbar (Portabilität zu anderen Betriebssystemen ist eines der überzeugenderen Argumente für .NET Core).

Verweise auf Dinge.

Für .NET Core 1.0 und 1.1 erhalten Sie Zugriff auf die RSA-Basisklasse aus dem System.Security.Cryptography.Algorithms -Paket. In .NET Core 2.0 wird es in die netstandard -Referenz aufgenommen.

Wenn Sie komplexe Interoperabilität mit dem Betriebssystem benötigen, können Sie System.Security.Cryptography.Cng (Windows CNG), System.Security.Cryptography.Csp (Windows CAPI / CryptoServiceProvider) oder System.Security.Cryptography.OpenSsl (Linux OpenSSL, macOS OpenSSL) und erhalten Zugriff auf die Interop-fähigen Klassen (RSACng, RSACryptoServiceProvider, RSAOpenSsl). Aber eigentlich solltest du das nicht tun.

Was gibt RSA.Create () zurück?

  • .NET Framework: RSACryptoServiceProvider, sofern nicht von CryptoConfig.
  • geändert
  • .NET Core (Windows): Eine private Klasse, die RSA über CNG implementiert, kann nicht in einen spezifischeren Typ umgewandelt werden.
  • .NET Core (Linux): Eine private Klasse, die RSA über OpenSSL implementiert, kann nicht in einen spezifischeren Typ umgewandelt werden.
  • .NET Core (macOS): Eine private Klasse, die RSA über OpenSSL implementiert, kann nicht in einen spezifischeren Typ umgewandelt werden. (Dies sollte via SecureTransforms in der nächsten Version von .NET Core sein)
bartonjs 02.02.2017, 15:26
quelle
1

Sie müssen stattdessen die dotnetcore-Bibliothek verwenden. Fügen Sie Ihrem Projekt das System.Security.Cryptography.Algorithms Nuget-Paket hinzu. Sie finden es hier: System.Security.Cryptography.Algorithms

Es bietet alle gängigen Algorithmen für Ihr Projekt.

Hier ist die RSACryptoServiceProvider-Klasse , die Sie verwenden würden für die Methoden Encrypt () und Decrypt ().

    
truemedia 01.02.2017 19:13
quelle