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

 C++ Discussion :

Utiliser DLL Crypto++


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut Utiliser DLL Crypto++
    Bonjour,
    je cherche à utiliser la bibliothèque Crypto++ en faisant une dll pour l'utiliser dans windev , le c++ n'est pas vraiment dans mes cordes .
    mon but étant de signer une chaine de caractère avec une clé priver créer avec openssl
    je l'ai fait en c# mais mon soucis étant d'éviter d'installer la librairie obligatoire assez contraigante : Visual C++ pour visual Studion 2013
    le code est simple en c#
    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
    static public string Signature(string _sPrivateKeyXML,string _sDataToSign, ref string __sMessErr)
            {
                try
                {
                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                RSA.FromXmlString(_sPrivateKeyXML);
                RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
                RSAFormatter.SetHashAlgorithm("SHA1");r.
                SHA1CryptoServiceProvider UnCrypto = new SHA1CryptoServiceProvider();
                byte[] DataSign = Encoding.ASCII.GetBytes(_sDataToSign);
                byte[] Sign = UnCrypto.ComputeHash(DataSign);
                byte[] SignedHash = RSAFormatter.CreateSignature(Sign);
                return Convert.ToBase64String(SignedHash);
                }
                catch (CryptographicException e)
                {
                    __sMessErr = e.ToString();
                    return null;
                }
            }
    c'est pas la même music en c++
    quelqu'un pourrait me dire si déjà Crypto++ intègre la même signature de chaine ? et si par hasard quelqu'un aurait un bout de code le permettant ?
    merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Crypto++ est une bibliothèque C++, à la base.
    Elle s'utilise comme toute bibliothèque C++, en commençant par lire sa documentation.
    https://www.cryptopp.com/wiki/Visual_Studio

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    bonjour,
    oui c'est le principe de lire la documentation ,c'est parce que j'ai essayé que j'ai fais ce post ,çà doit être relativement simple pour un habitué du c++ mais pas pour moi

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    ,çà doit être relativement simple pour un habitué du c++ mais pas pour moi
    Chaque bibliothèque fait sa tambouille, donc non, on est à égalité, faut lire la documentation, et la comprendre.

    C'est quoi le message d'erreur ou ce que vous ne comprenez pas dans la documentation ?

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    Merci Bacelar de ta réponse ,
    j'ai commencer à utiliser visual c++ 2008 et cryptopp562 (seul se couple fonctionne à la compilation sans soucis);
    j'arrive bien à maîtriser certaine classe mais quand j'essaye d'utiliser la fonction Base64Encoder çà plante la génération (mais pas la compilation) ,comme dans l'exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    byte decoded[] = { 0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00 };
    string encoded;
    Base64Encoder encoder;
    encoder.Put(decoded, sizeof(decoded));
    encoder.MessageEnd();
    word64 size = encoder.MaxRetrievable();
    if(size)
    {
        encoded.resize(size);		
        encoder.Get((byte*)encoded.data(), encoded.size());
    }
    cout << encoded << endl;
    j'ai un magnifique
    dlltest.obj : error LNK2019: symbole externe non résolu "public: virtual void __thiscall CryptoPP::Base64Encoder::IsolatedInitialize(class CryptoPP::NameValuePairs const &)" (?IsolatedInitialize@Base64Encoder@CryptoPP@@UAEXABVNameValuePairs@2@@Z) référencé dans la fonction "public: __thiscall CryptoPP::Base64Encoder::Base64Encoder(class CryptoPP::BufferedTransformation *,bool,int)" (??0Base64Encoder@CryptoPP@@QAE@PAVBufferedTransformation@1@_NH@
    c'est 'Base64Encoder encoder' qui fait ce plantage
    quelqu'un aurait une idée ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Vous avez juste une erreur d'édition de lien.
    Le compilateur est content, tout ce que vous utilisez a été déclaré dans des .h, OK.
    Mais l'éditeur de lien, lui, il lui faut le vrai code binaire.
    Donc, si l'intégration de la bibliothèque se fait via des .lib, vous avez oubliez de mentionner le .lib contenant le code de "CryptoPP::Base64Encoder::Base64Encoder".

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    aucune idée comment mentionner le .lib , un peu perdu ...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Dans : "Propriétés" dans le menu contextuel du projet dans l'explorateur de solution -> Propriétés de configuration -> Edition de liens -> entrée -> dépendances supplémentaires
    Y ajouter "cryptlib.lib".
    Dans : "Propriétés" dans le menu contextuel du projet dans l'explorateur de solution -> Propriétés de configuration -> Répertoires VC++ -> Répertoires de bibliothèques
    Y ajouter le chemin vers le répertoire contenant "cryptlib.lib".

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    en faisant ceci :





    j'obtiens ceci

    1>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) déjà défini(e) dans cryptlib.lib(base64.obj)

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    j'ai réglé le soucis comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <iostream>
    //#include <dll.h>
    #include <base64.h>
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <dll.h>
    #include <base64.h>
    suite au prochaine épisode
    merci bacelar

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    j'ai réussi ma signature avec criptopp (crypto++) mais je n'ai pas le même résultat qu'avec openssl , est-ce normal ou j'ai fait une erreur quelque part ?
    avec openssl
    rsautl -sign -in asigner.txt -inkey maclé.pem -out signature.txt
    avec cryptopp
    RSASSA_PKCS1v15_SHA_Signer signer(privateKey);

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est peut-être parce qu'openssl fournit plusieurs variantes du même algorithme.

    Il faut regarder la doc de rsautl (sa page man, probablement)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par ternel Voir le message
    Il faut regarder la doc de rsautl (sa page man, probablement)
    il n'y a pas trop d'option apparemment
    http://www.man-linux-magique.net/man1/rsautl.html
    c'est étrange quand même ....

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    j'ai compris le soucis :
    RSASSA_PKCS1v15_SHA_Signer signer(privateKey) de crypto++ fait un sh1 et signe
    rsautl -sign -in asigner.txt -inkey maclé.pem -out signature.txt ne fait que signer
    par contre
    dgst -sha1 -sign maclé.pem -out signature.txt asigner.txt fait un sh1 et signe

    les deux sont égaux maintenant
    tout simplement

  15. #15
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Comme quoi, en cherchant bien…

    Bonne continuation!
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    Bonsoir,
    je rencontre un soucis en Elliptic curve entre openssl et crypto++ ,la signature ne fait pas la même longueur (il manque 7 octet avec crypto++) aussi bien en secp521r1 qu'en secp256k1 (asn1) , ma vérification échoue avec openssl (la vérification de la signature est bonne avec crypto++ bien sûr) .
    la signature en secp521r1 fait 132 octets et en secp256k1 64 octets , 139 octets pour openssl en secp521r1 ....
    si vous avez une idée ,je suis preneur , je ne peu pas signer avec ceci si les résultats ne sont pas cohérent ,il doit bien avoir l'un des deux qui boite ....
    openssl me dit :
    Error Verifying Data
    8298:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59.40.2/src/crypto/asn1/tasn_dec.c:1344:
    8298:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59.40.2/src/crypto/asn1/tasn_dec.c:387:Type=ECDSA_SIG
    error in dust
    comment verifier ma signature avec autre chose que openssl par exemple ...

  17. #17
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Cette fois si, tu as vérifié que c'est bien le même algorithme, avec les mêmes paramètres, utilisés pour signer la même chose?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  18. #18
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    oui bien sur (enfin je pense ,c'est çà qui m'étonne)

    avec openssl
    ecparam -name secp521r1 -genkey -out TotoPrivé_EC.pem //creation clé privé
    ec -in TotoPrivé_EC.pem -pubout -out totoPublique_EC.pem //création clé public

    dgst -ecdsa-with-SHA1 -out signed.txt -sign TotoPrivé_EC.pem test.txt //signature = 139 octets
    dgst -ecdsa-with-SHA1 -verify totoPublique_EC.pem -signature signed.txt test.txt //verification ok
    avec crypto++
    cléprivé et clépublic sont des string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ECDSA<ECP,SHA1>::Signer signer;
    signer.AccessKey().Initialize( prng,  CryptoPP::ASN1::secp521r1() );
    signer.AccessKey().BERDecodePrivateKey(queue, false , queue.MaxRetrievable());//clé privé 
    StringSource( message, true,new SignerFilter( prng,signer,new StringSink( signature ))); //on signe = 132 octets :aie:
    //enregistre la signature pour la verification avec openssl par la suite
    FileSink sink("signed.txt");
    sink.Put((byte const*) signature.data(), signature.size());
    //comparaison
    ECDSA<ECP, SHA1>::publicKey publicKey;
    publicKey.Load(StringSource(CléPublic, true,new Base64Decoder()).Ref());//clé public
    StringSource( signature+message, true,new SignatureVerificationFilter(ECDSA<ECP,SHA1>::Verifier(publicKey),
    new ArraySink( (byte*)&result, sizeof(result) ) //vérification ok
    retour à openssl
    dgst -ecdsa-with-SHA1 -verify totoPublique_EC.pem -signature signed.txt testec.txt /// et la verification est mauvaise
    ASN1_CHECK_TLEN:wrong tag
    ASN1_ITEM_EX_D2I:nested asn1 error

    j'ai bien réussi à peu prêt de la même façon en rsa sans soucis ... il y a un truc qui m'échappe

  19. #19
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je ne connais pas assez les algorithmes précis.

    Vérifie, à tout hasard, que le chargement des clés soit bien fait comme recommandé par Crypto++

    Notamment, tu passes par un base64decode, est-ce normal
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 86
    Points : 45
    Points
    45
    Par défaut
    en faites cela fonctionne bien en RSA , on peut penser que c'est la même façon , de surcroit si il n'arrive pas à décoder (ou une incohérence) cela provoque une erreur en exécution .
    ce qui est bizarre ,c'est que je ne peux pas charger de la même façon la clé privé et la clé public alors que se sont les deux des string ....
    mais ce qui m'embete , c'est que les signatures ne font pas la même taille !! c'est flagrant par contre ... avec quoi peut-on vérifier une signature à par openssl ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utilisation DLL créée sous VB6
    Par Dertron dans le forum Access
    Réponses: 12
    Dernier message: 05/04/2006, 14h54
  2. Problème utilisation DLL
    Par Tub-95 dans le forum MFC
    Réponses: 4
    Dernier message: 02/11/2005, 12h00
  3. [VB6] Utiliser dll .Net dans VB6
    Par sokette dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 31/03/2005, 14h34
  4. Utiliser Dll Delphi
    Par smyley dans le forum MFC
    Réponses: 9
    Dernier message: 12/03/2005, 18h21
  5. [D8] Utilisation dll D7 sous D8
    Par smyley dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 01/11/2004, 11h28

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