Jump to content
redhat

[C] Cifra de Cesar

Recommended Posts

redhat

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]


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
deathseeker25

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

Share this post


Link to post
Share on other sites
febra

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);

Share this post


Link to post
Share on other sites
Ricardo

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!!

Share this post


Link to post
Share on other sites
redhat

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)


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
SouL-PoWeR

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);

Share this post


Link to post
Share on other sites
deathseeker25
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.... ;)

Share this post


Link to post
Share on other sites
Ricardo
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)

Share this post


Link to post
Share on other sites
deathseeker25
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

Share this post


Link to post
Share on other sites
redhat

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


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
deathseeker25
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

Share this post


Link to post
Share on other sites
vbmaster

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 ;)

Share this post


Link to post
Share on other sites
deathseeker25
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

Share this post


Link to post
Share on other sites
SLider3
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)

Share this post


Link to post
Share on other sites
redhat

... 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....


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
Alcap

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

Share this post


Link to post
Share on other sites
brunogsimoes

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.

Share this post


Link to post
Share on other sites
lesiano

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.