IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] problème crypto RSA


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par défaut [C#] problème crypto RSA
    Bonjour,
    Je souhaiterai faire un decryptage de datas.
    Je dispose d'une clé public, d'un exponent et d'une signature.

    voici comment se présente mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
                  RSAParameters RSAKeyInfo = new RSAParameters();
                  RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                                byte[] modulus = new byte[256];
                  byte[] exponent = new byte[4];
                  byte[] signature = new byte[256];
                  string publicKey = "DCD424....";
     
              try
              {
                  RSAKeyInfo .Modulus =  (byte[]) SCUtil.ToByteArray(PublicKey);       //  ce ke donne SCUtil.ToByteArray >>> 0xD4 0xDC 0x24 .....                
     RSAKeyInfo .Exponent = (byte[]) SCUtil.ToByteArray("00010001");                                                      // 0x01 0x00 0x01
                  signature = (byte[])SCUtil.ToByteArray(dataXml.DataSecurity.SecuritySignature);       // string contenant valeur hexa
     
                  RSAKeyInfo.Modulus = modulus;
                  RSAKeyInfo.Exponent = exponent;
     
                  RSA.ImportParameters(RSAKeyInfo);
     
                  byte[] decrypt =  RSA.Decrypt(signature, false);                      //  c'est ici que je recoit le message "clé incorrecte"
     
              }
              catch (CryptographicException e)
              {
                  Console.WriteLine(e.ToString());
              }
    Ca doit surement provenir du contenu de ma clé qui contient des valeurs hexadécimal.

    Voici ce que contient mon fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               <PublicKeyValue>
                 D4DC249F78996EC47E328B965506CD939ECBBEA4F450CB ......
                         </PublicKeyValue>
    Le problème je pense se situe sur le contenu de ma clé.
    D'après les exemples que j'ai trouvé sur le net, cette clé devrait etre de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <PublicKeyValue>OEIyQkE5QTM5NjM1ODIwODBEQTQzN</PublicKeyValue>
    Mais dans mon cas, celle-ci est codé en Hexa.

    Une fois ma fonction executé, je catch un message me disant que ma "clé est incorrecte".

    Quelqu'un aurai une piste à me donner, ca fais deja plusieurs jours que je bute sur ce problème.

    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    J'ai pas tout compris à ton histoire... c'est quoi le fichier XML dont tu parles ? Un fichier où tu as enregistré ta clé ?

    C'est quoi exactement l'exception que tu catches (son type, pas seulement son message) ?

    Bref, il faudrait que tu expliques ton problème un peu plus clairement, parce que là c'est très confus...

    Le problème je pense se situe sur le contenu de ma clé.
    D'après les exemples que j'ai trouvé sur le net, cette clé devrait etre de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <PublicKeyValue>OEIyQkE5QTM5NjM1ODIwODBEQTQzN</PublicKeyValue>
    Ben elle peut être dans le format que tu veux, de toutes façons il faut la convertir en byte[] pour pouvoir l'utiliser... Dans cet exemple a priori c'est en base64

  3. #3
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Pour déchiffrer un message, il faut la clé privée pas la clé publique.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Pour déchiffrer un message, il faut la clé privée pas la clé publique.
    2 mécanismes:
    • Coder avec la clé publique, décoder avec la clé privée (TRANSMISSION SECURISEE)
    • Coder avec la clé privée, décoder avec la clé publique (SIGNATURE)

    On peut bien décoder un message avec la clé publique
    Dans le premier post, il parle de signature ...
    Me trompe-je ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Effectivement, c'est le principe de la signature numérique...
    L'émetteur crypte avec sa clé privée, ce qui garantit l'origine du message, et n'importe qui peut décrypter le message avec la clé publique.
    Le cryptage, c'est le contraire : n'importe qui peut envoyer un message crypté au destinataire en utilisant la clé publique, mais seul le destinataire peut le lire avec sa clé privée

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Dans le premier post, il parle de signature ...
    Citation Envoyé par moulefrite Voir le message
    Je souhaiterai faire un decryptage de datas.
    Moi j'ai compris qu'il parle de chiffrement, mais c'est vrai qu'il utilise les deux termes.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par défaut
    Bonjour à tous et merci pour vos réponses.
    En ce qui me concerne, je n'ai aucune notion en crypto, je doit vous avouer que je m'emmêle un peu le pinceau avec toutes ces notions.


    Pour résumé :
    J'ai en ma possession :
    _ Une signature stocké dans une string contenant "AABBCCDDEE" (directement codé en hexa)
    ce qui donne signature[0] = 0xAA, ....
    _ Un modulus récuperé dans un fichier XML aussi stocké dans une string contenant "D47FE8B8" (aussi codé en hexa)
    ce qui donne RSAKeyInfo.Modulus[0] = 0xDF, ....
    _ Un exponent qui vaut "AQAB" en base64

    Je souhaite faire un Decrypt() de ma signature a partir du modulus/exponent

    Voila comment je procède :

    rsaParameter.modulus = conversion en BYTE[] de ma string mod
    rsaParameter.exponent = conversion en BYTE[] de ma string exp

    rsa.importParameter(rsaParameter)

    rsa.Decrypt(signature, false)


    Peu etre que mon problème est du à un soucis de conversion, je dois avouer avoir du mal à comprendre d'ou cela proviens.

    >>>>> tomlev
    Voici l'exception catché :
    au Decrypt() : me retourne "clé incorrecte" dans System.security.cryptographicExeption.throwCryptographicException(Int32 hr)

    >>>>> SaumonAgile
    Je n'ai en ma possession que la clé public, c'est bien une vérification de signature et non un chiffrage.

    >>>>>Flodelarab
    Oui c'est bien une signature que je veux vérifier à partir d'une clé public (second mecanisme)

    Merci encore pour votres aides,

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu peux convertir des données en base64 vers un tableau de byte avec la méthode Convert.FromBase64String

    Sinon y a un truc bizarre dans ton code : tu écrases les valeurs de Modulus et Exponent juste après les avoir affectées...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RSAKeyInfo .Modulus =  (byte[]) SCUtil.ToByteArray(PublicKey); // ...
    RSAKeyInfo .Exponent = (byte[]) SCUtil.ToByteArray("00010001"); // ...
    ...
    RSAKeyInfo.Modulus = modulus;
    RSAKeyInfo.Exponent = exponent;
    Je sais pas ce qu'il y a dans les variables modulus et exponent, mais en tous cas ça fait que tu écrases les résultats des appels à SCUtil.ToByteArray...

  9. #9
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Tu peux convertir des données en base64 vers un tableau de byte avec la méthode Convert.FromBase64String

    Sinon y a un truc bizarre dans ton code : tu écrases les valeurs de Modulus et Exponent juste après les avoir affectées...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RSAKeyInfo .Modulus =  (byte[]) SCUtil.ToByteArray(PublicKey); // ...
    RSAKeyInfo .Exponent = (byte[]) SCUtil.ToByteArray("00010001"); // ...
    ...
    RSAKeyInfo.Modulus = modulus;
    RSAKeyInfo.Exponent = exponent;
    Je sais pas ce qu'il y a dans les variables modulus et exponent, mais en tous cas ça fait que tu écrases les résultats des appels à SCUtil.ToByteArray...

    Non en faites, c'est moi qui me suit crée ces 2 variables intermédiaires (modulus et exponent) uniquement pour faire des essai de conversions.

    Mais jusqu'a présent j'ai toujours fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RSAKeyInfo .Modulus =  (byte[]) SCUtil.ToByteArray(PublicKey); // ...
    RSAKeyInfo .Exponent = (byte[]) SCUtil.ToByteArray("00010001"); // ...
    ...
    RSA.ImportParameters(RSAKeyInfo)
    Mais le résultat reste toujours le meme,
    J'ai aussi deja essayé de convertir avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Convert.FromBase64String
    Mais toujours le meme problème
    J'avoue ne pas voir d'ou cela peu provenir,

    Pourtant d'après les différens posts et exemples glané sur le net, ca ne semble pas vraiment etre compliqué à réaliser.

    Merci à toi tomlev pour ton aide.

  10. #10
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par défaut
    Bonjour à tous,
    J'ai vu qu'il etait possible de faire un verify, quelles sont les différences entres un Decrypt et un Verify alors ?
    Sachant que la signature a été crée à partir d'une clé privée, et que je doivent "decrypter" la signature à partir d'une clé public et un modulus.


    Merci d'avance,

  11. #11
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Par défaut
    Bon finalement j'ai réussi à faire fonctionner cette sécurité

    Alors voici la solution pour ceux qui rencontreront le même problème :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    RSACryptoServiceProvider RSAcsp = new RSACryptoServiceProvider();
     
                            byte[] hashBytes = new byte[32];
                            SHA256 shaHash = new SHA256Managed();
     
                            hashBytes = shaHash.ComputeHash(Security);
     
                            string keyXmlString = "<RSAKeyValue><Modulus>";
                            string modulusTmp = Convert.ToBase64String(modulus);
                            keyXmlString += modulusTmp + "</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
     
                            RSAcsp.FromXmlString(keyXmlString);
                            //RSAKeyInfo.Modulus = modulus;
                            //RSAKeyInfo.Exponent = Convert.FromBase64String("AQAB");
     
                            //RSAcsp.ImportParameters(RSAKeyInfo);
     
                            RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSAcsp);
     
                            RSADeformatter.SetHashAlgorithm("SHA256");
     
                            bool verif = RSADeformatter.VerifySignature(hashBytes, signature);
     
                            if (verif)
                            {
                                Console.WriteLine("Signature OK");
     
                            }
                            else
                            {
                                Console.WriteLine("Signature FAIL");
                            }
    En faites, il faut se créer un "RSADeformatter ", qui va se charger de vérifier la signature à partir du Hash calculés.

    C'est pas plus compliqué que ca, j'ai perdu beaucoup de temps parce que je n'avais aucune notions en crypto, mais sachez qu'un Decrypt, n'est pas forcément faisable.
    Je me suis concentré sur le "Decrypt", parce que de l'autre coté c'etait un "Encrypt" qui avait été fait, mais quand j'essaiyai de l'utiliser il me retournait l'exeption "Clé Incorrecte", surement lié à la clé publique renseigné au lieu de la clé privée.

    Enfin voila quoi, merci à tous ceux qui m'ont aidés, Sujet résolu

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est bon à savoir...
    Bien vu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Crypto++] RSA ?
    Par nostrora dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 23/03/2012, 12h19
  2. problème: openssl + RSA
    Par nomatter dans le forum Débuter
    Réponses: 6
    Dernier message: 30/05/2008, 17h04
  3. Crypto RSA - besoin d'aide.
    Par Faiche dans le forum Langage
    Réponses: 6
    Dernier message: 19/10/2006, 19h56
  4. Aide pour crypto RSA
    Par getthematrix dans le forum C++
    Réponses: 10
    Dernier message: 07/01/2006, 14h45
  5. [C#] Crypto RSA
    Par hobotalker dans le forum Windows Forms
    Réponses: 12
    Dernier message: 10/10/2005, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo