Ir ao conteúdo

Programa de Criptografia


Pedro Humberto

Posts recomendados

Postado

Olá, tenho que fazer um programa para a faculdade em linguagem C. Eu tenho que fazer um programa em C que recebe o nome completo de uma pessoa, criptografe e depois descriptografe.

O processo de criptografia é o seguinte:

1. O programa recebe um nome;

2. Atribuir a criptografia de Cezar, andando 3 posições com cada letra (No caso, letra “a” será letra ”d” e assim vai...);

3. Logo após, mostrar a posição de cada letra na tabela asc (No caso, a letra “a” seria 100, a letra “b” seria o 101 e assim vai...);

Bom, ate ai tudo bem, eu consegui fazer. O meu problema é que eu não tenho ideia de como fazer para descriptografar. A minha ideia inicial para fazê-lo é simples, só fazer o inverso. Mas o resultado final seriam números (exemplo: quando digito “abcd” o programa retorna 100 101 102 103). Como faço para isolar cada número? Letra é simples, porque não existe uma letra com mais de um caráter. Já com os números, eles podem ser tanto o nº 1 ou o nº 11 ou o nº 100, com um ou mais caracteres.

Alguém tem alguma ideia de como posso fazer? Estou quase ficando desesperado ‘’/

Segue abaixo o código do meu projeto final até a parte de criptografia.

//programa de criptografia 
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define tam 25

typedef struct{
char palavra[tam];

}dados;

void criptografa(dados cripto);

int main (){

dados nome;
criptografa(nome);

system("pause");
return 0;

}


void criptografa(dados cripto){
printf("Informe o nome do aluno: ");
gets(cripto.palavra);


for(int i = 0 ; i < strlen(cripto.palavra) ; i++){
if(cripto.palavra[i] == 'c'){
cripto.palavra[i] = 'f';
}
else if(cripto.palavra[i] == 'b'){
cripto.palavra[i] = 'e';
}
else if (cripto.palavra[i] == 'x'){
cripto.palavra[i] = 'a';
}
else {
cripto.palavra[i] = cripto.palavra[i] + 3 ;
}

}

for(int i = 0 ; i< strlen(cripto.palavra); i++){
putchar(cripto.palavra[i]);
} printf("\n");
for(int i = 0 ; i < strlen(cripto.palavra); i++){
printf(" %d",cripto.palavra[i]);

}

printf("\n");

}

void descriptografar(dados cripto){

}

Postado

Sugiro que você mude o argumento da função descriptografa para um vetor de inteiros.

Ao invés de fazer um if para cada letra, sugiro que você use cast de tipos. Por exemplo:

char c = 'a';
printf("%d", (int)c); /* Imprime o inteiro correspondente ao valor 'a' na tabela ASCII */

int n = 90;
printf("%c", (char)n); /* Imprime caractere na tabela ASCII correspondente ao número 90 */

Espero ter ajudado.

ZaZ.

Postado

Bom cara, na verdade o meu problema não é a criptografia, e sim a descriptografia...

O programa me retorna números referentes a posição de cada letra na tabela asc. No caso quando eu digito "abcd" ele me retorna "defg" e os números 100 101 102 103. O meu problema é como eu faço para isolar cada número desse de forma que quando eu for descriptografar, o programa tem que ler o número 100 separadamente do 101 e assim por diante...

Agradeço desde já :P

[]'s

Postado

Se você mandar ler um inteiro, o compilador entende que esse tipo é qualquer valor na forma [0-9]+ (aqui estou ignorando hexadecimal). Isso significa um caractere de 0 a 9 seguido de zero ou mais caracteres de 0 a 9. Ou seja, lê do primeiro ao último número até encontrar um caractere branco.

Na descriptografia do seu programa os números são lidos da entrada padrão ou de um arquivo de texto?

Postado

Na descriptografia do seu programa os números são lidos da entrada padrão ou de um arquivo de texto?

Bom, a princípio o programa não criará nenhum arquivo de texto com os dados salvos. No caso, ele acessaria um endereço de memória do próprio programa.

Na versão final do programa, a minha ideia é fazer um menu com os seguintes passos:

1 - Criptografar (Suponhamos que sejam no máximo 3 nomes a serem criptografados)

2 - Descriptografar

3 - Listar

4 - Sair

Quando eu acessar a opção "2" do menu, o programa vai me perguntar qual das posições quero descriptografar. Caso eu digite "1", ele teria que ler o dado criptografado na posição "1" e descriptografa-lo...

vlwsss...

Postado

Entendi, você só descriptografa depois de criptografar. É simples:

char s[7] = "string"; /* palavra a ser criptografada */
int i;
/* criptografar */
for (i = 0; i < 6; ++i) /* a posição 7 guarda o caractere '\0' que não deve ser modificada */
{
s[i] = (char)((int)s[i] + 3); /* tipo entre parênteses é um cast de tipo (conversão entre tipos) */
printf("%d", (int)s[i]); /* imprime o inteiro correspondente ao valor na tabela asc do caractere*/
}

printf("%s", s); /* deve imprimir "vxulqj" */

/* descriptografar */
for (i = 0; i < 6; ++i) /* a posição 7 guarda o caractere '\0' que não deve ser modificada */
{
s[i] = (char)((int)s[i] - 3); /* tipo entre parênteses é um cast de tipo (conversão entre tipos) */
printf("%d", (int)s[i]); /* imprime o inteiro correspondente ao valor na tabela asc do caractere*/
}

printf("%s", s); /* deve imprimir "string" */

Espero ter ajudado.

ZaZ.

Postado
Entendi, você só descriptografa depois de criptografar. É simples:

char s[7] = "string"; /* palavra a ser criptografada */
int i;
/* criptografar */
for (i = 0; i < 6; ++i) /* a posição 7 guarda o caractere '\0' que não deve ser modificada */
{
s[i] = (char)((int)s[i] + 3); /* tipo entre parênteses é um cast de tipo (conversão entre tipos) */
printf("%d", (int)s[i]); /* imprime o inteiro correspondente ao valor na tabela asc do caractere*/
}

printf("%s", s); /* deve imprimir "vxulqj" */

/* descriptografar */
for (i = 0; i < 6; ++i) /* a posição 7 guarda o caractere '\0' que não deve ser modificada */
{
s[i] = (char)((int)s[i] - 3); /* tipo entre parênteses é um cast de tipo (conversão entre tipos) */
printf("%d", (int)s[i]); /* imprime o inteiro correspondente ao valor na tabela asc do caractere*/
}

printf("%s", s); /* deve imprimir "string" */

Cara, você AJUDOU MUITO.

Deu certo, resolvi o meu problema. Adaptei a sua função no meu código e ficou assim:

 #include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define tam 25
#define tam2 11
typedef struct{
char palavra[tam];
char cpf[tam2];
}dados;
void criptografa(dados *cripto);
void descriptografar(dados *cripto);

int main (){

dados nome;
criptografa(&nome);
printf("\n\n\n");
descriptografar(&nome);

system("pause");
return 0;

}

void criptografa(dados *cripto){
printf("Informe o nome do aluno: ");
gets(cripto->palavra);


for(int i = 0 ; i < strlen(cripto->palavra) ; i++){
if(cripto->palavra[i] == 'z'){
cripto->palavra[i] = 'c';
}
else if(cripto->palavra[i] == 'y'){
cripto->palavra[i] = 'b';
}
else if (cripto->palavra[i] == 'x'){
cripto->palavra[i] = 'a';
}
else {
cripto->palavra[i] = cripto->palavra[i] + 3 ;
}

}

for(int i = 0 ; i< strlen(cripto->palavra); i++){
putchar(cripto->palavra[i]);
} printf("\n\n");
for(int i = 0 ; i < strlen(cripto->palavra); i++){
printf(" %d ",cripto->palavra[i]);

}

printf("\n");

}
//Função do XP_hunter lol
void descriptografar(dados *cripto){
for(int i = 0; i < strlen(cripto->palavra); ++i){
cripto->palavra[i] = (char)((int)cripto->palavra[i] - 3);
printf(" %d ", (int)cripto->palavra[i]);
}
printf("\n");
printf("%s ", cripto->palavra);
printf("\n");
}

Agora e só fazer o menu, arrumar algumas coisinhas e apresentar...

XP_hunter Muito obrigado mesmo, era exatamente isso que eu queria, tu é tipo um genio AUSHUShushAU.

Tópico RESOLVIDO...

Postado

Quando você terminar o curso isso vai ser fácil para você, principalmente se você escolher seguir numa área que use muito C/C++.

Segue o pseudocódigo da vida:

para i de quando nascemos até a morte faça
pessoa := melhora(pessoa)
fim para

Ainda sobre um tempo para rir de como éramos ignorantes no passado, e de rir no futuro por achar que sabemos tudo no presente.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...