encriptar / desencriptar linux [md5]

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
 
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).
 
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 ;)
 
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
 
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
 
Back
Topo