alfinete
Power Member
Função encript
Função decript
__________________________________________________________________________
programa final
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
________________________________________
4- em while(*modo)
_________________________________________
___________________________
5- nos cases
____________________________
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
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