Cryptography in C

Asked

Viewed 1,893 times

0

I am developing a program in C, which 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 Cryptography, I am able to encrypt but when 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.

Follow 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;
}

1 answer

2


You have two problems with your code.

The first is overflow. A signed int (or simply int) stores values between -2,147,483,648 to 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++;                       
}

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

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.