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

encriptar / desencriptar linux [md5]

Discussão em 'Dúvidas e Suporte Técnico - GNU/Linux & *nix' iniciada por alfinete, 15 de Setembro de 2007. (Respostas: 5; Visualizações: 3839)

  1. alfinete

    alfinete Power Member

    código fonte encriptação/ desencriptação de ficheiro

    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 Text[8];
      int i;
      unsigned int k[0], val;
      unsigned char md[MD5_DIGEST_LENGTH];
      char *modo;
      int origem, destino;
    
    
    
    
    
    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 (scanf("%d", &val) == EOF) {
          exit(0);
        }
        /*encripta o valor dessa variavel em md5 */
        MD5((unsigned char *)&val, sizeof(val), (unsigned char *)k);
    
        /*faz um print dessa chave no ecrã*/
        printf("Chave: %x %x %x %x\n", k[0], k[1], k[2], k[3]);
    }
    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(scanf("%d", &val) == EOF)
         {
         exit(0);
         }
         MD5((unsigned char *)&val, sizeof(val), (unsigned char *)k);
         printf("Chave: %x %x %x %x\n", k[0], k[1], k[2], k[3]);
    }
    /*  */
     while(*modo)
     {
      /* lê 8 bites para dentro do ficheiro de texto não encriptado */
      i = read(origem, Text, 8); 
      if (i <= 0) break;
    
      while (i < 8) 
     /* cloca espaços em cada 8 bites */
      {
       Text[i++] = ' ';
      }
    
       /*escolha do modo "e" para encriptar e "d" para desencriptar*/
       switch (*modo) 
       {
        case 'e':
         encrypt(k, (unsigned int*) Text);
         break;
        case 'd':
         decrypt(k, (unsigned int*) Text);
        //default:
          //     printf("Modo errado : %s\n", modo);
            //   exit(1);
              break;
        }
       /* escreve 8 bites no ficheiro encriptado */
      i=write(destino, Text, 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;
    }
    
    este é o meu codigo fonte

    este codigo consta de uma encritação de ficheiros atraves do algotitmo TEA , ou seja podemos desencriptar um file e desencrita-lo.

    complila-lo para quem não sabe

    se o ficheiro se chamar enc.c

    Código:
    
    gcc enc.c -o enc -lssl
    
    
    correr o ficheiro

    Código:
    
    ./enc <ficheiro de origem> < ficheiro de destino> <e/d>
    
    

    e - encritar ficheiro
    d- desencriptar ficheiro



    duvida

    com este progrtamita consigo encriptar ficheiros *.txt e *.html etc

    exepto *.encr

    como:

    http://www.megaupload.com/?d=96346URW

    ___________________________________________________

    duvida:

    atenção o ficheiro que se encontra neste link [megaupload] para download é um file que já vem encriptado, por alguem, em que a chave é 20064158, e o objectivo é desencripta-lo

    como ja felei so consigo desencripatr files criados por mim e encriptados e desencriptados por mim de extensão .html e .txt, este não consigo.

    gostava que me ajudassem a alterar o code para tal:


    _________________________

    estou a desenvolver em open suse ou suse 10.2

    ____________

    agradecia um help urgente

    espero que esteja bem explicado o caso

    obrigado
     
  2. souto

    souto To fold or to FOLD?

    Este tópico deveria estar na secção de programação. Aqui não terás grande feedback :)
     
  3. PrOdG

    PrOdG Power Member

    Em primeiro lugar, em criptografia utilizam-se os termos "cifrar" e "decifrar", não "encriptar" e muito menos "desencriptar".

    Em relação ao tópico em si, o algoritmo MD5 é utilizado para hashing e não para cifra/decifra de ficheiros, já que é um algoritmo unidireccional. Não me encontro em casa agora, mas mais tarde posso dar uma vista de olhos no teu código e dar-te umas dicas (penso que tenho até aqui um programa que utiliza TEA).
     
  4. PrOdG

    PrOdG Power Member

    OK, já dei uma vista de olhos no código e já percebi alguma coisa do que querias dizer.

    1. O teu programa aqui funciona sem problemas, embora não esteja lá muito optimizado (corre muito lentamente). Tentei cifrar ficheiros de texto e ficheiros binários, e funcionou para os dois. O que não funciona aí?
    2. O único problema aqui é a falta de permissões no ficheiro criado pelo programa. man open para veres as flags que precisas, ou então aconselho-te a transformar as variáveis origem e destino em FILE* e utilizar as funções fopen, fread, fwrite e fclose.
    3. O algoritmo MD5 é utilizado apenas para gerar uma chave de 128bits que vais depois utilizar para as operações de XOR e ADD (que essas sim, servem para cifrar e decifrar o código). Se quisesses preenchias a chave à mão, bastava-te ocupar os 128bits.
    4. Para ser sincero, pelos teus comentários pareces estar a perceber mal o que alguns passos do algoritmo fazem. Sugiro algum estudo adicional ;)
     
  5. alfinete

    alfinete Power Member

    obrigado por todos os helps, sempre ajudaram

    aqui tem a solução final que ja funciona com todos


    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;
    }
    
    
    o que eu queria decifrar era um file enviado pelo prof com extensão .encr
    
    e ja consegui , pois o que com o code inicial ao qual dei a duvida não dava.
    
    
    obrigado por tudo
    
    
    
    
     
  6. alfinete

    alfinete Power Member

    pus um poste na programação , com este codigo final que postei no reply anterior, para me darem uma explicação sobre o mesmo , pois eu não percebo muito de c ao nivel da encriptação, e consola, por isso agradecia que um de voces me explicasse praticamente passo a passo do code nos seguintes conteudos.

    1) para que servem as variáveis

    __________


    2)if , whiles e cases nam é precisso explicar
    so apenas as instruções que se encontram dentro dos mesmos e respectivos parametros

    ___________

    3) e os parametros arg's que se encontram nos ifs respectivos

    e porque é nessesario ter o if ('e')then else para e-cifrar e contrario decifrar
    e depois um mesmo case 'e', e case'd' , se ambos os casos são extryturas de control

    agradecia uma ajuda pois precisso do apresentar

    obrigado
     

Partilhar esta Página