Ir para conteúdo

POWERED BY:

Arquivado

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

Kelvin Dules

[Resolvido] Criptografia em Arquivo de Texto.

Recommended Posts

Olá, aqui estou mais uma vez com MAis uma dúvida =p

 

Bom, estou criando um codificador para atuar junto com um programa criei.

Segue o codigo do codificador:

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <strings.h>
void test();
char strings[25];
int stringsx[1];
int opt;
FILE *arq;

		 int main(){
			 printf(" KCS - Kelvin Criptografador de Senhas \n");
			 printf("	Versao de Testes 001\n");
			 printf("   Versao para implementacao no VGS GM\n\n");
			 _sleep(2500);
			 system("cls");
			 printf("Area de Testes*\n\n");
			 printf("[1] Testar\n");
			 printf("[2] Sair\n\n");
			 scanf("%d",&opt);
			 switch(opt){
						 case 1: test();break;
						 case 2: return(0);break;
						 default: printf("Pixilinga. x)");
						 }}
						 
													 void test(){
														   printf("Detectando Str em : 'program_key.txt'...");
														   _sleep(1000); system("cls");
														   if(arq = fopen("Security//program_key.txt","r+")){
																  fgets(strings,49,arq);
																  fclose(arq);
																  }
																  for(int k=0; k < strlen(strings); k++)
																  {
																  switch(strings[k])
																  { // CASES parte << 1 >>
																				 case 'a': stringsx[k] = 1;break;
																				 case 'b': stringsx[k] = 2;break;
																				 case 'c': stringsx[k] = 3;break;
																				 case 'd': stringsx[k] = 4;break;
																				 case 'e': stringsx[k] = 5;break;
																				 case 'f': stringsx[k] = 6;break;
																				 case 'g': stringsx[k] = 7;break;
																				 case 'h': stringsx[k] = 8;break;
																				 case 'i': stringsx[k] = 9;break;
																				 case 'j': stringsx[k] = 11;break;
																				 case 'k': stringsx[k] = 12;break;
																				 case 'l': stringsx[k] = 13;break;
																				 case 'm': stringsx[k] = 14;break;
																				 case 'n': stringsx[k] = 15;break; 
																				 case 'o': stringsx[k] = 16;break;
																				 case 'p': stringsx[k] = 17;break;
																				 case 'q': stringsx[k] = 18;break;
																				 case 'r': stringsx[k] = 19;break;
																				 case 's': stringsx[k] = 21;break;
																				 case 't': stringsx[k] = 22;break;
																				 case 'u': stringsx[k] = 23;break;
																				 case 'v': stringsx[k] = 24;break;
																				 case 'x': stringsx[k] = 25;break;
																				 case 'z': stringsx[k] = 26;break;
																				 case 'w': stringsx[k] = 27;break;
																				 case 'y': stringsx[k] = 28;break;
																				 }//Fim dos Cases parte << 1 >>*
														   for (int i=0;i<strlen(strings);i++)
														   if(arq = fopen("Security//program_key.txt","w"))
															fprintf(arq,"%d",stringsx[i]);
														   fclose(arq);
														   _sleep(1000);}
																				 printf("Concluido.\n\n");
																				 system("pause");
																				 }

PROBLEMA: Ao gravar os números no arquivo, parece mais que usei um rand(); tudo bagunçado... nada substituído como o planejado.

 

Não quero que façam por mim, só me deem uma luz e tal.

 

Atenciosamente,

Kelvin.

 

EDIT: Eu sei que poderia ter feito isso sem ter de colocar tantos cases.. mas analisem como está, por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

case 'a': stringsx[k] = 1;break;

 

Toque: é um tanto sacal ler statements grudados uns nos outros.

 

 

char strings[25];
....
	fgets(strings,49,arq);

 

Tem no máximo 25 mas você quer ler 49 "se der"?

 

Certeza que o \n deve ficar no final da string depois do fgets?

 

 

isis@linux-gy11:~/Imasters> ./a.out

KCS - Kelvin Criptografador de Senhas

Versao de Testes 001

Versao para implementacao no VGS GM

 

Area de Testes*

 

[1] Testar

[2] Sair

 

1

Falha de segmentação

 

 

Está tudo aleatório por causa disso:

char strings[25];
int stringsx[1];

 

Você declara um array de inteiros de 1 posicao (o que equivale a um int) e quer armazenar os 25 caracteres nele? E mais: quer armazenar um int (4 bytes) em um espaço de 1 byte?

 

 

 

O for de escrita está dentro do primeiro for.

 

 

for(int k=0; k < strlen(strings); k++) 
...
for (int i=0;i<strlen(strings);i++) {

 

Já que você vai fazer exatamente a mesma coisa, use a mesma variável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, você deveria identar o seu código melhor...

Ta meio difícil de ler assim...

http://codepad.org/rvGGp3xr

 

Além dos erros que a Isis apontou, eu achei mais alguns, coisa pouca, dois palitos e você arruma! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Uma dúvida minha agora... pra que tantos sleeps???

 

Mas vamos lá

Ali na linha 33,

if(arq = fopen("Security//program_key.txt","r+"))
	{
		fgets(strings,49,arq);
		fclose(arq);
	}

E se o arquivo não existir?

Por que arg SEMPRE será igual a fopen("qualquer_coisa")... você está fazendo essa atribuição. O problema é se fopen returnar NULL, você não vai lera string com o fgets, deve dar um segmentation fault, e se não der ai vai dar logo em seguida quando você tenta acessar "strings[k]"

 

 

 

Pelo que eu vi, falta uma chave ali na linha 71....

supondo que haviam chaves ali:

você ta falando pra ele: Para cada i em "strings" abra o arquivo "security/program_key.txt" e sobrescreva.

você deveria abrir o arquivo com a opção "a", ou então, primeiro abre e depois vem o for

 

você poderia mudar esse case né... ta meio pog isso :P :P

if (strings[k] >= 'a' && strings[k] <= 'z') //está entre 'a' e 'z'
	stringsx[k] = int(strings[k]) - 64;
else
	stringsx[k] = -1; //esse seria o "default" do switch... que faltou ali em cima tbm

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é isso que você quer fazer?

 

#include <stdio.h>
#include <string.h>
#include <errno.h>
#define MAX 25

int main(){
FILE *arq;
char strings[MAX];
const char * filename = "program_key.txt";

printf("Detectando Str em : '%s'...\n",filename);
if( !(arq = fopen(filename,"r+"))) {
	printf("%m\n");
		   return(1);
   }
fgets(strings,MAX,arq);
fclose(arq);

(*strchr(strings,'\n')) = '\0';
char stringsx[strlen(strings)];

register unsigned int i = 0;
for(i=0; i < strlen(strings); i++)
	sprintf(&stringsx[i],"%d",( (int)strings[i]-(int)'a' )+1);

if( !(arq = fopen("key_int.txt","w"))) {
	printf("%m\n");
			return(1);
	}
if (fputs(stringsx,arq) == EOF)
	printf("%m\n");
fclose(arq);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar arrumar com as dicas de vocês, Obrigado.

 

----------------------|

 

Sleeps: Fica melhor de ver onde está o erro caso não seja identificado pelo copilador OU simplismente pra mensagens como: "Carregando..." que na verdade não ta carregando nada uehuaheuahuea.

 

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Sleeps: Fica melhor de ver onde está o erro caso não seja identificado pelo copilador

 

Existe uma coisa chamada debugger, conhece? Foi feita p/ achar erros de programação. Todo programador deveria saber mexer em um.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Continue pensando assim e você vai muito longe quando for debugar um código de umas mil linhas.

É que nem não fazer verificações de retorno de funções porque não se lê a manpage e depois dizer que o programa está estranho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.