Bonjour a tous ici, voici mon problème, une petite description d'abords :
en 2002, Serge Vaudenay, de l'école polytechnique fédérale de Lausanne ,a démontré comment un attaquant sur le Web ayant intercepté une suite de blocs chiffrés en mode CBC avec un système quelconque, peut ensuite trouver le message en clair.
Le but : Simuler cette attaque avec des programmes écrits en C , téléchargeables depuis l'URL :
http://www2.lifl.fr/~wegrzyno/portai...P2/tp2004.html
Je souhaite faire l'implémentation des ces codes ( je vais les mettre ci-dessous si quelqu'un est intéressé à m'aider..) en Linux ubuntu 10.04 , compilateur GCC . J'ai fait des modifications pour les codes pour qu'ils marchent , j'ai réussi à compiler les "oracle.c"," oracle.h"," tools.c" et " tools.h" mais le problème est que le programme "attaque.c" ne se compile pas, il existe des erreurs dans le code relatifs aux pointeurs , si quelqu'un parvient à compiler le code "attaque.c" j'en serais très reconnaissant :
Voici les codes :
--------------------------------------------------------------------------------------------------------------
Code://tools.c #include<stdio.h> #include<stdlib.h> void affiche_bloc(unsigned char *bloc, int taille) { int i; for (i=0; i<taille; i++) printf("%02x",bloc[i]); /* printf("\n"); */ } int main(void) {} ----------------------------------------------------------------------------------------------------------------- //oracle.c #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <netinet/in.h> #include <unistd.h> #include <errno.h> #include <string.h> #define PORT 2001 #define TRUE 1 #define FALSE 0 #define SIZE_BLOCK 8 unsigned char bonjour[1] = {0x01}; unsigned char aurevoir[1] = {0x00}; int addrlen; struct sockaddr_in service ; /* pour coder l'adresse du service */ int sockd; int ouvre_oracle(char *hote){ sockd = socket(PF_INET,SOCK_STREAM,0) ; if(sockd==-1){ perror("Erreur lors de la cr\\'eation d'une socket\n") ; return -1 ; } service.sin_family = AF_INET ; /* c'est la seule famille qui existe pour l'instant */ service.sin_port = htons(PORT) ; /* Apr\`es avoir v\'erifier dans le fichier /etc/services que ce num\'ero est libre */ struct hostent *infohote = gethostbyname(hote) ; if(infohote==NULL){ perror("Impossible de r\\'ecup\\'erer un num\\'ero IP"); return -1 ; } memcpy(&service.sin_addr, infohote->h_addr_list[0],infohote->h_length) ; addrlen = sizeof(service) ; int res = connect(sockd, (struct sockaddr *) &service, sizeof(service)) ; if(res<0){ perror("Erreur lors de l'adressage de la prise") ; close(sockd) ; return -1 ; } unsigned char tmp ; /* recevoir confirmation connexion */ recvfrom(sockd,&tmp,1, 0, (struct sockaddr *) &service, &addrlen); if(tmp!=TRUE){ return 2 ; } return 0; } int ferme_oracle(void) { sendto(sockd, aurevoir, sizeof(char), 0, (struct sockaddr *) &service, addrlen); return close(sockd) ; } int interroge_oracle(char * msg){ unsigned char tmp; sendto(sockd, bonjour, sizeof(char), 0, (struct sockaddr *) &service, addrlen); sendto(sockd, msg, 2*SIZE_BLOCK, 0, (struct sockaddr *) &service, addrlen); recvfrom(sockd,&tmp, sizeof(char), 0, (struct sockaddr *) &service, &addrlen); /* la reponse du serveur #define TRUE 1 #define FALSE 0 dans tmp */ return (int) tmp ; } int main() {} -------------------------------------------------------------------------------------------------------------------------- //attaque.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "tools.h" #include "oracle.h" //#include "oracle.h.gch" //#include "tools.h.gch" #define SIZE_BLOCK 64 unsigned char bloc_chiffre[SIZE_BLOCK] = { // completer ici avec un bloc de 64 bits d�crit en hexa // par exemple : // 0x24, 0x46, 0x18, 0x96, 0xFA, 0x2E, 0x40, 0xC1 0x86, 0xFF, 0x28, 0x76, 0x1E, 0x87, 0x5E, 0x5E }; int main(void) { int i,j,reponse_oracle = 0 ; printf("%s\n",ORACLE); if (ouvre_oracle(ORACLE)) { /* contact avec l'oracle */ return EXIT_FAILURE; } unsigned char question[2*SIZE_BLOCK] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; printf("Bloc alea : "); affiche_bloc(question,SIZE_BLOCK); printf("\n") ; printf("Bloc chiffre : "); affiche_bloc(bloc_chiffre,SIZE_BLOCK); printf("\n") ; memmove(question+SIZE_BLOCK*sizeof(char),bloc_chiffre,SIZE_BLOCK*sizeof(char)); for(j=0 ; j<256 && reponse_oracle !=1 ;j++){ question[SIZE_BLOCK-sizeof(char)] = j ; affiche_bloc(question,SIZE_BLOCK); reponse_oracle = interroge_oracle(question) ; printf("| %d |",reponse_oracle); printf("\n") ; } ferme_oracle(); /* cloture de la connexion */ return EXIT_SUCCESS;} ----------------------------------------------------------------------------------------------------------------- //tools.h void affiche_bloc(unsigned char *, int) ; ---------------------------------------------------------------------------------------------------------------- //oracle.h #define ORACLE "localhost" int ouvre_oracle(char *hote); int ferme_oracle(void); int interroge_oracle(char *msg); ---------------------------------------------------------------------------------------------------------------
MERCI D'AVANCE.
-----