

mate_1007 ha scritto:si si le frequenze di tutte le lettere del testo le riesco a trovare con un semplice ciclo. Il mio problema è che una volta trovate le lettere con maggior frequenza so che probabilmente corrisponderanno a quelle più frequenti nella lingua italiana (cioè a e i o) però come faccio a sapere con certezza qual è la vera corrispondenza e quindi trovare la chiave?


//CRITTOANALISI CIFRARI DI CESARE
#include<stdio.h>
int pos(char c);
int man(void)
{
char *nome_file1, *nome_file2;
nome_file1=malloc(50*sizeof(char));
nome_file2=malloc(50*sizeof(char));
printf("Inserisci il nome del file da criptare\n");
scanf("%s", nome_file1);
printf("Inserisci il nome del file di destinazione\n");
scanf("%s", nome_file2);
}
void analisi(char *nome_file1, char *nome_file2)
{
f=fopen(nome_file1, "r");
g=fopen(nome_file2, "w");
if(f==NULL) {
printf("Impossibile aprire!\n");
exit(EXIT_FAILURE); }
char ch;
double f, max_1, max_2, max_3, max_4;
int frequenze[26]={0};
int count=0; //conta il n° di lettere totali
while ((fscanf(f, "%c", &ch))!=EOF) {
if((ch>='a' && ch<='z') || (ch>='A' && ch<= 'Z')) {
count++;
frequenze[pos(ch)]++; }
for(int i=0; i<26; i++)
frequenze[i]=frequenze[i]*100/count; //ora frequenze segna la percentuale di frequenza per ogni lettera
}
}
int pos(char c)
{
char lett[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int i;
c=toupper(c);
for(i=0; i<26; i++)
if(lett[i]==c)
return i;
}
//CRITTOANALISI CIFRARI DI CESARE
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
void analisi(char *nome_file1, char *nome_file2);
int pos(char c);
int man(void)
{
char *nome_file1, *nome_file2;
nome_file1=malloc(50*sizeof(char));
nome_file2=malloc(50*sizeof(char));
printf("Inserisci il nome del file da criptare\n");
scanf("%s", nome_file1);
printf("Inserisci il nome del file di destinazione\n");
scanf("%s", nome_file2);
analisi(nome_file1, nome_file2);
return 0;
}
void analisi(char *nome_file1, char *nome_file2)
{
FILE *f, *g;
f=fopen(nome_file1, "r");
g=fopen(nome_file2, "w");
if(f==NULL) {
printf("Impossibile aprire!\n");
exit(EXIT_FAILURE); }
char ch;
int frequenze[26]={0};
int count=0; //conta il n° di lettere totali
while ((fscanf(f, "%c", &ch))!=EOF) {
if((ch>='a' && ch<='z') || (ch>='A' && ch<= 'Z')) {
count++;
frequenze[pos(ch)]++; }
for(int i=0; i<26; i++)
frequenze[i]=frequenze[i]*100/count; //ora frequenze segna la percentuale di frequenza per ogni lettera
}
}
int pos(char c)
{
char lett[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int i;
c=toupper(c);
for(i=0; i<26; i++)
if(lett[i]==c)
return i;
}


python train.py < testo_da_addestramento.txtpython gasimple.py < testo_da_decifrare.txt
Per chi avesse dubbi sulla legittimità di questi discorsi ricordo che fare affidamento a cifrari di sostituzione monoalfabetici al giorno d'oggi è assolutamente inutile.
Vanno bene solo a scopo didattico o per "giochetti".


)
mate_1007 ha scritto:ok grazie mille! un'ultima domanda, forse stupida, ma per controllare che il testo contenga delle parole corrette in italiano dovrei usare qualche sorta di dizionario e cercarle lì dentro o ci sono alternative migliori?
>>> import string
>>> def encode(plain_text, key):
... '''Encodes the given plain_text using a monoalphabetic cipher
... whose key is *key*.
... '''
... return plain_text.translate(string.maketrans(string.ascii_lowercase, key))
...
>>> encode('prova', 'cdefghijklmnopqrstuvwxyzab')
'rtqxc'

Visualizzano questa pagina: SuperStep e 4 ospiti