[resolu] Création d'un prog de cryptographie, gcc refuse !

Bonjour,

Je suis en train de me faire un petit programme pour crypter un message et je trouve devant un problème avec gcc :

key.o: In function `cle_de_codage': key.c:(.text+0x1b): undefined reference to `__gmpz_init' key.c:(.text+0x29): undefined reference to `__gmpz_init' key.c:(.text+0x37): undefined reference to `__gmpz_init' key.c:(.text+0x42): undefined reference to `__gmpz_init' key.c:(.text+0x50): undefined reference to `__gmpz_init' key.c:(.text+0x174): undefined reference to `__gmpz_add_ui' key.c:(.text+0x18c): undefined reference to `__gmpz_cmp' key.c:(.text+0x1b2): undefined reference to `__gmpz_mul' key.c:(.text+0x1cc): undefined reference to `__gmpz_set' key.c:(.text+0x1da): undefined reference to `__gmpz_init' key.c:(.text+0x21d): undefined reference to `__gmp_printf' key.c:(.text+0x232): undefined reference to `__gmpz_nextprime' key.c:(.text+0x245): undefined reference to `__gmpz_sizeinbase' key.c:(.text+0x26e): undefined reference to `__gmp_printf' key.c:(.text+0x299): undefined reference to `__gmpz_add_ui' key.c:(.text+0x2ba): undefined reference to `__gmpz_set' key.c:(.text+0x2d6): undefined reference to `__gmpz_mul' key.c:(.text+0x2f2): undefined reference to `__gmpz_add' key.c:(.text+0x305): undefined reference to `__gmpz_sizeinbase' key.c:(.text+0x334): undefined reference to `__gmpz_fdiv_q' key.c:(.text+0x350): undefined reference to `__gmpz_nextprime' key.c:(.text+0x377): undefined reference to `__gmp_printf' key.o: In function `main': key.c:(.text+0x3b5): undefined reference to `__gmp_printf' collect2: ld returned 1 exit status

Je vous mets le code ensuite.

[code]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <gmp.h>

#define LENGTH 256

mpz_t *cle_de_codage(char encrypt[50]) {

    char key[500] ;
    int count = 0, length_encrypt, exposant, size ;
    mpz_t current, temp, zero, *next, grew ; 

    mpz_init(zero) ; mpz_init(current) ; mpz_init(temp), mpz_init(*next) ; mpz_init(grew) ;

    printf("Veuillez entrer votre cle de cryptage (cle forte) : ") ;
    fgets(key, sizeof(key), stdin) ;
    printf("Maintenant votre clé rotative (une suite de chiffre) :") ;
    fgets(encrypt, sizeof(encrypt), stdin) ;

    key[strlen(key)-1] = '\0' ;
    encrypt[strlen(encrypt)-1]  = '\0' ;

    length_encrypt = strlen(encrypt) ;

    while( key[count] != '\0' ) {
            mpz_add_ui(temp, zero, (unsigned long int)( (int)key[count] + ( (int)encrypt[count%length_encrypt] - 48 ) ) ) ;

            if( mpz_cmp(current, zero) != 0 ) mpz_mul(current, current, temp) ;
            else mpz_set(current, temp) ;

            mpz_init(temp) ;
            count++ ;
    }

    printf("La conversion de %s donne : ", key) ;
    gmp_printf("%Zd\n", current) ;

    mpz_nextprime(*next ,current) ;

    size = (int)mpz_sizeinbase(*next, 10) ;
    printf("Votre cle de codage de %d bits sera donc : ", size) ;
    gmp_printf("%Zd\n", *next) ;

    exposant = LENGTH - size ;
    mpz_add_ui(grew, grew, 10) ;

    if(exposant >= 0 ) { 
            while(exposant > 0) {
            mpz_set(temp, *next) ;
            mpz_mul(*next, *next, grew) ;
            mpz_add(*next, *next, temp) ;

            if( (int)mpz_sizeinbase(*next, 10) >= LENGTH ) break ;
            else exposant-- ;
            }
    }
    else {
            while(exposant < 0) {
            mpz_fdiv_q(*next, *next, grew) ;
            exposant++ ;
            }
    }

    mpz_nextprime(*next ,*next) ;

    printf("La cle de codage de %d bits est : ", LENGTH) ;  gmp_printf("%Zd\n", *next) ;

    return next ;

}

int main(void) {
char rotate[50] ;
mpz_t *key ;

    key = cle_de_codage(rotate) ;
    gmp_printf("%Zd\n", *key) ;
    printf("et la cle rotative : %d\n", atoi(rotate) ) ;

    return 0 ;

}[/code]

La fonction cle_de_codage marche très bien toute seule, mais dès que je passe en argument les deux clé je me trouve avec un problème au niveau de la librairie GMP (qui permet de faire des nombre de plus de 64 bits : ici 256 bits et plus si mon pc crypte suffisamment vite).

Mon programme en est à ses débuts mais je ne comprends pas que ça ne marche pas.

Merci d’avance pour votre aide.

Deusexodus.

je n’ai pas trop le temps de regarder plus avant, mais si tu commentes ta func et la ligne key=, il reste déjà une erreur sur gmp_printf:

roc@roc:~/devel/C$ make key cc key.c -o key /tmp/ccQGEAYp.o: In function `main': key.c:(.text+0x3f): undefined reference to `__gmp_printf' collect2: ld returned 1 exit status make: *** [key] Erreur 1et pourtant:

roc@roc:~/devel/C$ grep gmp_printf /usr/include/*.h /usr/include/gmp.h:#define gmp_printf __gmp_printf /usr/include/gmp.h:__GMP_DECLSPEC int gmp_printf __GMP_PROTO ((__gmp_const char *, ...)); mais ça veut dire aussi que __gmp_printf n’est déclarée nulle part dans aucun .h, non ?

Alors j’ai trouvé ça, mais je ne sais pas le traduire:
cppfrance.com/infomsg_PROBLE … 64514.aspx

Tu compile comment?

Il a compilé un fichier objet donc le .h qui déclare __gmpz_init etc y est c’est le fichier objet associé qui n’est pas présent.

Avec une édition de liens ça marchera mieux. :open_mouth:

ou quelque chose dans le genre.

trés juste, ça faisait longtemps que je n’avais pas compilé:

roc@roc:~/devel/C$ LDFLAGS="-lgmp" make key cc -lgmp key.c -o key roc@roc:~/devel/C$

Oui c’est ça : il fallait que je rajoute -lgmp. Donc ce fil est résolu.

Me reste à régler le seg fault que mon programme fourni.

Merci de votre aide.