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

Réseau C Discussion :

openssl - DH_compute_key


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut openssl - DH_compute_key
    Bonjourm
    j'ai un probleme avec la fonction DH_compute_key de la lib openssl.
    http://osr507doc.sco.com/cgi-bin/man?mansearchword=DH_generate_key&mansection=3

    Son parametre unsigned char *key devrait contenir la cle secrete calculée mais quand j'essaye de l'afficher, j'obtiens n'iporte quoi.

    Voici les quelques lignes de codes utilisant cette fonction:
    dhAlice et dhBob sont deux structures du type DH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          	unsigned char *keyAlice;
            ...
    	//Alice
    	keyAlice = malloc(DH_size(dhAlice));
    	DH_compute_key(keyAlice, dhBob->pub_key, dhAlice);
    	printf("Alice calculated: %s\n", keyAlice);
    	free(keyAlice);
    Si vous voulez le code complete dites moi, il n'est pas tres long.

    merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu fais un malloc() en prenant la taille d'un objet de type struct DH *, alors que keyAlice est un unsigned char. C'est normal?
    Je m'attendrais plutot a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned char *keyAlice;
     
    keyAlice = malloc(key_size);
    ou key_size est la taille d'une cle en bytes.

  3. #3
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    la doc dit:
    DH_compute_key() computes the shared secret from the private
    DH value in dh and the other party's public value in pub_key
    and stores it in key. key must point to DH_size(dh) bytes of
    memory.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par DaZumba
    Tu fais un malloc() en prenant la taille d'un objet de type struct DH *, alors que keyAlice est un unsigned char. C'est normal?
    Je m'attendrais plutot a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    unsigned char *keyAlice;
     
    keyAlice = malloc(key_size);
    ou key_size est la taille d'une cle en bytes.
    non, d'après le man:

    key must point to DH_size(dh) bytes of memory.
    Jc

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut Re: openssl - DH_compute_key
    Citation Envoyé par Tex-Twil

    Si vous voulez le code complete dites moi, il n'est pas tres long.
    Je ne connais pas du tout openssl, mais je pense que tout le code (et commenté) serait utile pour t'aider et explique ce que tu obtiens et ce que tu devrais obtenir...

    Jc

  6. #6
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Ok - c'est donc autre chose. Autant pour moi. Elle est bizarre cette biblio.
    Tu es sur que keyAlice est une chaine de caractere au sens C du terme (i.e. est-elle terminee par un '\0')? Sinon, le printf() ne risque pas d'apprecier.

  7. #7
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut Re: openssl - DH_compute_key
    Citation Envoyé par fearyourself
    Citation Envoyé par Tex-Twil

    Si vous voulez le code complete dites moi, il n'est pas tres long.
    Je ne connais pas du tout openssl, mais je pense que tout le code (et commenté) serait utile pour t'aider et explique ce que tu obtiens et ce que tu devrais obtenir...
    Jc
    ok.
    Je dois faire un client et un serveur qui s'echangent des cles de cryptage selon Diffie Hellman Key Agreemen pour un future cryptage des donnees. Sans parler du reseau, j ai d'abord essaye faire une mini appli qui simiule l'echange et le calcul des cles privees et publiques.

    man (pas tres explicites ! ) sur BN et DH
    http://www.openssl.org/docs/crypto/bn.html#
    http://www.openssl.org/docs/crypto/dh.html#


    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #include <openssl/dh.h>
    #include <openssl/engine.h>
     
    #define PRIME_LEN  64
    #define GENERATOR 5
    int main()
    {
    	void printDH(char *name, DH *dh);
     
    	DH *dhAlice;
    	DH *dhBob;
     
    	// Final secret shared keys. should be equal :)
    	unsigned char *keyAlice;
    	unsigned char *keyBob;
     
    	int i;
    	int ret;
    	int codes = -1;
     
    	srand( (unsigned)time( NULL ) );
     
    	dhAlice = DH_new();
    	dhBob = DH_new();
     
    	printf("Generating DH params ... this can take a while \n");
    	dhAlice = DH_generate_parameters(PRIME_LEN, GENERATOR, NULL, NULL);
    	// Check the return value !
    	DH_check(dhAlice, &codes);
    	if( codes == DH_UNABLE_TO_CHECK_GENERATOR)
    				printf("DH_UNABLE_TO_CHECK_GENERATOR");
     
    	printf("Generating public & private keys ... \n");
    	DH_generate_key(dhAlice);
    	printDH("Alice", dhAlice);
     
    	//Giving p & g parameters to Bob. This exchange will be done 
    	//through network sockets, dont know yet how.
    	dhBob->p = BN_new();
    	dhBob->g = BN_new();
    	BN_copy(dhBob->p, dhAlice->p);
    	BN_copy(dhBob->g, dhAlice->g);
     
    	// Calculing Bob's key with shared p & g parames. Check the ret value !
    	DH_generate_key(dhBob);
    	printDH("Bob", dhBob);
     
    	// Computing secret shared keys with other peers's public key
    	//Alice
    	keyAlice = malloc(DH_size(dhAlice));
    	DH_compute_key(keyAlice, dhBob->pub_key, dhAlice);
    	printf("Alice calculated: %s\n", keyAlice);
    	free(keyAlice);
     
    	//Bob
    	keyBob = malloc(DH_size(dhBob));
    	DH_compute_key(keyBob, dhAlice->pub_key, dhBob);
    	printf("Bob calculated: %s\n", keyBob);
    	free(keyBob);
     
    	DH_free(dhAlice);
    	DH_free(dhBob);
     
    //	system("openssl dhparam 64 -out dhparams.pem 2>/dev/null");
    	return EXIT_SUCCESS;
    }
     
    void printDH(char *name, DH *dh)
    {
         //char *BN_bn2dec(const BIGNUM *a);
        printf("--------------\n");     
        printf("%s :\n", name);
        printf("%i bits\n", PRIME_LEN);
        printf("p: %s \n", BN_bn2hex(dh->p));
        printf("g: %s \n", BN_bn2hex(dh->g));
        printf("priv_key: %s \n", BN_bn2hex(dh->priv_key));
        printf("pub_key: %s \n", BN_bn2hex(dh->pub_key));
    	printf("\n");         
    }

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    De cette page:
    http://www.protocoltesting.com/ike.html

    What is very important to note, is that DH_size() doesn’t know what the shared key will actually be, just how long it is expected to be. When we use DH_compute_key() to actually handle the math, its return value (i in our example) will be the actual length of the shared key.
    Donc, il faut sûrement mettre un zéro à la fin de ta chaîne de caractère.

    La fonction DH_compute_key retourne la taille de la clé calculée.

    Mais tu n'as pas dit ce qu'il y avait dedans et ce qu'il faudrait avoir...

    Je n'ai pas openssl donc je ne peux pas tester...
    Jc

  9. #9
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    Citation Envoyé par fearyourself
    De cette page:
    http://www.protocoltesting.com/ike.html

    What is very important to note, is that DH_size() doesn’t know what the shared key will actually be, just how long it is expected to be. When we use DH_compute_key() to actually handle the math, its return value (i in our example) will be the actual length of the shared key.
    Donc, il faut sûrement mettre un zéro à la fin de ta chaîne de caractère.

    La fonction DH_compute_key retourne la taille de la clé calculée.

    Mais tu n'as pas dit ce qu'il y avait dedans et ce qu'il faudrait avoir...

    Je n'ai pas openssl donc je ne peux pas tester...
    Jc
    Les variables keyAlice et keyBob devraient contenir la meme cle privee calculee par cette fonction. Voici ce que affiche le programme:

    jan@ubuntu:~/NETWORKS/C$ ./test
    Generating DH params ... this can take a while
    Generating public & private keys ...
    --------------
    Alice :
    64 bits
    p: E66DD37DACCD6ED3
    g: 05
    priv_key: 5A180657020E5BD2
    pub_key: 5BC7925E3CC543EF

    --------------
    Bob :
    64 bits
    p: E66DD37DACCD6ED3
    g: 05
    priv_key: 5E1BDE4B95E8F272
    pub_key: 318C5BC7B327FC45

    Alice calculated: w]\uffffp\uffff\uffff8\uffff\uffff\uffff!
    Bob calculated: w]\uffffp\uffff\uffff8\uffff\uffff\uffff!
    Edit: bon, ce nest pas vraiment des \uffffp qui sont affiches mais en tous cas ce sont des caracteres ascii bizares. Je devrais avoir quelque chose en hexadecimal.

  10. #10
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    http://groups.google.gr/group/mailing.openssl.users/browse_thread/thread/e73a4b4ff1416ddc/614f282be7f2300d?lnk=st&q=DH_compute_key()&rnum=8&hl=fr#614f282be7f2300d

    j'ai rajoute les test de la valeure retournee mais c'est pareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	ret = DH_compute_key(keyAlice, dhBob->pub_key, dhAlice);
    	if( ret == -1 ) { perror("Dh Compute"); exit(2); }

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    j'ai rajoute les test de la valeure retournee mais c'est pareil:
    Tu as d'autres fonctions qu'il faudrait tester. Teste chacun des appels...

    Jc

  12. #12
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    oui je vais tester les retrours mais je ne pense pas que ca vient de la car dans le vrai programme (avec communication socket) je les test et le probleme est le meme.

    Il y a enormement d'info ici
    http://groups.google.gr/groups?q=DH_compute_key()&start=0&hl=fr&lr=&
    je v donc tout lire et mettre la solution si je la trouve.

  13. #13
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    Bon je ne trouve pas la solution mais je pense que le probleme est tout bete. Si je fais un copier coller d'un code pris sur le net et essaye d'afficher le unsigned char ca marche pas non plus.

  14. #14
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    trouve
    Il faut faire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	keyAlice = (unsigned char *)malloc(DH_size(dhAlice));
    	ret = DH_compute_key(keyAlice, dhBob->pub_key, dhAlice);
    	if( ret == -1 ) { perror("Dh Compute"); exit(2); }
     
    	printf("Alice calculated : ");
    	for (i=0; i<ret; i++)
    	{
    		printf("%02X",keyAlice[i]);
    	}
    	printf("\n");
    Mais j'avoue que je ne comprends pas ! Pourquoi faut il parcourir un par un la chaine resultante ?

  15. #15
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    C'est marrant, j'étais persuadé d'avoir dit qu'on était pas sûr que ce qu'il y avait dans ton tableau était une chaîne affichable...

    Pour afficher une chaîne de caractère, on utilise le code ASCII pour le faire. Ainsi 'a' prendra une valeur numérique, 'b' une autre, '1' en prendra une autre, etc.

    Ces valeurs ne sont pas à confondre avec les valeurs 1, 2 ,3...

    Tu supposais que ta fonction DH_compute_key te rendais une chaîne de caractères affichable donc si le premier élément était un 1, la fonction mettait '1' et non la valeur 1 dans la première case.

    D'où le fait que "%s" ne marchait pas et qu'il fallait demander d'afficher la valeur en hexadécimal...

    Jc

  16. #16
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    mouais
    Ils auraient pu preciser dans le man. Je le trouve vraiment tres leger ce man Ja galere d'ailleurs pour utiliser toutes les fonctions

    Merci bien

    Encore une question, pkoi un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Alice calculated: %X\n", keyAlice);
    ne marche pas ?

  17. #17
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Tex-Twil
    mouais
    Ils auraient pu preciser dans le man. Je le trouve vraiment tres leger ce man Ja galere d'ailleurs pour utiliser toutes les fonctions

    Merci bien

    Encore une question, pkoi un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Alice calculated: %X\n", keyAlice);
    ne marche pas ?
    Il faut que tu fasses un pas en arrière et que réfléchisse un peu à ce que tu es en train de faire... Il ne faut jamais bidouiller en C...

    Tu es en train de passer une adresse mémoire et tu demandes printf de le traiter comme un héxadécimal.

    Il ne le traitera pas comme dans le cas de %s...

    C'est comme si tu passais un tableau d'entiers et tu pensais que cela afficherait chaque élément:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("Voici le tableau: %d\n", tabentiers);
    C'est absolument faux et n'a aucun sens,
    Jc

  18. #18
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    merci

  19. #19
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut

    J'aimerais avoir toute le clé contenue dans un char* à la sortie de la boucle mais je n'y arrive pas ... desfois j'ai l'impression d'etre une vraie merde.

  20. #20
    Membre éclairé Avatar de Tex-Twil
    Inscrit en
    Avril 2004
    Messages
    447
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 447
    Par défaut
    est ce que ceci est correcte:

    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
     
       char *final;
     
       keyAlice = (unsigned char *)malloc(DH_size(dhAlice));
       final = (unsigned char *)malloc(DH_size(dhAlice));
     
       ret = DH_compute_key(keyAlice, dhBob->pub_key, dhAlice);
       if( ret == -1 ) { perror("Dh Compute"); exit(2); }
     
       printf("Alice calculated : ");
       for (i=0; i<ret; i++)
       {
          // decallage du pointeur
          sprintf((final+2*j), "%02X",keyAlice[i]);
       }
       printf("%s\n", final);

Discussions similaires

  1. OpenSSL et fd
    Par thomasvst dans le forum C
    Réponses: 2
    Dernier message: 24/03/2006, 12h27
  2. problème avec <openssl/dh.h>
    Par Tex-Twil dans le forum C
    Réponses: 6
    Dernier message: 23/03/2006, 11h30
  3. [Sécurité] OpenSSL ?
    Par Tmex dans le forum Langage
    Réponses: 4
    Dernier message: 09/03/2006, 14h45
  4. OpenSSL/OpenLDAP Problème pour la création de certificat
    Par shaun_the_sheep dans le forum Réseau
    Réponses: 4
    Dernier message: 07/10/2005, 13h36
  5. [SSL] keytool vs openSSL
    Par pmartin8 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 15/06/2005, 10h20

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