#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
int table[26][52];
void init_matrix()
{
int i, j;
for (i = 0; i < 26; i++)
{
for (j = 0; j < 52; j++)
{
table[i][j] = (j + i) % 26;
}
}
}
void encrypt(char *filename, char *key, int n)
{
int i, count = 0, size = 0;
char ch;
FILE *in, *out;
in = fopen(filename, "r");
if (in == NULL)
{
printf("Impossibile aprire il file.\n");
exit(1);
}
out = fopen("TestoCifrato.txt", "w+");
if (out == NULL)
{
printf("Impossibile aprire il file.\n");
exit(1);
}
fseek(in, 0, SEEK_END); // cerco di terminare il file
size = ftell(in); // ottiene il puntatore al file corrente
fseek(in, 0, SEEK_SET); // cerca di tornare all'inizio del file
for (i = n; i < size - 1; i++) {
key[i] = key[i - n];
}
while (count != size)
{
ch = getc(in);
if (isupper(ch)) {
putc(table[key[count] - 65][ch - 65] + 65, out);
}
else {
putc(table[key[count] - 65][ch - 97 + 26] + 97, out);
}
count++;
}
fclose(in);
fclose(out);
}
void decrypt(char *key)
{
int i, j, size = 0, count = 0;
char ch;
FILE *in, *out;
in = fopen("TestoCifrato.txt", "r");
if (in == NULL)
{
printf("Impossibile aprire il file contenente il testo criptato.\n");
exit(1);
}
out = fopen("TestoDecifrato.txt", "w+");
if (out == NULL)
{
printf("Impossibile aprire il file di decriptazione.\n");
exit(1);
}
fseek(in, 0, SEEK_END); // cerco di terminare il file
size = ftell(in); // ottiene il puntatore al file corrente
fseek(in, 0, SEEK_SET); // cerca di tornare all'inizio del file
while (count != size)
{
ch = getc(in);
if (isupper(ch))
{
for (i = 0; i < 26; i++)
{
if (table[key[count] - 65][i] == ch - 65) {
fputc(i + 65, out);
}
}
}
else {
for (i = 26; i < 52; i++)
{
if (table[key[count] - 65][i] == ch - 97) {
fputc(i + 97 - 26, out);
}
}
}
count++;
}
fclose(out);
fclose(in);
}
// funzione principale
int main()
{
char filename[] = "Testo.txt";
char key[] = "tomsh";
int n = strlen(key);
int j;
// converte la chiave in maiuscolo
for (j = 0; j < n; j++) {
key[j] = toupper(key[j]);
}
init_matrix();
// crittografa usando il codice Vigenère
encrypt(filename, key, n);
// decifrare usando il codice Vigenère
decrypt(key);
printf("I risultati dell'operazione sono disponibili solamente nei file di testo.");
return 0;
}