Sicurezza dei Sistemi Informatici Esercitazioni OpenSSL



Documenti analoghi
Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

La gestione della memoria

I puntatori e l allocazione dinamica di memoria

Allocazione dinamica della memoria - riepilogo

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Introduzione al Linguaggio C

Appello di Informatica B

Crittografia in Java

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Fondamenti di Informatica 2

costruttori e distruttori

Esercizio: gestione di un conto corrente

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Introduzione al linguaggio C Gli array

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

RC4 RC4. Davide Cerri. Davide Cerri CEFRIEL - Politecnico di Milano cerri@cefriel.it

Sommario. Introduzione alla Sicurezza Web

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Crittografia con OpenSSL crittografia asimmetrica

Firma HSM. A cura di: Enrico Venuto. Politecnico di Torino Coordinatore sicurezza informatica di ateneo

Crittografia con OpenSSL crittografia asimmetrica

PROCEDURA AGGIORNAMENTO LISTE MEDIANTE L INTERFACCIA WEB

Programmazione avanzata Java e C. Crittografia

Introduzione alla crittografia con OpenPGP

Aritmetica dei puntatori

Il simulatore SPIM SPIM

Cifratura simmetrica

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Pretty Good Privacy. PGP fornisce crittografia ed autenticazione. creato da Phil Zimmermann nel in origine è un'applicazione per

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi terza

PAES. Laurea Specialistica in Informatica. Analisi e sviluppo di un implementazione parallela dell AES per. architetture eterogenee multi/many-core

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Esercitazione 2 Certificati

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

Aspetti Crittografici nel Cloud Computing

SSL: applicazioni telematiche SSL SSL SSL. E-commerce Trading on-line Internet banking... Secure Socket Layer

Makefile. Un target in generale e' un file. Usando.PHONY: target specifichiamo a make che il target non e' un file

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Funzioni in C. Violetta Lonati

Gestione dei File in C

STATO MAGGIORE DELLA DIFESA Comando C4 Difesa

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

Le command line di Java

Introduzione alla programmazione in C

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

La sicurezza nelle reti di calcolatori

Esercitazione 02. Sommario. Un po di background (1) Un certificato digitale in breve. Andrea Nuzzolese

DevC++ vers Manuale d uso

PROVINCIA AUTONOMA DI TRENTO

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

Aruba Sign 2 Guida rapida

Le stringhe. Le stringhe

La protezione dai memory error exploit

Esercitazione 02. Angelo Di Iorio

Firma digitale e PEC: aspetti crittografici e sicurezza

La struttura dati ad albero binario

Breve riepilogo della puntata precedente:

Approfondimento di Marco Mulas

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Librerie. Laboratorio di Informatica Antonio Monteleone 28

puntatori Lab. Calc. AA 2007/08 1

Esercizi sulle stringhe

Crittografia e Protocolli di Sicurezza

Primi programmi in C

Quasar Sistemi S.r.l.

Prima Esercitazione. Unix e GNU/Linux. GNU/Linux e linguaggio C. Stefano Monti smonti@deis.unibo.it

La Sicurezza delle Reti. La Sicurezza delle Reti. Il software delle reti. Sistemi e tecnologie per la multimedialità e telematica.

Elementi di Sicurezza e Privatezza Laboratorio 10 Uso di OpenSSL per generare certificati X.509. Chiara Braghin chiara.braghin@unimi.it!

Sistemi Operativi (M. Cesati)

Homework HWC1 di Programmazione Concorrente 13 novembre 2014 anno accademico 2014/2015

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 4A di Martedì 21 Giugno 2011 tempo a disposizione 2h

Esempio 1: stampa locale di file remoto

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

Linguaggio C - Stringhe

Transcript:

Sicurezza dei Sistemi Informatici Esercitazioni OpenSSL Marco Tiloca marco.tiloca@iet.unipi.it 1

Sicurezza dei Sistemi Informatici Esercitazioni OpenSSL Cifratura chiave simmetrica (2 ore) Funzioni hash (2 ore) Cifratura asimmetrica (2 ore) Firma digitale (4 ore) 2 Il protocollo Diffie-Hellman (4 ore)

Sicurezza dei Sistemi Informatici Esercitazioni OpenSSL Introduzione OpenSSL 3

Libreria OpenSSL OpenSSL è una libreria crittografica open source, e fornisce API crittografiche di basso e alto livello. Le API EVP forniscono un interfaccia di alto livello per funzioni crittografiche. Crittografia a chiave simmetrica Funzioni hash 4

Uso libreria OpenSSL Sistemi GNU/Linux: Installare i pacchetti libssl0.9.8 e libssl-dev Compilare linkando manualmente la libreria gcc o prog prog.c -l ssl Sistemi Microsoft Windows: Installare l applicativo Cygwin Specificare di installare in /bin i pacchetti relativi a openssl e gcc Compilare linkando manualmente la libreria gcc o prog prog.c lcrypto Il file eseguibile prodotto è un.exe 5

Gestione del contesto EVP Il contesto EVP è una struttura dati che implementa, il cifrario a chiave simmetrica. Allocazione contesto EVP_CIPHER_CTX* ctx; ctx = malloc(sizeof(evp_cipher_ctx)); Preparazione contesto EVP_CIPHER_CTX_init(ctx); EVP_CIPHER_CTX_set_key_length(ctx,key_size); bsize = EVP_CIPHER_CTX_block_size(ctx); Deallocazione contesto EVP_CIPHER_CTX_cleanup(ctx); free(ctx); 6

Cifratura chiave simmetrica Allocazione contesto Preparazione contesto Cifratura EVP_EncryptInit(ctx,EVP_des_ecb(),NULL,NULL); EVP_EncryptInit(ctx,NULL,key,NULL); EVP_Encrypt_Update(ctx,out,&loutU,in,lin); EVP_Encrypt_Final(ctx,&out[pos],&loutF); Deallocazione contesto 7

Cifratura chiave simmetrica Operazioni cifratura EVP_Encrypt_Update(ctx,out,&loutU,in,lin); EVP_Encrypt_Final(ctx,&out[pos],&loutF); ctx: contesto out: buffer per contenere il testo cifrato (loutu + loutf): numero byte cifrati prodotti in: buffer contenente il testo in chiaro lin: dimensione del testo in chiaro in byte pos == loutu La dimensione di out deve essere (lin + bsize) La dimensione del testo cifrato è loutu + loutf 8

Decifratura chiave simmetrica Allocazione contesto Preparazione contesto Decifratura EVP_DecryptInit(ctx,EVP_des_ecb(),NULL,NULL); EVP_DecryptInit(ctx,NULL,key,NULL); EVP_DecryptUpdate(ctx,out,&loutU,in,lin); EVP_DecryptFinal(ctx,&out[pos],&loutF); Deallocazione contesto 9

Decifratura chiave simmetrica Operazioni decifratura EVP_Decrypt_Update(ctx,out,&loutU,in,lin); EVP_Decrypt_Final(ctx,&out[pos],&loutF); ctx: contesto out: buffer per contenere il testo in chiaro (loutu + loutf): numero byte decifrati prodotti in: buffer contenente il testo cifrato lin: dimensione del testo cifrato in byte pos == loutu La dimensione di out deve essere (lin + bsize) La dimensione del testo in chiaro è loutu + loutf 10

Esempio #include <stdio.h> #include <string.h> #include <openssl/evp.h> #include <openssl/rand.h> void printbyte(char b) { } char c; c = b; c = c >> 4; c = c & 15; printf("%x", c); c = b; c = c & 15; printf("%x:", c); 11

Esempio void select_random_key(char *k, int b) { } int i; RAND_bytes(k, b); printf("chiave: "); for (i = 0; i < b - 1; i++) printbyte(k[i]); printbyte(k[b-1]); printf("\n\n"); 12

Esempio int main() { char *msg = "Resisto a tutto fuorche' alle tentazioni"; char *plaintext, *ciphertext; char k[evp_max_key_length]; /* chiave di cifratura */ int nc; /* numero di byte [de]crittati ad ogni passo*/ int nctot; /* numero totale di byte crittati */ int i; /* indice */ int pt_len; /* lunghezza del testo in chiaro */ int ct_len; /* lunghezza del testo cifrato */ int ct_ptr; /* puntatore alla prima posizione libera del buffer */ int msg_len; /* lunghezza del messaggio */ /* Allocazione del contesto */ EVP_CIPHER_CTX *ctx = (EVP_CIPHER_CTX *)malloc(sizeof(evp_cipher_ctx)); /* Inizializzazione del contesto */ EVP_CIPHER_CTX_init(ctx); /* Setup del contesto per la cifratura */ EVP_EncryptInit(ctx, EVP_des_ecb(), NULL, NULL); 13

Esempio /* Output su std output del messaggio originale */ printf("\nmessaggio originale:\n%s\n\n", msg); /* Output su std output della dimensione della chiave */ printf("key size %d\n", EVP_CIPHER_key_length(EVP_des_ecb())); /* Output su std output della dimensione del blocco */ printf("block size %d\n\n", EVP_CIPHER_CTX_block_size(ctx)); /* Selezione random della chiave */ select_random_key(k, EVP_MAX_KEY_LENGTH); /* Impostazione della chiave */ EVP_EncryptInit(ctx, NULL, k, NULL); /* Allocazione del buffer per ciphertext */ msg_len = strlen(msg)+1; ct_len = msg_len + EVP_CIPHER_CTX_block_size(ctx); printf("dimensione del msg %d\n", msg_len); printf("dimensione del ciphertext %d\n", ct_len); ciphertext = (char *)malloc(ct_len); 14

Esempio /* Cifratura */ nc = 0; nctot = 0; ct_ptr = 0; EVP_EncryptUpdate(ctx, ciphertext, &nc, msg, msg_len); ct_ptr += nc; nctot += nc; EVP_EncryptFinal(ctx, &ciphertext[ct_ptr], &nc); nctot += nc; printf("\nciphertext:\n"); for (i = 0; i < ct_len; i++) printbyte(ciphertext[i]); printf("\n\n"); 15

Esempio /* Allocazione del buffer per la decifratura */ pt_len = ct_len + EVP_CIPHER_CTX_block_size(ctx); plaintext = (char *)malloc(pt_len); /* Inizializzazione contesto decifratura */ EVP_CIPHER_CTX_init(ctx); EVP_DecryptInit(ctx, EVP_des_ecb(), k, NULL); /* Decifratura */ nc = 0; nctot = 0; ct_ptr = 0; EVP_DecryptUpdate(ctx, &plaintext[ct_ptr], &nc, ciphertext, ct_len); ct_ptr += nc; nctot += nc; EVP_DecryptFinal(ctx, &plaintext[ct_ptr], &nc); nctot += nc; 16

Esempio for (i = 0; i < pt_len - 1; i++) printf("%c:", plaintext[i]); printf("%c\n", plaintext[pt_len-1]); printf("\n%s\n\n", plaintext); EVP_CIPHER_CTX_cleanup(ctx); free(ctx); free(ciphertext); free(plaintext); return 0; } 17