Bonjour à tous,
Je souhaite réaliser un programme en C me permettant de chiffrer un fichier avec une clé passé en paramètre. Pour cela, je souhaite utiliser l'API EVP. Débutant dans ce domaine, je me suis inspiré de l'exemple donné dans le man. Toutefois, voici mon problème :
Et si besoins, voici mon code :
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 [Iloyo@localhost ~]$ gcc -o chiffrer chiffrer.c chiffrer.c:12:1: attention : « EVP_CIPHER_mode » redéfini Dans le fichier inclus à partir de chiffrer.c:3: /usr/include/openssl/evp.h:436:1: attention : ceci est la localisation d'une précédente définition chiffrer.c:22:1: attention : « EVP_CIPHER_CTX_mode » redéfini /usr/include/openssl/evp.h:447:1: attention : ceci est la localisation d'une précédente définition /tmp/ccy3sCkR.o: In function `main': chiffrer.c:(.text+0x135): undefined reference to `EVP_CIPHER_CTX_init' chiffrer.c:(.text+0x13a): undefined reference to `EVP_des_ede3_cbc' chiffrer.c:(.text+0x16d): undefined reference to `EVP_CipherInit_ex' chiffrer.c:(.text+0x183): undefined reference to `EVP_CIPHER_CTX_set_key_length' chiffrer.c:(.text+0x1b9): undefined reference to `EVP_CipherInit_ex' chiffrer.c:(.text+0x21e): undefined reference to `EVP_CipherUpdate' chiffrer.c:(.text+0x230): undefined reference to `EVP_CIPHER_CTX_cleanup' chiffrer.c:(.text+0x290): undefined reference to `EVP_CipherFinal_ex' chiffrer.c:(.text+0x2a2): undefined reference to `EVP_CIPHER_CTX_cleanup' chiffrer.c:(.text+0x2e5): undefined reference to `EVP_CIPHER_CTX_cleanup' collect2: ld a retourné 1 code d'état d'exécution
Si quelqu'un pouvait m'aider, merci par avance !
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 #include<stdio.h> #include<stdlib.h> #include<openssl/evp.h> #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a)) #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a)) #define EVP_CIPHER_nid(e) ((e)->nid) #define EVP_CIPHER_block_size(e) ((e)->block_size) #define EVP_CIPHER_key_length(e) ((e)->key_len) #define EVP_CIPHER_iv_length(e) ((e)->iv_len) #define EVP_CIPHER_flags(e) ((e)->flags) #define EVP_CIPHER_mode(e) ((e)->flags) & EVP_CIPH_MODE) #define EVP_CIPHER_CTX_cipher(e) ((e)->cipher) #define EVP_CIPHER_CTX_nid(e) ((e)->cipher->nid) #define EVP_CIPHER_CTX_block_size(e) ((e)->cipher->block_size) #define EVP_CIPHER_CTX_key_length(e) ((e)->key_len) #define EVP_CIPHER_CTX_iv_length(e) ((e)->cipher->iv_len) #define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data) #define EVP_CIPHER_CTX_set_app_data(e,d) ((e)->app_data=(char *)(d)) #define EVP_CIPHER_CTX_type(c) EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c)) #define EVP_CIPHER_CTX_flags(e) ((e)->cipher->flags) #define EVP_CIPHER_CTX_mode(e) ((e)->cipher->flags & EVP_CIPH_MODE) int main(int argc, char * argv[]) { /* Test number of parameters */ if ( argc < 3 ) { printf("Parametres manquants : %s [ Key ] [ filename ]\n",argv[0]); exit(1); } if (argc > 3 ) printf("%d Parametres en trop!\n",argc-3); FILE * in; FILE * out; int do_encrypt = 0; unsigned char * key = argv[1]; const char * infile = argv[2]; char * outfile; EVP_CIPHER_CTX ctx; sprintf(outfile,"%s.sign",argv[2]); if ( (in = fopen(infile,"r")) == NULL ) perror("ERREUR : Ouverture du fichier source"); if ( (out = fopen(outfile,"w+")) == NULL ) perror("ERREUR : Ouverture du fichier source"); /* Allow enough space in output buffer for additional block */ char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH]; int inlen, outlen; /* Bogus key and IV: we'd normally set these from * another source. */ unsigned char iv[] = "12345678"; /* Don't set key or IV because we will modify the parameters */ EVP_CIPHER_CTX_init(&ctx); EVP_CipherInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, NULL, NULL, do_encrypt); EVP_CIPHER_CTX_set_key_length(&ctx, 10); /* We finished modifying parameters so now we can set key and IV */ EVP_CipherInit_ex(&ctx, NULL, NULL, key, iv, do_encrypt); for(;;) { if ( (inlen = fread(inbuf, 1, 1024, in)) <= 0 ) break; if(!EVP_CipherUpdate(&ctx, outbuf, &outlen, inbuf, inlen)) { /* Error */ EVP_CIPHER_CTX_cleanup(&ctx); return 0; } fwrite(outbuf, 1, outlen, out); } if(!EVP_CipherFinal_ex(&ctx, outbuf, &outlen)) { /* Error */ EVP_CIPHER_CTX_cleanup(&ctx); return 0; } fwrite(outbuf, 1, outlen, out); EVP_CIPHER_CTX_cleanup(&ctx); return 1; }
Partager