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 :

problème: openssl + RSA


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut problème: openssl + RSA
    Bonjour,
    je viens d'écrire le code suivant pour tester quelque fonctions de la bibliothèque openssl et surtout RSA:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    #include <openssl/engine.h>
    #include <openssl/err.h>
    #include <openssl/rsa.h>
    #include <openssl/rand.h>
    #include <openssl/sha.h>
     
    main ()
    {
    SHA_CTX *c;
    long erreur = 0;
    char *message="vatos locos para siempre";
    char *encrypt, *decrypt, *sign, hash[20],hash1[20];
    int longmsg,i,random,ok;
    int siglong;
    RSA *rsa;
     
             random= RAND_load_file("/dev/urandom ",1024);//seeding the Pseudo random generator
     
             rsa = RSA_generate_key(128,13,NULL,NULL);//generating a key having a 128 bits modulus 
             /*cryptage-decryptage
             encrypt= (unsigned char*)malloc(RSA_size(rsa));
             longmsg= strlen(message)*sizeof(unsigned char);
             RSA_public_encrypt(longmsg, message, encrypt, rsa, RSA_PKCS1_OAEP_PADDING);
             
             decrypt= (unsigned char*)malloc(RSA_size(rsa));
             RSA_private_decrypt(RSA_size(rsa), encrypt, decrypt, rsa, RSA_PKCS1_OAEP_PADDING);
             */  
             SHA1(message,strlen(message),hash);    //computing a digest using SHA1
             for(i=0; i<20; ++i){
    		             printf("%x",hash[i]);}
                                 printf("\n"); 
     
             SHA1_Init(c);                          //2 method to compute SHA1
             SHA1_Update(c,message,strlen(message));
             SHA1_Final(hash1,c);
             for(i=0; i<20; ++i){
    		             printf("%x",hash1[i]);}
                                 printf("\n"); 
     
             sign=(unsigned char*)malloc(RSA_size(rsa)); //generating the signature using RSA
             ok= RSA_sign(NID_sha1,hash,strlen(hash),sign,&siglong,rsa);
             erreur= ERR_get_error();
             printf("signature = %d \n",ok);
             printf("longueur de la signature =%d \n",siglong);
             printf("erreur =%d \n",erreur); 
             printf("PRNG random =%d \n",random);   
    RSA_free(rsa);
    free(sign);
    //free(encrypt);
    //free(decrypt);
    }
    Mais en le compilant avec la commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gcc rsa3.c -o rsa3 -lssl
    Je reçois le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ffffff9c6bffffffdd1c5dffffff915ffffffff7ffffffdbffffff93ffffffab3c23ffffffe5ffffffb344ffffff8b49632
    ffffff9c6bffffffdd1c5dffffff915ffffffff7ffffffdbffffff93ffffffab3c23ffffffe5ffffffb344ffffff8b49632
    signature = 0 
    longueur de la signature =-1210711624 
    erreur =67588208 
    PRNG random =0
    - Je reçois donc en retour pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ok= RSA_sign(NID_sha1,hash,strlen(hash),sign,&siglong,rsa);
    une valeur de zero ce qui signifit que la signature a échoué.
    - Je reçois aussi une valeur de zero pour le random qui doit me remettre en réalité le nombre des octets qu'il vient de charger à partir du "seed file"=/dev/random.
    - Je reçois aussi une valeur de longueur de la signature (siglong) négative ce qui n'est pas normal.

    Est ce que vous pourriez m'expliquer mes fautes. Et comment je pourrai récuperer avec la même fonction RSA_sign une signature valide.

    Merci d'avance pour votre aide et bonne journée à tous.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Ça me parait bizarre, d'employer strlen() pour des trucs comme le hash...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    merci pour ta réponse.
    en ajoutant la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     printf("strlen(hash) =%d \n",strlen(hash));
    j'ai reçu le résultat suivant:
    elle me retourne la longueur du tableau.
    Mais je crois (si je me trompe pas)que je dois fournir la longueur du hash en bits (au niveau de la doc de openssl je n'ai pas remarqué si on devait utilisé la longueur en bits ou en octets.)
    J'ai essayé de remplacer strlen(hash) par sizeof(char)*strlen(hash) et j'ai reçu le même résultat.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    sizeof(char) vaut 1 par définition. La taille en bits, c'est CHAR_BIT.
    Mais le problème majeur, c'est que strlen() s'arrète au premier octet nul, et par conséquent n'est valable que pour les vraies chaînes de caractères.
    Un hash est constitué de données binaires, et PEUT contenir un caractère nul...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    la taile du resultat en sha1 est de 20 octets, donc (20 caractère).... le problème c'est pas dans le strlen() !!!!!!


    Le resultat de la signature RSA se trouve dans ton variable sign, avec la longeur signlong..... verifiez !!!!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    Mon problème réside dans le fait que ok vaut zero. Or si la signautre était valide ok serait égale à 1.
    Car la fonction RSA_sign retourne 1 en cas de succés et 0 en cas de problème.
    Donc sa ne sert à rien de vérifier que sign contient la signature tant que la fonction retourne 0.
    En plus la taille que je dois fournir est en octet(j'ai vérifié dans la documentation openssl).
    Donc j'ai remplacé sizeof(hash) par 20 alors j'ai reçu ce message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ffffff9c6bffffffdd1c5dffffff915ffffffff7ffffffdbffffff93ffffffab3c23ffffffe5ffffffb344ffffff8b49632
    Erreur de segmentation (core dumped)
    Apparemment l'éxécution s'est arrétée au niveau de la 2ème méthode du calcul du hash (SHA1_Init....)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 15
    Par défaut
    enfin j'ai résolu le problème...
    C'était un problème de taille de clé..
    apparament lors de la programmation de rsa, les developpeurs de openssl ont imposé une contrainte sur la taille de la clé à utiliser. Comme une clé de taille 128 bits n'est presque jamais utilisé dans RSA car elle n'offre aucun niveau de securité, il s ont imposé une taille minimale qu'on ne doit pas dépassé pour pouvoir parler de sécurité.
    Donc si j'utilise le même algo en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsa = RSA_generate_key(128,13,NULL,NULL);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsa = RSA_generate_key(1024,13,NULL,NULL);
    sa marche à merveille.
    merci à tous pour votre aide.
    bon travail.

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

Discussions similaires

  1. Openssl::RSA problème de chiffrage
    Par caryvan dans le forum Langage
    Réponses: 0
    Dernier message: 24/04/2013, 14h25
  2. Problème openssl peu banal: wifi or not wifi?
    Par ternel dans le forum Sécurité
    Réponses: 2
    Dernier message: 31/05/2012, 13h49
  3. Réponses: 0
    Dernier message: 18/05/2009, 10h18
  4. [C#] problème crypto RSA
    Par moulefrite dans le forum Windows Forms
    Réponses: 11
    Dernier message: 26/01/2009, 18h41
  5. problème avec <openssl/dh.h>
    Par Tex-Twil dans le forum C
    Réponses: 6
    Dernier message: 23/03/2006, 11h30

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