Bonjour !
J'ai une errreur que je n'arrive pas à résoudre...
Je m’explique :
J’ai deux fichiers : un fichier serveur.c et un fichier client.c le but est que le client qui possède le fichier A chiffre celui-ci dans un fichier B, l’envoie au serveur (on obtient un fichier C)et que le serveur le déchiffre dans un fichier D. (la clé transite en clair au début mais c’est pas important dans l’immédiat, dans le futur elle transitera chiffrée avec du rsa.) donc mon problème est lors du déchiffrement du serveur… Il ne finit pas de déchiffrer…
Il me met ça comme erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
error in decrypt final
: Success
3908:error:0606506D:lib(6):func(101):reason(109):evp_enc.c:454:
Donc soit, j’ai un problème dans ma fonction de déchiffrement (ce qui est bizarre parce qu’elle fonctionne bien quand tout est dans un meme fichier.c. ou alors, je n’envoie pas le fichier correctement via ma connexion TCP…
Voici mon code :
coté client pour l'envoi du fichier :
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
 
    /*ouverture du fichier*/
    fp_source=fopen(FICHIER_ENCRYPT,"r");
    if (fp_source==NULL)
      {
      perror("call to open\n");
      exit(1);
      }
    fseek(fp_source,0,SEEK_SET);
    /*taille du fichier*/
    taille_fichier=fsize(fp_source);
 
    /*envoi de la taille du fichier*/
    if (send(sock_descriptor, &taille_fichier, sizeof (taille_fichier),0)==-1)
        {
        perror("call to send\n");
        exit(1);
        }
    printf("envoi taille fichier ok\n");
 
 
        /*tant qu'on a pas tout envoyé*/
        while ((!feof(fp_source)))/*&&(m<taille_fichier))*/
        {
          /*lecture dans le fichier*/
          fgets(buf,100,fp_source);
 
          /*envoi du contenu du fichier*/
          if (((send(sock_descriptor, &buf, sizeof(buf),0)))==-1)
            {
            perror("call to send\n");
            exit(1);
            }
 
          /*remise à zéro du buffer*/
          bzero(&buf,sizeof(buf));
        }
 
        printf("envoi effectué\n");
coté serveur la réception du-dit fichier :
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
 
  /*ouverture du fichier résultat*/
  fp_resultat=fopen(FICHIER_ENCRYPT,"wb");
  if (fp_resultat==NULL)
      {
      perror("call to open\n");
      exit(1);
      }
 
 
 
 
      while (taille_fichier>=0)
        {
        /*réception du fichier*/
        if (recv(temp_sock_descriptor,&buf,sizeof(buf),0)==-1)
          {
          perror("call to rcv\n");
          exit(1);
          }
        while ((buf[i]!='\n'))/*|(i<(sizeof(buf)))*/
          {
          i=i+1;
          }
 
        taille_buf=i;
 
        /*écriture dans le fichier résultat*/
        fputs(buf,fp_resultat);
        /*diminue la taille*/
        taille_fichier=taille_fichier-taille_buf;
        taille_buf=0;
        i=0;
 
        bzero(&buf,sizeof(buf));/*remise à zéro du buffeur*/
        }
        fputs("EOF",fp_resultat);
      /*fermeture du fichier*/
      fclose(fp_resultat);
      printf("reception ok\n");
et enfin coté serveur : l'appel de ma fonction decrypt :
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
 
 
int flags1 = 0, flags2 = 0, outfd, infd, decfd;
  mode_t mode;
	bzero (&mode, sizeof (mode));
 
	flags1 = flags1 | O_RDONLY;
	flags2 = flags2 | O_RDONLY;
	flags2 = flags2 | O_WRONLY;
	flags2 = flags2 | O_CREAT;
 
	mode = mode | S_IRUSR;
	mode = mode | S_IWUSR;
 
 
 if ((outfd = open (FICHIER_ENCRYPT, flags1, mode )) == -1)
				    perror ("open output file error");
 
			    if ((decfd = open (FICHIER_DEC, flags2, mode)) == -1)
				    perror ("open output file error");
 
			    decrypt (outfd, decfd);
 
			    close (outfd);
			    fsync (decfd);
			    close (decfd);
			    printf("the file is decrypt\n\n");
et enfin, la fameuse fonction decrypt :
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
 
int decrypt (int infd, int outfd)
{
	unsigned char outbuf[IP_SIZE];
	int olen, tlen, n;
	char inbuff[OP_SIZE];
	EVP_CIPHER_CTX ctx;
	EVP_CIPHER_CTX_init (&ctx);
	EVP_DecryptInit (&ctx, EVP_bf_cbc (), key, iv);
 
	for (;;)
	  {
		  bzero (&inbuff, OP_SIZE);
		  if ((n = read (infd, inbuff, OP_SIZE)) == -1)
		    {
			    perror ("read error");
			    break;
		    }
		  else if (n == 0)
			  break;
 
		  bzero (&outbuf, IP_SIZE);
 
		  if (EVP_DecryptUpdate (&ctx, outbuf, &olen, inbuff, n) != 1)
		    {
			    printf ("error in decrypt update\n");
			    return 0;
		    }
 
		  if (EVP_DecryptFinal (&ctx, outbuf + olen, &tlen) != 1)
		    {
			    perror("error in decrypt final\n");
				ERR_print_errors_fp(stderr);
 
			    return 0;
		    }
		  olen += tlen;
		  if ((n = write (outfd, outbuf, olen)) == -1)
			  perror ("write error");
	  }
 
	EVP_CIPHER_CTX_cleanup (&ctx);
	return 1;
}
voila, encore deux précisions : j'utilise l'algo blowfish avec la librairie d'openSSL et je suis sous Redhat.

merci d'avance pour votre aide!!