none
Cryptage avec RSACryptoServiceProvider et clé privée d'un fichier pem RRS feed

  • Question

  • Bonjour,

       Je cherche de l'aide. Je n'arrive pas à crypter avec RSACryptoServiceProvider.
       J'ai une erreur que je ne comprends pas. Je suis nouveau développeur en c#. Toute aide serait la bienvenue.
      
       Je dois crypter avec une clé privée qui m'est fournie par openssl dans un .PEM
       A priori je ne suis pas obligé de passer par un X509Certificate2. Mais je n'ai pas su faire autrement.
       Mon problème vient de là : même si j'arrive à lire le fichier et à récupérer la clé (je la vois en debug) j'ai une
       CryptographicException qui me dit {"Impossible de trouver l’objet requis.\r\n"}.
      
       que je construise mon X509Certificate2 en passant un tableau de bytes ( en lisant le .PEM) ou que je charge directement le fichier pem j'ai l'erreur.
       Quelqu'un aurait-il une idée? J'ai peut être fait une erreur de débutant, ou passé des mauvais paramètres à mon RSACryptoServiceProvider
       Voici le code :
      

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    using System.Security.Cryptography.X509Certificates;

    namespace CryptoBiblio
    {
        public class Cryptography
        {
           public static RSACryptoServiceProvider rsa;

           public static void AssignParameter()
           {
               const int PROVIDER_RSA_FULL = 1;
               const string CONTAINER_NAME = "SpiderContainer";
               CspParameters cspParams;
               cspParams = new CspParameters(PROVIDER_RSA_FULL);
               cspParams.KeyContainerName = CONTAINER_NAME;
               cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
               cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";

               rsa = new RSACryptoServiceProvider(cspParams);

           }

            //privateOnlyKey = chemin où se trouve mon fichier pem : c:\temp
            public static string EncryptData(string data2Encrypt, string privateOnlyKey)
            {
                AssignParameter();
                SHA1 sha1 = SHA1.Create();
               
                //Load private key
               X509Certificate2 Key = new X509Certificate2(privateOnlyKey);


                byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(data2Encrypt);
              
                // Create our hash
                byte[] hashedBytes = sha1.ComputeHash(plainbytes);

                rsa.SignHash(hashedBytes, CryptoConfig.MapNameToOID("SHA1"));

                byte[] cipherbytes = rsa.Encrypt(hashedBytes, true); // true pour oaep padding

                return Convert.ToBase64String(cipherbytes);
            } 
        }
    }

    dimanche 5 décembre 2010 12:54

Réponses

Toutes les réponses

  • Bonjour,

    Sur quelle ligne obtenez vous l'exception ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 5 décembre 2010 13:35
    Modérateur
  • X509Certificate2 Key = new X509Certificate2(privateOnlyKey);

    C'est vraiment quand je charges mon PEM

    dimanche 5 décembre 2010 13:49
  • Bonjour,

    Pouvez-vous confirmer que la variable privateOnlyKey contient le chemin complet du certificat X509 ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    dimanche 5 décembre 2010 17:02
    Modérateur
  • Merci de votre réponse.

    Suite à votre réflexion j'ai appelé un toto.crt qu'on m'avait aussi généré pour test. Là le code crypt bien car le X509Certificate2 charge bien le toto.crt.

    Par contre si je ne veux pas passer par un certificat mais juste utilisé la clé privé qu'on me génère en tant que toto.pem ça ne passe pas.

    Le chemin est bon et en debug je vois bien la clé, mais j'ai toujours l'exception. Le X509Certificate2  ne prend peut être qu'un certificat.

    En gros je ne sais comment faire pour utiliser un .pem. Voilà ce que j'ai dans mon PEM.

    -----BEGIN RSA PRIVATE KEY-----
    MIICWwIBAAKBgQDAcRFbEqdb7TM3aQZqNPanYnNelnRvgvEdUC1XQ4Ccju4N8GS2
    0bFsFf6jN4lZW6R8jaN0XKHW3cRChwbrtXVKPH2fKWghDyd4L6MJndb2yezoPqQG
    5RbyXgjfSh0cqL4WuhYgNq6XdySOffhmuyNUf/+XAE6uMFJ3COcztUuwSQIDAQAB
    AoGADo4+ztGpYPWfAxjpiEz7PwveSBA/PFP+IsZ2t3v+lVjmPp2pMH7J2bAMM5I2
    zFB3L4iTDXEYOKVLe/C0oE14UoRMEZ9Yed4TFfx2EiXKsrKpw94nxD8sjFk/FSPJ
    HDDWuOPaYObobgcPIqX4mCSfegYynATKK/nQ4jOGXOh99IECQQD7eFquLriXkz08
    YGntiziHYx6CYwVcbGxqWZOSLv1AYTNJcbCDoKZyUXwrQ/Y81RuMxwlPKW1DF6R7
    M88craBZAkEAw+iBgNkvHRnUnWy75Lj/NaepnefzYuzBdOBJPxHpzb6qMEek+zxf
    dd13l3t4VQKHxp6KG6A6/P0OITgLXNIRcQJAWe3vl+zzbJlmQ8pC94VbQOeMiJp6
    11Oa7el84cFWJgjcu34h3uC7xZQocJyMWbLoeE7RoHKzNVQmKT0c6yeYeQJAGU9p
    o87rYlQa/ve0Url/51uw80CrViWGXOY5MFfNIBK5BCHNc9P59U1WjRCbnEgGaKfE
    6grKdDLxZ2NJPIW7UQJAHe1Mm9cgZ9C/QtMipVukWgNlltbdK2yirwuFpGszgx6y
    FcMSe6EcHcK/9ophGVepEk5maSiHYXnDO6IzZJLLcA==
    -----END RSA PRIVATE KEY-----

    dimanche 5 décembre 2010 18:36
  • En fait mon code actuel ne me permet pas de crypter avec la clé privé qui est généré au niveau du openssl. Que j'utilise le ClefPrivee.pem ou le cle-privee.key généré avec mon certificat, cela ne fonctionne pas.

    Je n'ai pas trouvé la bonne syntaxe.

    Pour le moment X509Certificate2 Key = new X509Certificate2(privateOnlyKey); fonctionne bien en mettant le chemin du ".crt", mais ce n'est pas ce que je veux faire, puisque je dois crypter avec une clé privée.

     

    lundi 6 décembre 2010 07:49
  • J'ai rajouté ça pour tester mon certificat : Je tombe en erreur : a priori mon crt ne contient pas de clé privé.

    Et je n'ai toujours pas reussi à me passer d'un certificat pour utiliser qu'un fichier .pem

     

     

    X509Certificate2 myCertificate;

     

     

    try

    {

    myCertificate =

     

    new X509Certificate2(PathToPrivateKeyFile);

    }

     

     

    catch

    {

     

     

    throw new CryptographicException("Unable to open key file.");

    }

     

     

    if (myCertificate.HasPrivateKey)

    {

    rsa = (

     

    RSACryptoServiceProvider)myCertificate.PrivateKey;

    }

     

     

    else throw new CryptographicException("Private key not contained within certificate.");

    lundi 6 décembre 2010 09:00
  • J'ai trouvé mon bonheur là : http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/d7e2ccea-4bea-4f22-890b-7e48c267657f

    J'encrypte bien avec une clé privée de mon fichier PEM.

    Par contre je voudrais décoder mais je n'y arrive pas. Me faudrait un DecodeRSAPrivateKey à l'inverse de l'exemple

    lundi 6 décembre 2010 17:02
  • Bonjour,

     

    Pour chiffrer et déchiffrer avec l’algorithme asymétrique RSA, consultez la documentation et les exemples MSDN pour la classe RSACryptoServicePorvider.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    • Marqué comme réponse Alex Petrescu mercredi 15 décembre 2010 10:07
    lundi 13 décembre 2010 12:47