C-Cryptography

0

I'm developing a C program that will be able to encrypt and decrypt texts and save them to disk separately.

I want to use the ASCII table for the implementation of Encryption, I am able to encrypt but at the time of reversing the text I am having great difficulties, the program saves only a "random" character instead of saving the text that was typed before being encrypted.

The following is the code below:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Criptografar(char chave[])
{
    int tam_chave = strlen(chave);    //Configuração da chave para criptografia
    char texto[100000];               //Vetor de entrada de texto a ser criptografado
    int texto_cript[100000];          //Vetor de encriptação
    int valor_chave, aux = 0, i;      //Variáveis de controle de chave

    FILE *arquivo;                    //ponteiro do arquivo

    printf("\n\nDigite o texto a ser criptografado: \n");
    scanf("\n%[^\n]s", texto);        //Lê o que você digitar
    printf("\n\n");                   //Separa pra não virar bagunça

    for(i = 0; i < strlen(texto); i++)
    {
        texto_cript[i]=texto[i];      //Atribui pro TEXTO_CRIPT o ASCII dos caracteres digitados
    }
    while(aux < strlen(texto))        //Vai de 0 até o tamanho do texto incrementando dentro do for
    {
        for(i = 0; i < tam_chave; i++)//Percorre a chave dinâmicamente ex.: "aBcd" 0123
        {
            valor_chave = chave[i];   //pega o ASCII da chave dinâmicamente ex.: "a" = 65
            texto_cript[aux] *= valor_chave; //multiplica o ASCII de TEXTO_CRIPT pelo ASCII de VALOR_CHAVE e atribui para TEXTO_CRIPT.
                                             //EX.: "a" 65 * 65 = 4225
            aux++;                           //incrementa o AUX
        }
    }

    arquivo = fopen("criptografado.txt", "w"); //Cria o arquivo pra escrita
    if (arquivo==NULL)
    {
        printf("\n\nErro ao criar o arquivo.....\n\n\n");
    }
    else
    {
        for (i = 0; i < strlen(texto); i++)//percorre o texto digitado pelo usuário
        {
            fprintf(arquivo, "%d", texto_cript[i]); //grava em arquivo o texto já encriptado
        }
    }
    fclose(arquivo);    //fecha o arquivo
}

int Descriptografar(char chave[])
{
    int tam_chave = strlen(chave);      //Configuração da chave para criptografia
    int texto_decript[100000];          //Vetor de descriptação
    int valor, pos_chave = 0, pos_texto  = 0, i; //Variáveis de controle de chave

    FILE *arquivo;

    arquivo = fopen("criptografado.txt", "r"); //Abre o arquivo para leitura
    if (arquivo==NULL)
    {
        printf("\n\nErro ao criar o arquivo.....\n\n\n");
    }
    else
    {
       while(!feof(arquivo))    //Percorre o arquivo criptografado até o final
       {
           fscanf(arquivo,"%d", &valor);    //Lê os valores criptografados em ASCII
           valor /= chave[pos_chave];       //Divide o valor pelo ASCII da posição ASCII da chave
           texto_decript[pos_texto] = (char)valor; //TEXTO_DECRIPT recebe o typecasting de valor, ex.: 65 = "a"
           pos_texto++;                     //incrementa a posição do vetor TEXTO_DECRIPT

           if (pos_chave == tam_chave-1) //Percorre a chave e retorna na posição inicial
           {
               pos_chave = 0;
           }
           else
           {
               pos_chave++;             //Senão, incrementa a chave
           }
       }
    }
    fclose(arquivo); //Fecha o aarquivo com o texto criptografado

    arquivo = fopen("descriptografado.txt", "w"); //Cria um novo arquivo para escrita
    fprintf(arquivo, "%s", texto_decript);        //Grava em arquivo o texto já decriptado
    printf("\n\nO arquivo foi descriptado com sucesso!\n\n\n"); //Frescura minha pra dizer que terminou a função
}

int main(void)
{
    int opcao = 0;
    do
    {
        //MENU
        printf("\nSelecione uma opcao:\n 1 - Criptografar texto digitado.\n 2 - Descriptografar texto.\n 3 - Sair.\n");
        scanf("%d", &opcao);
        switch(opcao)
        {
            case 1:
                Criptografar("AbCd"); //Ativa a função passando como parâmetro a chave desejada
                break;
            case 2:
                Descriptografar("AbCd"); //Faz a mesma coisa que eu comentei acima
                break;
            case 3:
                continue;
                break;
            default:
                printf("\nOpcao invalida! Tente Novamente.\n\n");
        }
    }while(opcao != 3);
    return 0;
}
    
asked by anonymous 25.06.2018 / 00:24

1 answer

2

You have two problems with your code.

The first is overflow. A% of% (or simply% of%) stores values between -2,147,483,648 and 2,147,483,647. Now see what happens if the user wants to encrypt the letter z:

for(i = 0; i < tam_chave; i++)
{
    valor_chave = chave[i];
    texto_cript[aux] *= valor_chave;
    aux++;                       
}

Since the key is "AbCd". text [aux] will be equal to 122 * 65 * 98 * 67 * 100, which is equal to 5206838000. You could even remedy by declaring the signed int vector as int , but in the end it would be almost the same thing.

The other problem is the way you are reading and writing the data. The numbers are being recorded in text format, one after the other, without giving a chance to determine where the number corresponding to the encrypted character begins or ends.

    
25.06.2018 / 11:18