Ir para conteúdo
Fórum Script Brasil
  • 0

Programa ( criptografia básica ) trabalhando com argv/argc e arquivos.


jnoise

Pergunta

Pessoal preciso de ajuda em um exercício

Exercício 8.4. A operação ou exclusivo bit-a-bit (^), tem a seguintes propriedades: (i) x^0=x, (ii)x^x=0 e (ii)(x^y)^z = x^(y^z). Usando essa operação podemos criar um método de criptografia com senha.

Seja m um caracter da mensagem e s um caracter da senha. Para criptografar m, fazemos m^s e obtermos o caracter criptografado c. Para ter m de volta, basta fazer c^s. Como c = (m^s), pelas propriedades acima, segue que c^s = (m^s)^s = m^(s^s) = m^0= m. Usando esse método, crie um programa para criptografia que receba a senha e os nomes dos arquivos de origem e destino via argumentos da linha de comando. [Dica: utilize as letras da senha ciclicamente, de modo que os caracteres da mensagem não sejam criptografados sempre com a mesma letra.

Segue um trecho do código. (codebox, não está "funciano")

#include "stdafx.h"
#include "string.h"
#include "stdlib.h"

void main(int argc, char *argv[]) { 

    FILE *entrada, *saida; 
    char c,senha[20],confSenha[20];
   
   if( argc!=3 ) {  
       printf("Faltam Parametros ex: cripto <c> <d> <nome do arquivo>\n"); 
      exit(1); 
   } 
   if( argc[1] !='c' || argc[1] !='d') {  
       printf("Erro de parametros ex: cripto <c> <d> <nome do arquivo>\n"); 
      exit(1); 
   } 

   do{    
        printf("Digite a senha: ");
            gets(senha);
            printf("Confirmacao de senha: ");
                gets(confSenha);
                    if(strcmp(senha, confSenha) != 0)
                    printf("senha não confere");
    }while(strcmp(senha, confSenha) != 0);

   if((entrada = fopen(argv[2],"rb"))== NULL){  
      printf("Arquivo não pode ser aberto\n"); 
      exit(1); 
   } 

   if((saida = fopen("temp.txt","wb"))== NULL){  
      printf("Arquivo não pode ser aberto\n"); 
      exit(1); 
   } 

    if( argc[1]=='c'){

       while(1) { 
        //  fputc('@',s); 
          c = fgetc(entrada);  
          if(feof(entrada)) break;  
          fputc(~c,saida); 
       } 
    } else {
        while(1) { 
          c = fgetc(entrada);  
          if(feof(entrada)) break;  
          fputc(~c,saida); 
        }
    }

   fcloseall(); 
   unlink(argv[2]);
   rename("temp.txt",argv[2]);
   unlink("temp.txt");
   getchar();
}

Desde já agradeço.

Jnoise.

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Jnoise,

Não tive tempo de estudar a fundo seu código, mas de cara tenho umas observações a fazer. A princípio achei o seu código bastante confuso, com algumas coisas que nem estão sendo usadas.

Onde você coloca:

argc[1] !='c'
Cara o argc é somente o contador de argumentos, nem vetor ele é para usar o []. Sempre que quiser trabalhar com os argumentos em si usa o argv. Fiz uma coisa aqui para ajudar você. Esta função aqui tipo vai ler um arquivo txt e substituir algum caracter por outro que você escolher: No caso se você fizer ./cripto c d teste1.txt c = caracter que vai ser substituído d = caracter que vai substituir teste1.txt = arquivo fonte
do {
         c = getc(entrada);
         if( c == 'c'  )
          {
             fwrite (argv[2] , 1 , sizeof(char) , saida );
          }
          else
          {
             putc( c, saida );
          }
       } while( c != EOF );

Teste1.txt está escrito "casinha de cachorro" vai aparecer escrito no arquivo de saída "dasinha de dadhorro".

Acho que isso pode ser útil para você. Espero ter ajudado.

Att,

WebPantoja

Editado por webpantoja
Link para o comentário
Compartilhar em outros sites

  • 0

Primeiramente , o que a operacao ^ resulta???

Entendi o problema , é bem simples , porem não entendi a operacao, cite exemplos .

o que resulta da criptografia de "script" com a senha "brasil" ??

Definindo isso o pgm sai em seguida.

Link para o comentário
Compartilhar em outros sites

  • 0

Hum.. eu pensei que você tinha dúvida em outra parte... :lol:

Cara esses aí são operação lógicas que você ver na faculdade.. só lembrar das tabelas verdades... essas operações são bastantes úteis quando você está trabalhando com bits... é mais ou menos assim:

^ = Ou exclusivo, significa que fica verdadeiro somente se os bits forem diferentes... fica assim

x = 0x0011 w = 0x0001

y = 0x1100 t = 0x1010

x ^ y = 0x1111 w ^ t = 0x1011

E os outros | = 'or' seria a soma dos bits, & = 'and' seria a multiplicação dos bits.. e por aí vai..

Edit: e vendo o enunciado do exercício, se você utilizar o Ou Exclusivo você saberá se está trabalhando com o caracter correto a ser alterado.

Isso vai facilitar sua vida na hora de fazer essa verificação para criptografar somente os caracteres corretos e vice-versa.

Att,

WebPantoja

Editado por webpantoja
Link para o comentário
Compartilhar em outros sites

  • 0

Cara nunca usei operacoes binarias em c, so fiz isso em assembler , os professores aqui falam para evitar usar codigo binario para qualquer coisa pois "dificultam a leitura posterior", coisas da didatica, mas vamos la:

//criando uma funcao mycrypt(char* msg , char* senha,char* saida)
mycrypt(char* msg , char* senha,char* saida)
{
  int i;
  for( i=0; i<strlen(msg); i++)                         // percorre toda a msg
    saida[i] = msg[i] ^ senha[i % strlen(senha)]; // utiliza a senha circularmente
}

Pronto, mas não esqueca de inserir string.h, a outra parte e leitura de arquivo.

mvrocha.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...