Trabalho criptografia C

Rock_67

Membro
Boas pessoal
tenho aqui um projecto que nao sei bem como começar,gostaria imenso que m dessem umas dicas para a inicializaçao de um programa em linguagem C...passo a explicar o objectivo do programa!!
Escrever um programa, em linguagem C, que permita decifrar um determinado
texto, escrito em língua portuguesa e que foi cifrado por um método de substituição
mono-alfabético.
A tarefa será executada sem se conhecer a chave de substituição que deu origem
ao texto cifrado. A técnica para realizar o ataque tem como base a análise estatística dos
caracteres da língua portuguesa. Por exemplo, o carácter que aparece mais vezes num
texto de língua portuguesa é o a. Então, o símbolo que aparecer mais vezes na mensagem
cifrada terá que corresponder ao original a. O segundo símbolo com maior frequência é o
e e pela mesma lógica o símbolo com a segunda maior taxa de ocorrência na mensagem
cifrada corresponderá à letra original e. Para que este método de ataque funcione, o texto
a decifrar terá que ser suficientemente longo. Tenha em atenção que, para
simplificação, o texto fornecido não contém espaços, nem caracteres acentuados, nem
caracteres de pontuação. Assim, o programa escrito em linguagem C não deverá
apresentar o texto decifrado com espaços, nem com caracteres acentuados e nem com
caracteres de pontuação.
Para se construir o programa suponha-se que a sequência seguinte apresenta a ordem
decrescente (da esquerda para a direita) da frequência dos caracteres na língua
portuguesa:
a e o s r d n i t m u l c v p g q b f h j x z k y w
Desta forma, o carácter que aparece mais vezes é o a e o que aparece menos vezes
é o w.
Por se tratar de um método estatístico é provável que prevaleçam caracteres
errados na mensagem final decifrada. Mas como esse facto surge de forma marginal, é
facilmente possível, por acção humana, reconstruir o texto original.

Texto a decifrar
cscmxcszfsocmfzscssjncwcgfspezgcfkjgznvcwbmcjcwesjvcncbfmxcmzsnenk
cgzcnvzsncazicgfsbcsscmcxcjngccwzxgcvcbmfocnczxbzmjifsziezmmcszsrfm
kcgfsxcjsgfpezbmfxzvjccrfmkchexcnczznvmziznvzmzxfvczgjrjkcmcxnfafmzj
nfpezvcnvfseowjxcmcxzvcxozxcsxzxfmjcsiwfmjfscsgcpezwzsmzjspezrfmcxg
jwcvcngfcrzfjxbzmjfzcsvzmmcsajkjfscsgzcrmjkczgzcsjccngcmcxgzacsvcngfz
cpezwzspezbfmfomcsacwzmfscsszacfgcwzjgcxfmvzwjozmvcngfkcnvcngfzsb
cwhcmzjbfmvfgcbcmvzszcvcnvfxzcyegcmfzniznhfzcmvzkzsszxgfscojfimzifz
gfvmfjcnfcsncazickfzsimcngzspezrjqzmcxkcwzszgzcwztcngmfzgzvmcycnfcrc
xcgcsajvfmjcspezvjazmcxpezzekcnvffbzjvfjwesvmzwesjvcnfcpezxnzbvenfzx
cmvzfozgzkzmcxkzsszvegffpezcxesccnvjickcnvcpezfevmfacwfmxcjscwvfszc
wzacnvczafsvcijgzsxjnhcsbfjskmjcgfvzngzszxxjexnfafzniznhfcmgznvzszszxb
mzzxazmsfhexjwgzkzwzomcgfrfjgzxjafssfmjfcwzmzxznvzgcjxzcifmcexsfxc
wvfzseowjxcgfexzsvjwfimcngjwfkfzkfmmznvzbfmpezgzafsscsciecsrzoffmgz
nzpezncfvznhcxznazyccsgzhjbfkmznzgcjxzecremjcimcngzzsfnfmfsczncfgzci
mzsvzcazncfermcevcmegcxcsgzveockcnfmczozwjkfscpezfbzjvfckzngzzckfmc
fizsvfxegcgcjxzjiecwkcnvfcfsrzjvfsgcrcxfsciznvzafsscpezcxcmvzvcnvfcyegcp
ezszzsbcwhzzszkcnvznfenjazmsfszvcfseowjxzbmzkfkcozzxazmsfzafsfozxncs
kjgcsziemcnkcgcwesjvcnccnvjicwjozmgcgzzncfxznfskzmvjssjxczsbzmcnkcgz
cexznvfgcbzpeznckmjsvcngcgzafsfnfafvzxfmgcxcemcwcnkcxcmcajwhcrcvcw
gcnfsscjgcgzgcgccfxengfbfmgzespezvfgffxcngzbzmcgfxengfcgzesgcmbcmvzi
mcngz

Cumprimentos e obrigado
 
Assim muito rapidamente, fazes a contagem de todos os caracteres iguais que aparecem no texto, para cada letra. Ou seja, aparecem 30 x, 5 y, 3 z, etc.

Provavelmente o x será a letra a (devido às estatísticas que tens para lingua portuguesa), logo podes tentar fazer uma substituição de todos os x por a. A seguir ao a penso que seja o o ou o i, mas não tenho a certeza. Tens que construir essa tabela de estatísticas, e fazer as contagens e as substituições seguindo o modelo acima.

Basicamente, é isso.

Boa sorte!

PS: Só vi agora que já tens aí a lista de caracteres por ordem de ocorrência, portanto, melhor ainda ;)
 
Última edição:
Consegui!! Fiz o seguinte:

Para começar temos de arranjar os texto de maneira a que ele fique todo numa linha, de pois disso fazemos um algoritmo que vai ler o ficheiro todo e contar o numero de vezes que as letras aparecem, aqui está ele:

FILE *file;
char xar[1400];
int in;
int a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0, l=0, k=0, m=0, n=0, o=0, p=0, q=0, r=0, s=0, t=0, u=0, v=0, w=0, x=0, y=0, z=0;

file = fopen("Transformado.txt", "r");
for(in=0; in<1400; in++)
fscanf(file, " %c", &xar[in]);

for(in=0; in<1400; in++)
{
switch(xar[in])
{
case 'a': a++; break;
case 'b': b++; break;
case 'c': c++; break;
case 'd': d++; break;
case 'e': e++; break;
case 'f': f++; break;
case 'g': g++; break;
case 'h': h++; break;
case 'i': i++; break;
case 'j': j++; break;
case 'l': l++; break;
case 'm': m++; break;
case 'n': n++; break;
case 'o': o++; break;
case 'p': p++; break;
case 'q': q++; break;
case 'r': r++; break;
case 's': s++; break;
case 't': t++; break;
case 'u': u++; break;
case 'v': v++; break;
case 'x': x++; break;
case 'z': z++; break;
case 'k': k++; break;
case 'w': w++; break;
case 'y': y++; break;
default: xar[in] = ' ';
}
}

printf("a: %d\n", a);
printf("b: %d\n", b);
printf("c: %d\n", c);
printf("d: %d\n", d);
printf("e: %d\n", e);
printf("f: %d\n", f);
printf("g: %d\n", g);
printf("h: %d\n", h);
printf("i: %d\n", i);
printf("j: %d\n", j);
printf("l: %d\n", l);
printf("m: %d\n", m);
printf("n: %d\n", n);
printf("o: %d\n", o);
printf("p: %d\n", p);
printf("w: %d\n", q);
printf("r: %d\n", r);
printf("s: %d\n", s);
printf("t: %d\n", t);
printf("u: %d\n", u);
printf("v: %d\n", v);
printf("x: %d\n", x);
printf("z: %d\n", z);
printf("y: %d\n", y);
printf("w: %d\n", w);
printf("k: %d\n", k);
getchar();
Poderia ter cido feito de outra maneira mas pronto, assim resulta. O resultado que dá é basicamente que no texto do ficheiro o C aparece 215 vezes, o z aparece 193 vezes e por ai fora. Temos de ter cuidado porque tanto o g como o n aparecem ambos 79 vezes entre outros casos desses.

Agora é só substituir no vetor que lê o ficheiro os caracteres, da seguinte maneira:
FILE *f;
char x[1400];
int i;

f = fopen("Transformado.txt", "r");
for(i=0; i<1400; i++)
fscanf(f, " %c", &x);

for(i=0; i<1400; i++)
{
switch(x)
{
case 'a': x = 'v'; break;
case 'b': x = 'p'; break;
case 'c': x = 'a'; break;
case 'd': x = ' '; break;
case 'e': x = 'u'; break;
case 'f': x = 'o'; break;
case 'g': x = 'd'; break;
case 'h': x = 'h'; break;
case 'i': x = 'g'; break;
case 'j': x = 'i'; break;
case 'l': x = ' '; break;
case 'm': x = 'r'; break;
case 'n': x = 'n'; break;
case 'o': x = 'b'; break;
case 'p': x = 'q'; break;
case 'q': x = ' '; break;
case 'r': x = 'f'; break;
case 's': x = 's'; break;
case 't': x = ' '; break;
case 'u': x = ' '; break;
case 'v': x = 't'; break;
case 'x': x = 'm'; break;
case 'z': x = 'e'; break;
case 'w': x = 'l'; break;
case 'k': x = 'c'; break;
case 'y': x = 'j'; break;
default: x = ' ';
}
}

for(i=0; i<1400; i++)
printf("%c", x);
getchar();
Os valores que eu já lá meti são deduções a que eu já cheguei, os espaços em branco são caracteres que ainda não tenho a certeza, lolol, mas rápidamente comecei a ler e reconheci o texto, é o inicio dos Lusíadas! Depois é aplicar espaços entre as palavras e pronto, a menssagem fica quebrada. Aqui está o que já fiz:

as armas e os baroes assinalados
que da ocidental praia lusitana
pormares nunca deantes navegados
passaram ainda alem da taprobana
em perigos e guerras esforcados
mais do que prometia a forca humana
e entre gente remota e dificaram
novo reino que tanto sublimaram

e tambem as memorias gloriosas
daqueles reis que foram dilatando
a fe o imperio e as terras viciosas
de africa e de asia andaram devastando e aqueles que por obras valerosas
se vao da lei da morte libertando
cantando espalhareipor toda parte se a tanto me ajudar o engenho e arte


cessemdosabiogregoedotroianoas
navegacoesgrandesquefi eramcalesedeale androedetrajanoafamadasvitoriasquetiveram
queeucantoopeitoilustrelusitanoaquemneptunoemarteobedeceramcessetudooqueamusaant
igacantaqueoutrovalormaisaltosealevantaevostagidesminhaspoiscriadotendesemmiumno
voengenhoardentesesempreemversohumildecelebradofoidemivossorioalerementedaimeago
raumsomaltoesublimadoumestilograndilocoecorrenteporquedevossasaguasfeboordeneque
naotenhamenvejaasdehipocrenedaimeuafuriagrandeesonorosaenaodeagresteavenaoufraut
arudamasdetubacanoraebelicosaqueopeoacendeeacoraogestomudadaimeigualcantoaosfeit
osdafamosagentevossaqueamartetantoajudaqueseespalheesecantenouniversosetaosublim
eprecocabeemversoevosobemnascidasegurancadalusitanaantigaliberdadeenaomenoscerti
ssimaesperancadeaumentodapequenacristandadevosonovotemordamauralancamaravilhafat
aldanossaidadedadaaomundopordeusquetodoomandeperadomundoadeusdarpartegrandel
l lq l l l
e pronto é tudo, agora é só fazer o resto e temos o texto todo arranjado.


EDIT:

Depois de ter trabalho mais um pouco vi que a chave é:
case 'a': x = 'v'; break;
case 'b': x = 'p'; break;
case 'c': x = 'a'; break;
case 'd': x = ' '; break;
case 'e': x = 'u'; break;
case 'f': x = 'o'; break;
case 'g': x = 'd'; break;
case 'h': x = 'h'; break;
case 'i': x = 'g'; break;
case 'j': x = 'i'; break;
case 'l': x = ' '; break;
case 'm': x = 'r'; break;
case 'n': x = 'n'; break;
case 'o': x = 'b'; break;
case 'p': x = 'q'; break;
case 'q': x = 'z'; break;
case 'r': x = 'f'; break;
case 's': x = 's'; break;
case 't': x = 'x'; break;
case 'u': x = ' '; break;
case 'v': x = 't'; break;
case 'x': x = 'm'; break;
case 'z': x = 'e'; break;
case 'w': x = 'l'; break;
case 'k': x = 'c'; break;
case 'y': x = 'j'; break;
default: x = ' ';


e que o texto todo decifrado com espaço, paragrafos e sem a parte do final que são o caracteres ao calhas(porque o vector que lê o ficheiro é maior que o texto), ficará:
as armas e os baroes assinalados
que da ocidental praia lusitana
pormares nunca deantes navegados
passaram ainda alem da taprobana
em perigos e guerras esforcados
mais do que prometia a forca humana
e entre gente remota e dificaram
novo reino que tanto sublimaram

e tambem as memorias gloriosas
daqueles reis que foram dilatando
a fe o imperio e as terras viciosas
de africa e de asia andaram devastando
e aqueles que por obras valerosas
se vao da lei da morte libertando
cantando espalhareipor toda parte
se a tanto me ajudar o engenho e arte

cessem do sabio grego e do troiano
as navegacoes grandes que fizeram
cale se de alexandro e de trajano
a fama das vitorias que tiveram
que eu cantoo peito ilustre lusitano
a quem neptuno e marte obedeceram
cesse tudo o que a musa antiga canta
que outro valor mais alto se alevanta

e vos tagides minhas pois criado
tendes em mi um novo engenho ardente
se sempre em verso humilde celebrado
foi de mi vosso rio aleremente
dai me agora um som alto e sublimado
um estilo grandiloco e corrente
por que de vossas aguas febo ordene
que nao tenham enveja as de hipocrene


dai me ua furia grande e sonorosa
e nao de agreste avena ou frauta ruda
mas de tuba canora e belicosa
que o peo acende e a cor ao gesto muda
dai me igual canto aos feitos da famosa
gente vossa que a marte tanto ajuda
que se espalhe e se cante no universo
se tao sublime preco cabe em verso

e vos o bem nascida seguranca
da lusitana antiga liberdade
e nao menos certissima esperanca
de aumento da pequena cristandade
vos o novo temor da maura lanca
maravilha fatal da nossa idade
dada ao mundo por deus que todo o mande
pera do mundo a deus dar parte grande
 
Última edição:
Obrigado malta! Para além de me ajudarem fizeram-me perceber como se fazia... Peter V5 obrigado também pelo código fonte embora eu esteja a tentar fazer sozinho é uma ajuda poderosa...
Obrigado!!:001::001:
 
Obrigado malta! Para além de me ajudarem fizeram-me perceber como se fazia... Peter V5 obrigado também pelo código fonte embora eu esteja a tentar fazer sozinho é uma ajuda poderosa...
Obrigado!!:001::001:

De nada, foi um trabalho bastante porreiro, lolol, gosto de trabalho assim com cifras, hahaha
 
Back
Topo