1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

cifrar / decifrar md5 openssl [linux]

Discussão em 'Programação' iniciada por alfinete, 19 de Setembro de 2007. (Respostas: 2; Visualizações: 2068)

  1. alfinete

    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
     
  2. PrOdG

    PrOdG Power Member

    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: 20 de Setembro de 2007
  3. alfinete

    alfinete Power Member

    qualquer ajuda é bem vinda

    muitissimo obrigado
     

Partilhar esta Página