Vediamo insieme come creare un semplicissimo Crypter che codifica un file eseguendo operazioni matematiche. Il tutto sarà molto semplice e non costituirà un vero e proprio algoritmo.
Iniziamo con le funzioni di base: il nostro programma dovrà leggere i dati da un file e inviare ogni singolo carattere alla funzione crypt(), che eseguirà funzioni matematiche, basandosi anche sulla posizione pari/dispari del nostro carattere. Per prima cosa, per trasformare un carattere nel corrispettivo int si usa, anche se pratica sconsigliata:
CODICE
int intCh = char ch - '0';
ove ch è il nostro carattere. Per prima cosa creiamo il nostro main, che prende dei dati da riga di comando (il nome del file) e legge tutto il contenuto; non commento il codice presupponendo che siate già abbastanza esperti:
CODICE
#include <stdio.h>
#include <string.h>
#include <math.h>
#define false 0
#define true !false
/* Per il preprocessore ho messo la definizione di true e false, ove per false si intende 0 e per true qualunque numero diverso da 0 */
int main(int argc, char *argv[]) {
printf("##################\n");
printf("# Saffon Crypter #\n");
printf("##################\n\n");
if(argc != 2) {
printf("[WARNING] Usage %s filename\n", argv[0]);
}
else {
printf("Crypting...\n");
FILE *file = fopen( argv[1], "r" );
if ( file == 0 )
{
printf( "[WARNING] Unable to open the file!\n" );
}
else
{
int x;
FILE *new = fopen("crypted.txt","w");
while ( ( x = fgetc( file ) ) != EOF )
{
/* codice per il crypting */
}
fclose(file);
fclose(new);
printf("\n\a[DONE] Created file crypted.txt.\n");
}
}
}
Creiamo una funzione di crypting che esegua le quattro operazioni sul nostro carattere
CODICE
int even = false;
int crypt(char ch) {
int intCh = ch - '0';
intCh *= 32;
intCh += intCh - 13;
if(even == true) {
intCh /= 3;
}
else {
intCh *= 2;
}
return abs(intCh);
}
e possiamo aggiungere la riga
CODICE
fprintf(new, "%d", crypt(x));
al codice precedente.
Codice finale:
CODICE
#include <stdio.h>
#include <string.h>
#include <math.h>
#define false 0
#define true !false
int even = false;
int crypt(char ch) {
int intCh = ch - '0';
intCh *= 32;
intCh += intCh - 13;
if(even == true) {
intCh /= 3;
}
else {
intCh *= 2;
}
return abs(intCh);
}
int main(int argc, char *argv[]) {
printf("##################\n");
printf("# Saffon Crypter #\n");
printf("##################\n\n");
if(argc != 2) {
printf("[WARNING] Usage %s filename\n", argv[0]);
}
else {
printf("Crypting...\n");
FILE *file = fopen( argv[1], "r" );
if ( file == 0 )
{
printf( "[WARNING] Unable to open the file!\n" );
}
else
{
int x;
FILE *new = fopen("crypted.txt","w");
while ( ( x = fgetc( file ) ) != EOF )
{
fprintf(new, "%d", crypt(x));
}
fclose(file);
fclose(new);
printf("\n\a[DONE] Created file crypted.txt.\n");
}
}
}
I più esperti avranno capito che questo non è assolutamente un algoritmo di criptazione valido: si può intenderlo come una base o uno stimolo a fare di meglio, o come un metodo di offuscamento.
Quale è ora la sfida? Riuscire a creare un programma che farà l'inverso ^.^
Nel pacchetto qua sotto troverete, oltre al programma creato, anche due tools con relativo sorgente: ctoi e itoc, appunto per convertire un carattere nel corrispettivo int e poter fare delle prove.
Download