Autore: Fabio Di Matteo
Ultima revisione: 30/08/2008
Libgcrypt è la libreria per la cifratura e decifratura di dati del progetto GNU, con essa si possono usare algoritmi di cifratura simmetrica e asimmetrica.
E' una libreria di utilizzo generale, è usata in diversi campi con numerose applicazioni, ma è ancora carente nella documentazione, infatti per quanto un piccolo manualetto esista non ci sono a mio avviso esempi di base per cominciare a sviluppare con libgcrypt.
Di seguito un listato C di base contenente il codice di due semplici funzioni crypt
e decrypt
che hanno lo scopo di cifrare e decifrare una stringa mediante l'algoritmo Blowfish e la sua chiave contenuta nella stringa char* key . I prototipi della funzione sono i seguenti:
char* crypt(char* testo, char* key) char* decrypt(char* testo, char* key)
ecco il codice completo:
main.c
#include <stdio.h> #include <string.h> #include <gcrypt.h> /*Una chiave a 128 bit (16 byte o caratteri)*/ void* key="AC614Eertgdfhjui"; char* crypt(char* testo, char* key){ /*Handle per le operazioni*/ gcry_cipher_hd_t hd; //inizializzazione gcry_check_version ( NULL ); gcry_cipher_open (&hd,GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC,GCRY_CIPHER_CBC_CTS ); //settiamo la chiave gcry_cipher_setkey (hd, key, strlen(key)); //criptiamo if (gcry_cipher_encrypt (hd, testo, strlen(testo), NULL, 0)==0){ printf("Criptaggio dati effettuato correttamente.\n"); }else{ printf("Errore nel criptaggio dei dati! \n"); } //chiusura handle gcry_cipher_close (hd); return testo; } char* decrypt(char* testo, char* key){ /*Handle per le operazioni*/ gcry_cipher_hd_t hd; //inizializzazione gcry_check_version ( NULL ); gcry_cipher_open (&hd,GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC,GCRY_CIPHER_CBC_CTS ); //settiamo la chiave gcry_cipher_setkey (hd, key, strlen(key)); //criptiamo if (gcry_cipher_decrypt (hd, testo, strlen(testo), NULL, 0)==0){ printf("Decriptaggio dati effettuato correttamente.\n"); }else{ printf("Errore nel criptaggio dei dati! \n"); } //chiusura handle gcry_cipher_close (hd); return testo; } int main(int argc, char *argv[]){ /*Le variabili per le stringhe che useremo*/ char testo[256]="FreeMediaLab che passione!"; char testo_criptato[256]; char testo_decriptato[256]; /*Mettiamo il testo criptato nella variabile testocriptato*/ sprintf(testo_criptato, "%s", crypt(testo,key)) ; /*Mettiamo il testo decriptato nella variabile testodecriptato*/ sprintf(testo_decriptato, "%s", decrypt(testo,key)) ; /*Stampiamo a video tutto*/ printf("Stringa originale -->%s\n\n",testo); printf("Stringa criptata --> %s\n", testo_criptato); printf("Stringa decryptata --> %s\n", testo_decriptato, key); return 0; }
Come si nota dal codice sopraesposto le principali funzioni che si usano per la crittografia sono:
gcry_error_t gcry_cipher_open (gcry_cipher_hd_t *hd, int algo, int mode, unsigned int flags) gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t h, void *k, size_t l) gcry_error_t gcry_cipher_encrypt (gcry_cipher_hd_t h, unsigned char *out, size_t outsize, const unsigned char *in, size_t inlen)
queste funzioni restituiscono una valore di tipo gcry_error_t
, quindi per gestire gli errori basta scrivere qualcosa del genere:
... /*Variabile per gestire gli errori*/ gcry_error_t err; /*poi lanciare le funzioni nei seguenti modi...*/ /*Inizializzazione*/ err = gcry_cipher_open (&hd,GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC,GCRY_CIPHER_CBC_CTS ); if (err) { printf("Inizializzazione fallita: %s\n", gpg_strerror (err)); return; } /*Inizializzazione chiave*/ err = gcry_cipher_setkey (hd, key, strlen(key)); if (err) { printf("Inizializzazione chiave fallita: %s\n", gpg_strerror (err)); return; } /*Cifratura*/ err= gcry_cipher_encrypt (hd, testo, strlen(testo), NULL, 0); if (err) { printf("Cifratura fallita: %s\n", gpg_strerror (err)); return; } ...
CPP = gcc OPTS = `libgcrypt-config --cflags --libs` all: $(CPP) main.c -o main $(OPTS) clean: rm main
Libgcrypt di default viene compilata anche staticamente in due file: libgcrypt.a
e libgpg-error.a
, quindi può essere inclusa nei nostri programmi senza creare ulteriori dipendenze.
Ecco il makefile, da notare la variabile LIBS
che contiene i percorsi delle librerie.
CPP = gcc LIBS =/usr/lib/libgcrypt.a /usr/lib/libgpg-error.a all: $(CPP) main.c $(LIBS) -o main clean: rm main
Il prefix, ovvero la parte di percorso iniziale delle librerie statiche (/usr/ in esempio) può essere ottenuto con il comando libgcrypt-config –prefix
Il nostro wiki installa solamente cookie tecnici necessari al funzionamento della piattaforma "Dokuwiki". Niente analitics, statistiche, tracciamenti o altro.