mettre en œuvre la RSA in.NET noyau

j'essaie de chiffrer et de déchiffrer des données avec RSA. J'ai regardé teh RSA classe mais je ne vois que la classe abstraite https://msdn.microsoft.com/en-us/library/system.security.cryptography.rsa(v=vs. 110).aspx

j'ai lu que la classe RSA de DNX5 est différente de celle de .net 4.6.1 est-ce que c'est différent de ce que je vois? Si oui, où puis-je trouver la documentation pour l'utiliser? Il apparaît également que RSACryptoServiceProvider ne fonctionne pas .net de base et je n'ai accès qu'à l' RSA classe abstraite.

19
demandé sur mysticalstick 2017-02-01 21:26:57

2 réponses

vous devriez éviter d'utiliser RSACryptoServiceProvider si vous le pouvez. Il ne fonctionne que sur Windows (et C'est l'implémentation RSA la moins bonne sur Windows). S'en tenir à la RSA classe de base, et créer de nouvelles instances via RSA.Create()

Touches Éphémères (Création)

.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

malheureusement, la valeur par défaut pour RSA.Create () on .net Framework est RSACryptoServiceProvider, ce qui ne respecte pas set_KeySize. Donc si vous avez besoin d'éphémères touches vous aurez besoin d'utiliser un code différent sur .net Framework vs .net Core:

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

    DoStuffWithThePrivateKey(rsa);
}

Ou, si vous avez besoin de support des versions antérieures à 4.6 (où RSACng n'existait pas) / 4.6.2 (où la plupart de la .NET Framework travaillé avec bonheur RSACng objets au lieu de RSACryptoServiceProvider objets de), vous pouvez continuer à utiliser l'ancienne implémentation:

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);
}

Éphémère Clés (Importation)

même si RSACng, en général, est plus facile à travailler que RSACryptoServiceProvider, RSACryptoServiceProvider devrait fonctionner très bien dans ce contexte, donc RSA.Create() est bon sur toutes les plateformes:

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

    DoStuffWithWhateverKindOfKeyYouImported(rsa);
}

à Partir d'un certificat:

.NET Core 1.0+, .NET Framework 4.6+

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

ou

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);

Utilisation Nommé/a Persisté Touches (uniquement sous Windows)

j'allais inclure quelques échantillons sur RSACryptoServiceProvider (WinXP+ / CAPI) et RSACng (Win7+/CNG) créer/ouvrir des clés nommées, mais ce n'est pas un scénario très courant dans .NET; et il n'est certainement pas portable (la portabilité vers d'autres os étant l'un des arguments les plus convaincants pour .net Core).

référencement des choses.

pour .NET Core 1.0 et 1.1, vous accédez à la classe de base RSA à partir de System.Security.Cryptography.Algorithms package. Dans .NET Core 2.0, Il sera inclus dans le netstandard référence du paquet.

Si vous besoin pour faire complexe l'interopérabilité avec le système d'exploitation, vous pouvez référencer System.Security.Cryptography.Cng (Windows CNG),System.Security.Cryptography.Csp (Windows CAPI / CryptoServiceProvider), or System.Security.Cryptography.OpenSsl (Linux OpenSSL, macOS OpenSSL) et accéder aux classes compatibles avec interop (RSACng, RSACryptoServiceProvider, RSAOpenSsl). Mais, vraiment, vous ne devriez pas le faire.

Qu'est-RSA.Create() de retour?

  • .net Framework: RSACryptoServiceProvider, à moins d'être modifié par CryptoConfig.
  • .NET Core (Windows): une classe privée qui implémente RSA via CNG, vous ne pouvez pas le lancer sur un type plus spécifique.
  • .NET Core (Linux): une classe privée qui implémente RSA via OpenSSL, vous ne pouvez pas le lancer vers un type plus spécifique.
  • .NET Core (macOS): une classe privée qui implémente RSA via OpenSSL, vous ne pouvez pas le lancer vers un type plus spécifique. (Ceci devrait être via SecureTransforms dans la prochaine version de .net Core)
50
répondu bartonjs 2017-02-02 15:26:17

vous devrez utiliser la bibliothèque dotnetcore à la place. Ajouter le System.Security.Cryptography.Algorithms package Nuget à votre projet. Vous pouvez le trouver ici: Système.Sécurité.Cryptographie.Les algorithmes

il fournit tous les algorithmes communs pour votre projet.

Ici RSACryptoServiceProvider class que vous utiliseriez pour les méthodes Encrypt() et Decrypt ().

4
répondu truemedia 2017-02-01 22:00:01