• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

redhat

[C] Cifra de Cesar

27 mensagens neste tópico

Pois é, estava aqui sem nada que fazer e sem vontade nenhuma de estudar Matemática Discreta, peguei no portátil e lembrei-me dum livro que li um pouco há coisa de 5 anos atrás e que se chamava "Linux Security, a Hacker's guide to protect you linux server and workstation" escrito pelo Anonimous (porque sera...). Infelizmente o livro não era meu, e quem mo emprestou mora em Lisboa (400km daqui) penso que não o vou "ver" tão cedo...

Posto isto, lembrei-me do que li acerca de encriptação, etc, etc.

E como não estou com muita cabeça, fiz uns proggies em C sobre a cifra de César.

Mais info: http://en.wikipedia.org/wiki/Caesar_cipher

int main()
{
   int casas=0, comp=0;
   char s[LENGTH];

   printf("Palavra para cifrar: ");
   scanf(" %s", s);

   comp = strlen(s);

   while(casas != comp)
   {
      printf("%c",(char)((int)s[casas])+NUMERO);
      casas++;
   }

   printf("\n");

   return 0;
}

Isto pega numa palavra (não funciona para frases...) e transforma num cifra com uma substituição de 6 casas. Se quiserem mudar, mudem o numero.

int main()
{
   int numero=0,comp=0,casas=0;
   char s[LENGTH];

   printf("Introduza a palavra cifrada: ");
   scanf(" %s", s);
   printf("Introduza o numero de casas: ");
   scanf(" %d", &numero);   

   comp = strlen(s);

   while(casas != comp)
   {
        printf("%c", (char)(((int)s[casas])-numero));
        casas++;
   }

   printf("\n");

   return 0;
}

Claro, se dá para encriptar, tem de dar para desencriptar.

Pede-vos o número de casas a saltar.

int main()
{
   int casas=0,comp=0,a=1;
   char s[LENGTH];

   printf("Introduza a palavra a crackar: ");
   scanf(" %s",s);

   comp = strlen(s);

   while(a<26)
   {
      printf("%d: ", a);

         while(casas != comp)
         {
              printf("%c", (char) ( ( (int) s[casas] ) -a ) );
              casas++;
         }     
      a++;
      printf("\n");
      casas = 0;
   }

   printf("\n");

   return 0;
}

Este último é para o caso de se esquecerem do número. É um CesarCipher-Cracker, ou seja, dá-vos todos os saltos possíveis. Se olharem com atenção, conseguem ver algo com legível... será essa a mensagem correcta!

Bem sei que isto é super primitivo mas... foi o que me lembrei de fazer.

Aqui ta um teste para verem o que isto faz:

ibook-g4-de-joao-ferreira:~/Desktop/LESI/1oAno/2oSemestre/PP2/sortCode/CesarCypher jmf$ ./CC
Palavra para cifrar: portugalaprogramar
112-111-114-116-117-103-97-108-97-112-114-111-103-114-97-109-97-114-0
vuxz{mgrgvxumxgsgx
ibook-g4-de-joao-ferreira:~/Desktop/LESI/1oAno/2oSemestre/PP2/sortCode/CesarCypher jmf$ ./CC-reverser
Introduza a palavra cifrada: vuxz{mgrgvxumxgsgx
Introduza o numero de casas: 6
portugalaprogramar
ibook-g4-de-joao-ferreira:~/Desktop/LESI/1oAno/2oSemestre/PP2/sortCode/CesarCypher jmf$ ./CC-cracker
Introduza a palavra a crackar: vuxz{mgrgvxumxgsgx
1: utwyzlfqfuwtlwfrfw
2: tsvxykepetvskveqev
3: sruwxjdodsurjudpdu
4: rqtvwicncrtqitcoct
5: qpsuvhbmbqsphsbnbs
6: portugalaprogramar
7: onqstf`k`oqnfq`l`q
8: nmprse_j_npmep_k_p
9: mloqrd^i^moldo^j^o
10: lknpqc]h]lnkcn]i]n
11: kjmopb\g\kmjbm\h\m
12: jilnoa[f[jlial[g[l
13: ihkmn`ZeZikh`kZfZk
14: hgjlm_YdYhjg_jYeYj
15: gfikl^XcXgif^iXdXi
16: fehjk]WbWfhe]hWcWh
17: edgij\VaVegd\gVbVg
18: dcfhi[u`Udfc[fUaUf
19: cbeghZT_TcebZeT`Te
20: badfgYS^SbdaYdS_Sd
21: a`cefXR]Rac`XcR^Rc
22: `_bdeWQ\Q`b_WbQ]Qb
23: _^acdVP[P_a^VaP\Pa
24: ^]`bcUOZO^`]U`O[O`
25: ]\_abTNYN]_\T_NZN_

ibook-g4-de-joao-ferreira:~/Desktop/LESI/1oAno/2oSemestre/PP2/sortCode/CesarCypher jmf$

Abraços!

[Artigo no Wiki]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca tinha ouvido falar da cifra de Caesar, mas li bastante e estou determinado a fazer tambem um programa que consigo encriptar uma palavra á escolha com essa cifra....

Resumindo, gostei bastante! Eu que estava mesmo a pensar o que fazer a seguir....acho que encontrei trabalhinho para fazer...

B) :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

printf("Palavra para cifrar: ");

scanf(" %s", s);

Isto pega numa palavra (nao funciona para frases... raio do scanf.. enfim...) e transforma num cifra com uma substituicao de 6 casas. Se quiserem mudar, mudem o NUMERO

experimenta

gets(s); em vez de scanf(" %s", s);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

printf("Palavra para cifrar: ");

scanf(" %s", s);

Isto pega numa palavra (nao funciona para frases... raio do scanf.. enfim...) e transforma num cifra com uma substituicao de 6 casas. Se quiserem mudar, mudem o NUMERO

experimenta

gets(s); em vez de scanf(" %s", s);

Usar o 'gets(s)' é das piores práticas de programação em C. Este nunca deve ser utilizado. :!:

Não deveser usado porque não permite limitar o número de caracteres lidos, potenciando assim a corrupção da memória quando se excede o limite da cadeia de caracteres passada como argumento.

Usa-se 'fgets()' em vez do 'gets(). ;)

Abraços!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

gets nem seker da! ou seja, faz um programa com gets, compila e executa... qdo ele chega ao sitio onde tens de meter a string, ele salta fora e da uma mensagem de erro B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

uma cena que reparei é que tas a falhar aí numa cena:

printf("Palavra para cifrar: ");

scanf(" %s", s);

convem meter sempre o & antes do "s" ou seja,

scanf("%s",&s);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Citação
uma cena que reparei é que tas a falhar aí numa cena:

convem meter sempre o & antes do "s" ou seja,

scanf("%s",&s);

Exacto sem o "&" nem funciona penso eu.... ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Citação

Exacto sem o "&" nem funciona penso eu.... ;)

1199

scanf("%s", s);
é que está correcta

Quando se usa o scanf() com strings não se usa o endereço da string, pois 's = s[0]' , logo quando se passa uma string como argumento passa-se a primeira posição do array de caracteres...B)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Citação

A expressão:


scanf("%s", s);
é que está correcta

Quando se usa o scanf() com strings não se usa o endereço da string, pois 's = s[0]' , logo quando se passa uma string como argumento passa-se a primeira posição do array de caracteres...B)

Hmm...I see....obrigado por pela correcção...é que ainda estou algo verde no C...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tudo a patinar :P

Ja me explicaram o porque do & nao aparecer... vou tentar lembrar-me...

É assim, as variaveis qdo sao inicializadas, ficam na memoria e o & chama o apontador para esse espaço de memoria, e espeta-lhe o valor!

No real caso das strings nao leva o & pois ja se trabalha com apontadores! Entao se fizesse &s, ficava a apontar, para o apontador da string... vejam la o 31 que nao era :D

Acho que eh assim, se nao for, corrijam-me

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
tudo a patinar :P

Ja me explicaram o porque do & nao aparecer... vou tentar lembrar-me...

É assim, as variaveis qdo sao inicializadas, ficam na memoria e o & chama o apontador para esse espaço de memoria, e espeta-lhe o valor!

No real caso das strings nao leva o & pois ja se trabalha com apontadores! Entao se fizesse &s, ficava a apontar, para o apontador da string... vejam la o 31 que nao era :D

Acho que eh assim, se nao for, corrijam-me

Tambem já percebi...como ainda não vou muito avançado achava que o & se aplicava em todas as situações... ;)

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas olhem lá, é impressão minha ou esse sistema de encriptação é muito básico? um bom sistem de encriptação nunca dá à mesma letra o mesmo valor.....tornar-se simples de descodificar.....mas pronto eu nao sei C e tavez isto ja seja um projecto lixado de fazer lá.

Fiquem bem;):P;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mas olhem lá, é impressão minha ou esse sistema de encriptação é muito básico? um bom sistem de encriptação nunca dá à mesma letra o mesmo valor.....tornar-se simples de descodificar.....mas pronto eu nao sei C e tavez isto ja seja um projecto lixado de fazer lá.

Fiquem bem;):P;)

Não é lixado, mas demora um bocadinho a fazer....é uma encriptação básica, mas é boa para iniciação....depois tu mesmo podes inventar as tuas técnicas de encriptação de dados...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Mas olhem lá, é impressão minha ou esse sistema de encriptação é muito básico? um bom sistem de encriptação nunca dá à mesma letra o mesmo valor.....tornar-se simples de descodificar.....mas pronto eu nao sei C e tavez isto ja seja um projecto lixado de fazer lá.

Fiquem bem;):P;)

Não me parece que o redhat tenha feito este programa para o usarmos pra codificar coisas :D ... foi apenas para mostrar como escrever em C código para esta técnica de encriptação já que é uma das mais simples e conhecidas.

PS: redhat tb me apeteceu fazer código em vez de estudar pra discreta, mas desta vez segurei-me :D ..btw, sorte pra amanha! (ou melhor, hoje)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

... so me apetecia mandar o prof cus porcos! fdx!

enfim, fica pra recurso! :P

Sim, eh um processo de encryptacao basico!!! Mas ta no topico que eh a cifra de cesar... mto mto mto antiga....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

Eu sou 1 nabo em C(ainda tou a aprender(tou no 1º capitulo do Linguagem C))e esse codigo fonte da-me erros que nao consigo resolver. Podem-me mandar o ficheiro pro mail? tmaf_cerqueira@yahoo.co.uk

Desde ja obrigado pela ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No tempo de César esta cifra deve ter dado muitas dores de cabeça aos inimigos. Agora serve para fins educativos e para o pessoal se divertir quando não tem mais nada que fazer  ;)

Uso as vezes para mandar a minha namorada para o usjsdzg sem que ela me perceba.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agr, li sobre os scans e vi aí uns errinhos.

O primeiro, é q com o scanf para strings, ñ se coloca o caracter "&", devidamente explicado pq^. Segundo, neste caso o gets coloca '\0', nalguns casos é preciso compor. Mas este foi o argumento q foi dado para se usar e foi contraposto com o de ñ haver limite de caracteres a ler e isso ser mau.

fflush(stdin) --> Limpa o buffer.

fgets(string_de_destino,caracteres_a_ser_lidos,stdin) --> Coloca o '\n' no fim, terá smp de se compor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fflush(stdin) --> Limpa o buffer.

Essa função foi feita para ser usada com ficheiros abertos para escrita, sendo o seu comportamento em ficheiros abertos para leitura indeterminado. Pode funcionar, mas também pode não funcionar (e normalmente não funciona em Linux ou MacOSX). A função para limpar buffers de leitura é a fpurge, que no entanto não é standard.

fgets(string_de_destino,caracteres_a_ser_lidos,stdin) --> Coloca o '\n' no fim, terá smp de se compor.

O que é que queres dizer por compor?

E o fgets nem sempre põe o '\n' no fim (isto ocorre quando não tem espaço suficiente para o armazenar)...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E o fgets nem sempre põe o '\n' no fim (isto ocorre quando não tem espaço suficiente para o armazenar)...

Se um ficheiro terminar com uma linha sem '\n', ao ler essa linha o fgets não coloca um '\n' pois ele não existe, mas lê a linha na mesma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se um ficheiro terminar com uma linha sem '\n', ao ler essa linha o fgets não coloca um '\n' pois ele não existe, mas lê a linha na mesma.

O caso a que me referia era se mandares ler 10 caracteres, e lhe deres uma string com 9 (ou mais) caracteres mais o '\n', em que ficas sem '\n' no final da linha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Em 7/3/2008 às 21:36, skin disse:

A cifra de césar já se encontra na nossa wiki, passada pelo anolsi. Sintam-se livres para modificar e melhorar o artigo.

Cifra de César na Wiki

Só de salientar que o algoritmo que implementa a cifra está incorrecto. O abecedário é cíclico, ou seja, para o exemplo dado no artigo (cifrar "portugalaprogramar" com um shift de 6 casas) deverá devolver "vuxzamgrgvxumxgsgx".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora