cifrar / decifrar md5 openssl [linux]

alfinete

Power Member
Função encript

Código:
void encrypt(unsigned int k[], unsigned int text[]) {
  unsigned int y = text[0], z = text[1];
  unsigned int a = k[0], b = k[1], c = k[2], d = k[3];
  unsigned int delta = 0x9e3779b9, sum = 0; int n;

  for (n = 0; n < 32; n++) {
    sum += delta;
    y += ((z << 4) + a) ^ (z+sum) ^ ((z >> 5)+b);
    z += ((y << 4) + c) ^ (y+sum) ^ ((y >> 5)+d);
  }
  text[0] = y;  text[1] = z;
}


Função decript

Código:
void decrypt(unsigned int k[], unsigned int text[]){
  unsigned int y = text[0], z = text[1];
  unsigned int a = k[0], b = k[1], c = k[2], d = k[3];
  unsigned int delta = 0x9e3779b9;
  unsigned sum = delta << 5;  
  //  unsigned int sum=0xC6EF3720;
  int n;    
  for (n = 0; n < 32; n++) {
    z -= ((y << 4) + c) ^ (y+sum) ^ ((y >> 5) + d);
    y -= ((z << 4) + a) ^ (z+sum) ^ ((z >> 5) + b);
    sum -= delta;
  }
  text[0] = y; text[1] = z;
}

__________________________________________________________________________
programa final

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <openssl/md5.h>



void encrypt(unsigned int k[], unsigned int text[]);
void decrypt(unsigned int k[], unsigned int text[]);



  char size[8];
  int i;
  unsigned char md[MD5_DIGEST_LENGTH];
  char *modo;
  int origem, destino;
  char palavra[64];




main(int argc, char*argv[])
{

     /*informação ao utilizador dos parametros de funcionamento do programa*/
        if (argc < 4)
         {
             printf("Utilização %s <origem> <destino> <op>\n", argv[0]);
             exit(0);
         }
    //detecta se o ficheiro de origem existe e da-nos a respectiva mensagem de erro

    if( (origem = open(argv[1],O_RDONLY)) == -1)
         {
         fprintf(stderr, "Ficheiro de origem nao existe: %s\n", argv[1]);
     exit(1);
     }
    
   //detecta se o ficheiro de destino existe e da-nos a respectiva mensagem de erro

    if( (destino = open(argv[2],O_RDONLY)) != -1)
        {
        fprintf(stderr, "Ficheiro de destino ja existe: %s\n", argv[2]);
        exit(1);
        }


        if( (destino = open(argv[2], O_CREAT|O_RDWR)) == -1){
          fprintf(stderr, "Nao foi psssivel criar ficheiro: %s\n", argv[2]);
          exit(1);
         }
   modo = argv[3];

if( *modo =='e')
{
    /* oBRIGA O UTILIZADOR A DIGITAR UMA CHAVE PARA ENCRIPTAR O FICHEIRO*/
    printf("\nDigite Um Valor para gerar a chave :\n");
    /* Guarda o valor digitado pelo utilizador na variavel var lendo.o*/
    /*caso o utilizador não digite nada sai do programa*/
    if (fgets(palavra, sizeof(palavra), stdin) == NULL)
exit(0);
i = strlen(palavra)-1;
palavra[i] = '\0';
/*encripta o valor dessa variavel em md5 */
MD5((unsigned char *)palavra, i,md);
 /*faz um print dessa chave no ecrã*/
printf("Digest MD5:");
for (i=0; i < MD5_DIGEST_LENGTH; i++)
printf("%x", md[i]);
printf("\n");
}
else
{

   /*pede ao utilizador para inserir a chave gerada no encript*/
     printf("Insira o valor da chave:");
    /*Caso u utilizador a digite faz a desencriptação*/
    /*caso contrario sai*/
     if (fgets(palavra, sizeof(palavra), stdin) == NULL)
exit(0);
i = strlen(palavra)-1;
palavra[i] = '\0';
MD5((unsigned char *)palavra, i,md);
printf("Chave:");
for (i=0; i < MD5_DIGEST_LENGTH; i++)
printf("%x", md[i]);
printf("\n");
}
/*  */
 while(*modo)
 {
  /* lê 8 bites para dentro do ficheiro de texto não encriptado */
  i = read(origem, size, 8); 
  if (i <= 0) break;

  while (i < 8) 
 /* cloca espaços em cada 8 bites */
  {
   size[i++] = ' ';
  }

   /*escolha do modo "e" para encriptar e "d" para desencriptar*/
   switch (*modo) 
   {
    case 'e':
     encrypt((unsigned int*) md, (unsigned int*) size);
     break;
    case 'd':
     decrypt((unsigned int*) md, (unsigned int*) size);
    //default:
      //     printf("Modo errado : %s\n", modo);
        //   exit(1);
          break;
    }
   /* escreve 8 bites no ficheiro encriptado */
  i=write(destino, size, 8);
 }
}
/*função de encriptação*/
void encrypt(unsigned int k[], unsigned int text[]) {
  unsigned int y = text[0], z = text[1];
  unsigned int a = k[0], b = k[1], c = k[2], d = k[3];
  unsigned int delta = 0x9e3779b9, sum = 0; int n;

  for (n = 0; n < 32; n++) {
    sum += delta;
    y += ((z << 4) + a) ^ (z+sum) ^ ((z >> 5)+b);
    z += ((y << 4) + c) ^ (y+sum) ^ ((y >> 5)+d);
  }
  text[0] = y;  text[1] = z;
}

/*função de desencriptação*/
void decrypt(unsigned int k[], unsigned int text[]){
  unsigned int y = text[0], z = text[1];
  unsigned int a = k[0], b = k[1], c = k[2], d = k[3];
  unsigned int delta = 0x9e3779b9;
  unsigned sum = delta << 5;  
  //  unsigned int sum=0xC6EF3720;
  int n;    
  for (n = 0; n < 32; n++) {
    z -= ((y << 4) + c) ^ (y+sum) ^ ((y >> 5) + d);
    y -= ((z << 4) + a) ^ (z+sum) ^ ((z >> 5) + b);
    sum -= delta;
  }
  text[0] = y; text[1] = z;
}


gostava de uma pequena ajuda neste programa pois fiz algumas coisas dele com a ajuda de colegas, ha muita coisa quenão percebo dele

gostava primeiro que me explicassem o mais possivel a função encript e decript

1)e caso seja possivel para que serve a variavel *modo [so sei que é um ponteiro]
_______________________________________

2)a parte dos arg's , so sei que são aargumentos da linha de comandos, mas nam percebo muito bem
_______________________________________
3) este excerto


Código:
    printf("\nDigite Um Valor para gerar a chave :\n");
    /* Guarda o valor digitado pelo utilizador na variavel var lendo.o*/
    /*caso o utilizador não digite nada sai do programa*/
    if (fgets(palavra, sizeof(palavra), stdin) == NULL)
exit(0);
i = strlen(palavra)-1;
palavra[i] = '\0';
/*encripta o valor dessa variavel em md5 */
MD5((unsigned char *)palavra, i,md);
 /*faz um print dessa chave no ecrã*/
printf("Digest MD5:");
for (i=0; i < MD5_DIGEST_LENGTH; i++)
printf("%x", md[i]);
printf("\n");

________________________________________
4- em while(*modo)

Código:
 i = read(origem, size, 8); 
  if (i <= 0) break;

_________________________________________
Código:
 i=write(destino, size, 8);
___________________________
5- nos cases

Código:
 encrypt((unsigned int*) md, (unsigned int*) size);

____________________________

6 - e por ultimo para que servem as variáveis

agradecia imenso pois tenho de apresentar este trabalho


este trabalho serve para cifrar e decifrar ficheiros . atraves de md5

agradecia uma ajuda rápida

obrigado
 
Já te tentei explicar na outra thread que esse programa não utiliza MD5 para cifrar/decifrar (até porque não é para isso que ele serve), o algoritmo utilizado é o TEA (Tiny Encription Algorithm). Aliás, se retirares toda a parte referente ao MD5 e utilizares como chave um array com 16 caracteres ou 4 inteiros (= 128bits) o algoritmo continua a funcionar na perfeição.

Em relação às funções encrypt() e decrypt(), podes obter informação aqui.

Há aí algumas questões que fazes (sobre as funções read() e write(), excerto do MD5, etc) que por estarem explicadas em comentário e tu não perceberes, faz-me duvidar que tenhas feito muito deste trabalho.. É que muitas das dúvidas são dúvidas básicas de C e não de quem já está a implementar uma aplicação criptográfica.
 
Última edição:
Back
Topo