it-swarm.com.de

Implementieren Sie RSA in .NET Core

Ich versuche, einige Daten mit RSA zu ver- und entschlüsseln. Ich habe die Klasse RSA nachgeschlagen, sehe aber nur die abstrakte Klasse https://msdn.Microsoft.com/en-us/library/system.security.cryptography.rsa) v = vs.110) .aspx

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

27
mysticalstick

Sie sollten die Verwendung von RSACryptoServiceProvider vermeiden, wenn Sie können. Es funktioniert nur unter Windows (und es ist die weniger gute RSA-Implementierung unter Windows). Halten Sie sich an die Basisklasse RSA und erstellen Sie neue Instanzen über RSA.Create()

Vergängliche Schlüssel (Schöpfung)

.NET Core

using (RSA rsa = RSA.Create())
{
    rsa.KeySize = desiredKeySizeInBits;

    // when the key next gets used it will be created at that keysize.
    DoStuffWithThePrivateKey(rsa);
}

.NET Framework

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

using (RSA rsa = new RSACng())
{
    rsa.KeySize = desiredKeySizeInBits;

    DoStuffWithThePrivateKey(rsa);
}

Wenn Sie frühere Versionen als 4.6 (in denen RSACng nicht vorhanden war)/4.6.2 (in denen die meisten .NET Framework-Objekte problemlos mit RSACng-Objekten statt mit RSACryptoServiceProvider-Objekten zusammengearbeitet haben) unterstützen müssen, können Sie die ältere Implementierung weiterhin verwenden:

using (RSA rsa = new RSACryptoServiceProvider(desiredKeySizeInBits))
{
    // Since before net46 the Encrypt/Decrypt, SignData/VerifyData, SignHash/VerifyHash
    // methods were not defined at the RSA base class, you might need to keep this strongly
    // typed as RSACryptoServiceProvider.
    DoStuffWithThePrivateKey(rsa);
}

Kurzlebige Schlüssel (Import)

Obwohl die Arbeit mit RSACng im Allgemeinen einfacher ist als mit RSACryptoServiceProvider, sollte RSACryptoServiceProvider in diesem Kontext einwandfrei funktionieren, sodass RSA.Create () auf allen Plattformen funktioniert:

using (RSA rsa = RSA.Create())
{
    rsa.ImportParameters(rsaParameters);

    DoStuffWithWhateverKindOfKeyYouImported(rsa);
}

Aus einem Zertifikat:

.NET Core 1.0+, .NET Framework 4.6+

using (RSA rsa = cert.GetRSAPublicKey())
{
    DoStuffWithThePublicKey(rsa);
}

oder

using (RSA rsa = cert.GetRSAPrivateKey())
{
    DoStuffWithThePrivateKey(rsa);
}

.NET Framework <4.6

// Do NOT put this in a using block, since the object is shared by all callers:
RSA rsaPrivate = (RSA)cert.PrivateKey;
DoStuffWithThePrivateKey(rsaPrivate);

// Do NOT put this in a using block, since the object is shared by all callers:
RSA rsaPublicOnly = (RSA)cert.PublicKey.Key;
DoStuffWithThePublicKey(rsaPublic);

Verwenden von benannten/dauerhaften Schlüsseln (nur Windows)

Ich wollte einige Beispiele über RSACryptoServiceProvider (WinXP +/CAPI) und RSACng (Win7 +/CNG) einfügen, die benannte Schlüssel erstellen/öffnen, aber das ist in .NET kein sehr verbreitetes Szenario. und es ist sicherlich nicht portabel (die Portierbarkeit auf andere Betriebssysteme ist eines der überzeugendsten Argumente für .NET Core).

Dinge referenzieren.

Für .NET Core 1.0 und 1.1 erhalten Sie Zugriff auf die RSA-Basisklasse von System.Security.Cryptography.Algorithms Paket. In .NET Core 2.0 ist es in der Paketreferenz netstandard enthalten.

Wenn Sie müssen, um komplexe Interop mit dem Betriebssystem zu tun, 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 wirklich, das solltest du nicht tun.

Was gibt RSA.Create () zurück?

  • .NET Framework: RSACryptoServiceProvider, sofern nicht durch CryptoConfig geändert.
  • .NET Core (Windows): Eine private Klasse, die RSA über CNG implementiert. Sie können sie nicht auf einen bestimmten Typ umwandeln.
  • .NET Core (Linux): Eine private Klasse, die RSA über OpenSSL implementiert. Sie können sie nicht in einen spezifischeren Typ umwandeln.
  • .NET Core (macOS): Eine private Klasse, die RSA über OpenSSL implementiert. Sie können sie nicht auf einen bestimmten Typ umwandeln. (Dies sollte über SecureTransforms in der nächsten Version von .NET Core erfolgen.)
63
bartonjs

Sie müssen stattdessen die dotnetcore-Bibliothek verwenden. Ergänzen Sie die System.Security.Cryptography.Algorithms Nuget-Paket zu Ihrem Projekt. Sie finden es hier: System.Security.Cryptography.Algorithms

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

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

4
truemedia