Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
TESI DI LAUREA DI
RELATORE
Karrie Moore
Prof. Cimato Stelvio
Matr. 828737
1 Introduzione 5
1.1 SMC per problemi reali . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Scopo del progetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Struttura della tesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4 Architettura dell’applicazione 29
4.1 Struttura generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1.1 Organizzazione del codice . . . . . . . . . . . . . . . . . . . . 31
4.2 Protocolli di SMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4 INDICE
5 Implementazione 39
5.1 Tecnologie e scelte implementative . . . . . . . . . . . . . . . . . . . 39
5.2 Implementazione dei protocolli . . . . . . . . . . . . . . . . . . . . . 42
5.2.1 Le interfacce comuni ai protocolli . . . . . . . . . . . . . . . 42
5.2.2 Problema del milionario . . . . . . . . . . . . . . . . . . . . . 43
5.2.3 Votazione di un candidato . . . . . . . . . . . . . . . . . . . . 45
5.3 L’uso di Wi-Fi Direct . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.4 Tecnologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.4.1 Java Cryptography Architecture . . . . . . . . . . . . . . . . 49
5.4.2 Android Wi-Fi Direct . . . . . . . . . . . . . . . . . . . . . . . 52
5.5 Librerie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.5.1 Salut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.5.2 LoganSquare . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5.6 Strategie di testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.7 Prestazioni dell’applicazione . . . . . . . . . . . . . . . . . . . . . . 70
5.8 Flusso applicativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Bibliografia 81
Capitolo 1
Introduzione
L’asta delle barbabietole da zucchero Uno dei primi esperimenti pratici della
secure multi-party computation è avvenuta in Danimarca nel 2008 [3] e consisteva
in un’asta di barbabietole da zucchero.
In Danimarca, diverse migliaia di agricoltori producono barbabietole da zuc-
chero, che poi vengono vendute alla società Danisco, l’unico processore di bar-
babietole da zucchero sul mercato danese. Quando l’Unione Europea ridusse
drasticamente il sostegno monetario per la produzione di barbabietola da zuc-
chero fu necessario ridefinire i contratti degli agricoltori tramite una doppia asta
a livello nazionale.
Per soddisfare tutte le parti, le offerte reali dovevano essere nascoste. Non
sarebbe stato accettabile per gli agricoltori se, per esempio, Danisco avesse agito
come unico banditore. Pertanto, la soluzione è stata quella di realizzare una dop-
pia asta elettronica utilizzando tre parti di calcolo multi-party, dove i partecipanti
al calcolo erano Danisco, DKS e il progetto SIMAP.
Nel sistema è stato configurato un server web per ricevere offerte e sono stati
istituiti tre server per effettuare il calcolo sicuro. Per inviare i dati, ogni parte-
cipante ha dovuto scaricare un programma sul proprio computer insieme alle
chiavi pubbliche dei server di calcolo. Le azioni segrete non sono state inviate
direttamente dai computer ai nodi di calcolo.
Ma ogni azione è stata cifrata con una chiave pubblica di uno dei nodi e poi
memorizzate nel database dal server web. In seguito il rappresentante di ciascuna
delle parti coinvolte ha fatto partire il calcolo inserendo la chiavetta USB, sulla
quale era stata conservata la chiave privata e inserendo la propria password sulla
propria macchina ed è stato così possibile ottenere il risultato dell’asta.
L’applicazione è stata già utilizzata più volte per raccogliere informazioni fi-
nanziarie. Per impedire che i dati raccolti siano accessibili al consiglio del EAITL,
in quanto ciò potrebbe ridurre il numero di aziende che accettano di sottopor-
re i propri dati, l’applicazione è stata costruita su tramite framework di Secure
Multi-party computation per garantire che i dati necessari per analisi, altamen-
te confidenziali, non possano essere divulgati. Questa è la prima applicazione
della SMC per calcoli su dati reali presenti su Internet con il calcolo di nodi di
computazione geograficamente sparsi.
Le aziende che ospitano i tre nodi di calcolo sono stati scelti dal consorzio EAI-
TL e comprendono Cybernetica, Microlink e Media Zone. Questi nodi sono stati
scelti poiché non hanno intenzione di coalizzarsi in quanto inseriscono i propri
dati confidenziali nel sistema e desiderano garantirne la privatezza.
I dati sono stati presentati attraverso un modulo di presentazione on-line che
è stato integrato nella pagina web del EAITL. I dati presentati sono stati segre-
tamente condivisi alla fonte e poi distribuiti tra le tre partiti di calcolo. Dopo
la scadenza, le parti di calcolo hanno iniziato dei protocolli di SMC e raccolto
tutti gli indicatori economici in modo indipendente. Poi gli indicatori sono stati
pubblicati nella board del EAITL come un foglio di calcolo anonimo e privo di
informazione di identificazione.
In un secondo periodo di raccolta, c’era anche un semplice sondaggio di feed-
back condotto tra i membri del consorzio, nel quale venivano chieste le motiva-
zioni ed i possibili problemi di privacy che essi ritenevano possibili nel partecipa-
re a questo sistema di raccolta dei dati. I risultati hanno mostrato che circa la metà
dei partecipanti si fidava poiché riteneva che il sistema fosse capace di preservare
la privatezza delle informazioni e dei dati immessi.
Questionario sulla soddisfazione dei dipendenti Una delle aziende del con-
sorzio EAITL citato prima, la Cybernetica AS ha usato anche un’applicazione
SMC per sottomettere agli impiegati un questionario sulla soddisfazione sul po-
sto lavorativo negli ultimi due anni.
Anche in questo caso è stato usato un framework per la secure multi-party
computation, poiché si voleva garantire che le risposte degli impiegati non ve-
nissero riportate a terze parti. Sono state scelte tre parti per la computazione tra
gli impiegati dell’azienda, in modo che non avessero intenzione di coalizzarsi e
garantissero, anche in questo caso i vincoli di privatezza dei propri dati.
I dati sono stati inviati tramite un formulario online che prevedeva una serie
di domande e le risposte segrete sono state salvate in tre differenti macchine che
8 Introduzione
Considerando che in SMC non è presente una parte fidata che esegue il com-
pito di calcolare una funzione per un certo numero di parti, la definizione di
avversario al protocollo diverge molto: poiché i dati sono scambiati solo tra i
partecipanti ad un protocollo, l’avversario deve essere uno dei partecipanti.
In SMC si assume che le parti corrotte possano coalizzarsi per infrangere il
protocollo, se il numero delle parti del protocollo è n allora il numero delle parti
di avversari è denotato con t.
I protocolli e le soluzioni nel caso t < n/2 quando la maggioranza delle par-
ti è onesta prevede soluzioni molto più semplici di quelle in cui non viene fatta
questa assunzione. Quest’ultimo caso include la two-party computation dove
basta che uno solo dei due partecipanti sia corrotto e più in generale il caso in
cui ci sono un numero illimitato di partecipanti corrotti che si coalizzano per col-
pire qualche partecipante onesto. Gli avversari sono suddivisi rispetto a come
infrangono il protocollo:
1
• Il destinatario riesce a decifrare ogni messaggio con probabilità 2
e il mit-
tente non sa se il destinatario li ha decifrati o no.
1
2.2.1 Oblivious transfer con probabilità 2
Siano Alice e Bob due utenti, Alice possiede un segreto S. Con questo protocollo
Bob computa S con probabilità 12 e Alice non sa se Bob ha calcolato S. Le fasi di
tale protocollo prevedono i seguenti passi:
Nel secondo caso Bob può fattorizzare n, Alice dovrebbe quindi mandare S a Bob
in maniera oblivia usando questo protocollo ed usando n.
In realtà Alice manda a Bob il valore cifrato di S usando n prima dell’inizio
del protocollo. L’ideale sarebbe effettuare un passo in più prima di cominciare il
protocollo, Alice dovrebbe cifrare con n il messaggio segreto S e inviarlo a Bob,
se Bob riesce a fattorizzare n decifra il messaggio S altrimenti no.
Usando sistemi di cifratura come RSA è possibile immaginare che y = S e mod
n ed S = y d mod n quindi se Bob fattorizza n calcola d ed ottiene S.
2. Bob crea una chiave k e sceglie casualmente una delle due chiavi pubbliche
di Alice.
3. Bob calcola un valore y che consiste nella cifratura della chiave k cifrata con
la chiave scelta precedentemente, quindi y = E(k) o y = E 0 (k) ed invia y ad
Alice non rivelando quale chiave di cifratura ha usato.
5. Alice invia a Bob due valori calcolati come la somma tra i segreti e le chiavi
corrispondenti: k1 ⊕ S1 e k2 ⊕ S2 .
6. Bob riesce a conoscere solo uno dei due messaggi (cifrato con la sua chiave
k) poiché se k = k1 allora recupera il messaggio S1 , altrimenti è k = k2 e
quindi recupera S2 ma non può conoscerli entrambi.
2.3 Garbled Circuits 15
Per verificare che Alice e Bob si siano comportati in modo corretto è necessario
che essi svelino i loro segreti S1 ed S2 usati durante il protocollo e gli algoritmi di
decifratura. In alternativa è possibile usare prove a conoscenza zero [10].
Il protocollo protegge da attacchi da parte di Alice, in quanto Alice non cono-
sce la chiave k usata da Bob per costruire y. Alice può risalire alle due chiavi k1 e
k2 una delle due è la chiave k usata da Bob ma non si sa quale delle due.
Il protocollo è anche sicuro contro un attacco di Bob, poiché egli potrebbe
rompere il protocollo solo se conoscesse le chiavi private di Alice.
Costruzione del garbled circuit Dopo che Alice ha costruito un circuito c che
altro non è che una rappresentazione diversa di f . Lo step successivo consiste
nella costruzione di una tabella di verità garbled, in cui per ogni porta logica in c,
si genera una versione garbled in cg .
Per ogni filo wi del circuito, Alice crea due chiavi casuali Ki0 , Ki1 di lunghezza
n. L’idea è che Ki0 corrisponderà al filo wi al quale viene assegnato un valore pari
a 0, la stessa cosa accadrà a Ki1
wi
cz wk
wj
Garbling di una singola porta Per capire meglio come avviene questa operazio-
ne è possibile fare un esempio e trasformare una porta OR che sarà denominata
cOR
1 nella sua versione garbled g1OR , effettuando le seguenti operazioni:
1. Per prima cosa Alice genera i valori per questa porta logica e costruisce la
tavola di verità di c.
w0 w1 w2
0 0 0 w0
0 1 1 c1 w2
1 0 1
w1
1 1 1
2. Alice genera una chiave per ogni possibile valore della porta logica. Con
questa operazione vengono generate sei chiavi: una per ogni coppia di
booleani, per ciascuno dei tre fili del gate (i due input e l’output).
w0 w1 w2
k00 k10 k20
K0 g1 k00 , k10 g1
k00 k11 k21 K 2 k02 , k12
K1 k01 , k11
k01 k10 k21
k01 k11 k21
2.3 Garbled Circuits 17
3. A questo punto Alice cifra ogni valore di output della tabella di verità con
le chiavi usate per i corrispettivi input.
L’identificatore della porta logica serve solo come nonce ed è incluso nella
costruzione per essere sicuri che valori uguali non siano mai cifrati nello
stesso modo all’interno del circuito.
w0 w1 w2 valori garbled
k00 k10 k20 H(k00 ||k10 ||g1 ) ⊕ k20
k00 k11 k21 H(k00 ||k11 ||g1 ) ⊕ k21
k01 k10 k21 H(k01 ||k10 ||g1 ) ⊕ k21
k01 k11 k21 H(k01 ||k11 ||g1 ) ⊕ k21
Il lavoro effettuato sulla prima porta logica va ripetuto in seguito su tutte le altre
porte, le uniche porte logiche che non devono essere modificate in porte garbled
sono quelle di output e quelle i cui fili di output non sono input di altre porte.
Ruolo della cifratura La cifratura copre due ruoli importanti nel protocollo.
Poiché l’output di ogni operazione di cifratura è un valore casuale (si assume che
il risultato della funzione di hash sia casuale anche se in realtà è pseudo-casuale),
tutte le correlazioni che potevano esserci tra i valori della tavola di verità origi-
nale e quella garbled non esistono più. Bob può ottenere solo una delle chiavi di
output della tavola poiché egli possiede solo la chiave per decifrare un singolo
valore del filo di output.
Invio dei valori garbled Quando Alice ha finito di generare il circuito garbled,
deve effettuare un garbling degli input della funzione, creando una mappa iA tra i
valori di input originali e quelli appena generati. Alice effettua questa operazione
rimpiazzando il primo bit dei suoi input con la chiave corrispondente al filo di
input nel circuito.
Ma Bob non può vedere nessuna chiave eccetto quelle di cui ha bisogno,
perché altrimenti avrebbe troppe informazioni sull’esecuzione del programma
e quindi più informazioni sugli input di Alice. Inoltre Alice non deve poter sco-
prire quali chiavi di input riceverà Bob, per essere lei conoscerà solo quali sono i
valori di input.
Questa situazione è risolvibile tramite un protocollo per un oblivious trans-
fer, pertanto Alice configura il trasferimento, tramite un oblivious protocol, delle
chiavi di input a Bob. Bob riceve una sola chiave per ogni filo corrispondente al
suo input, senza che Alice sappia qual è stata la sua scelta. Infine Bob inizia la
procedura utilizzando le tabelle delle porte fornite da Alice.
Una volta che Bob ha effettuato la computazione, possiede una chiave finale
K che invia ad Alice, che può comprendere se K corrisponde ad un output di 0 o
1.
1. Gli intervalli della funzione crittografica in nessuna delle due chiavi posso-
no essere disgiunti.
Con queste due proprietà il destinatario, dopo aver ottenuto le etichette per cia-
scun filo di input può valutare ogni porta logica cercando di trovare quale dei
quattro contenuti cifrati è stato cifrato con le sue chiavi etichetta e a quel punto
decifrare tale testo per ottenere l’etichetta del filo di output.
Questo viene fatto ignorando ciò che il destinatario ha appreso durante la
valutazione delle codifiche dei bit. I bit in input del mittente, colui che ha creato
il circuito, possono essere inviati codificati al valutatore del circuito, poiché la
codifica corrispondente ai bit di input del destinatario (valutatore del circuito)
viene ottenuta tramite un protocollo Oblivious Transfer 1 su 2.
Un protocollo di questo tipo permette al mittente in possesso di due valori C1
e C2 di inviare il valore richiesto dal destinatario (un valore in {1, 2}), in questo
20 Secure Multi-party Computation
In tutti e tre i casi, i valori dei compiti di ogni parte sono elementi casuali in GF (p)
che si sommano al segreto in GF (p).
Ogni set di condivisioni non qualificato appare distribuito in modo casuale.
Tutti e tre gli schemi sono lineari, quindi la somma dei segreti di due parti o
la moltiplicazione di un segreto per una costante può essere fatto localmente e le
funzioni lineari possono essere, in seguito, valutate liberamente. Questo spalanca
le porte a innumerevoli problemi di sicurezza.
Il secret sharing di Shamir è uno dei primi schemi a soglia (threshold systems
[15]) per la condivisione di segreti, esso si basa sull’interpolazione polinomiale ed
è definito da una coppia di valori (t, n) dove n è il numero totale di partecipanti
2.6 Protocolli generici basati sui circuiti 21
u ∈ N, 1 ≤ u ≤ 100 : yu = Db (V ala + u)
u ∈ N, 1 ≤ u ≤ 100 : zu = yu (mod p)
|zu − zv | ≥ 2
Alla fine Bob manda ad Alice questi numeri in questo esatto ordine:
y1 = DB (15 + 1) = 26
y2 = DB (15 + 2) = 18
y3 = DB (15 + 3) = 2
y4 = DB (15 + 4) = 39
3.2 Votazione di un candidato 25
z1 = 26(mod 31) = 26
z2 = 18(mod 31) = 18
z3 = 2(mod 31) = 2
z4 = 39(mod 31) = 8
1. Viene scelto un numero primo p maggiore del numero degli utenti della
rete.
In questo protocollo le comunicazioni tra gli utenti sono cifrate e quindi ogni
utente non vede ciò che è stato mandato agli altri utenti.
Si possono verificare le diverse situazioni in base ai due tipi di utenti:
Nel primo caso supponendo che gli utenti non possono collaborare tra di loro e
che il votante curioso sia l’utente v3 . v3 non potrà sapere niente circa il voto degli
altri in quanto i voti che vede v3 sono mascherati dai valori iniziali in R scelti
a caso quindi non ha informazioni sul voto espresso dagli utenti precedenti, il
protocollo va bene se il votante curioso è unico.
Se i votanti curiosi sono più di uno allora è possibile ottenere qualche infor-
mazione. Supponendo, ad esempio, di avere 3 votanti indicati come v1 , v2 , v3 se
v3 ed v1 si uniscono possono scoprire il voto di v2 .
Inoltre può anche accadere che se il votante che fornisce agli altri votanti il
risultato dell’elezione (nell’esempio v1 ) non è onesto può fornire un valore di-
verso dal reale risultato dell’elezione. Questo problema può essere risolto obbli-
gando l’utente in questione a fornire una dimostrazione sulla sua correttezza, ad
esempio utilizzando una prova di tipo a conoscenza zero:
• v2 riceve Cv2 (R) cioè un array in cui tutti i valori di R sono cifrati con la sua
chiave pubblica, modifica uno dei valori di R e rimanda R1 = {r1 , r2 , . . . , ri +
1, . . . , rn }
• v3 riceve Cv3 (R1 ) cioè l’array R modificato da v2 con la sua votazione dive-
nuto R1 e poi cifrato con la chiave pubblica di v3 .
• v2 può quindi verificare che dato che v3 cifra un array di valori Cv2 (R1 ) in
cui solo uno dei valori presenti in R1 può essere cambiato il che dimostra
che l’array è stato modificato in maniera corretta.
2. Due o più votanti curiosi riescono a scoprire i voti espressi dagli altri votan-
ti.
• Si sceglie come primo p maggiore nel numero dei votanti (m) il numero 17.
Architettura dell’applicazione
Group-owner
Gestione degli errori L’applicazione prevede una gestione degli errori su due
livelli, qualsiasi errore accada su uno dei device, la computazione non può essere
4.2 Protocolli di SMC 31
Protocolli di SMC
Interfaccia utente
per Android
Layer di trasporto
InitUser DefaultUser
Generazione packet1
pacchetto iniziale
Posso creare un nuovo pacchetto? sì.
packet2 Genera il prossimo pacchetto
a partire da packet1
...
packetN-1
Genera
il prossimo pacchetto packetN Posso creare un nuovo pacchetto? no
a partire da packetN-1 Leggi il risultato nel pacchetto
packetN
3. Una volta che tutti gli utenti secondari hanno inviato le loro informazioni
di sicurezza, allora l’utente iniziale le impacchetta (in un DevicesSecurity-
InfoPacket) e le manda a tutti gli utenti, in modo che ogni partecipante al
gruppo, conosca le chiavi pubbliche di tutti.
InitUser DefaultUser
protocolParamsPacket
Il gruppo di computazione protocolParamsPacket
è stato creato
deviceSecurityInfoPacket1
deviceSecurityInfoPacket2
devicesSecurityInfoPacket
In attesa delle
informazioni di sicurezza devicesSecurityInfoPacket
di tutti i dispositivi
confirmationPacket
confirmationPacket
In attesa dei pacchetti
di conferma transportProtocolPacket1
da tutti i dispositivi. transportProtocolPacket2
Invio primo pacchetto
transportProtocolPacket3
transportProtocolPacketR
Invio ultimo pacchetto
con il risultato transportProtocolPacketR
della computazione
Serialized packet
number of candidates
Failure reason
Is encrypted?
SerializableSMCProtocolPacket
Implementazione
La presentazione generica dei tipi di utente possibili e l’uso dei pacchetti per i
protocolli specifici sarà spiegata in dettaglio nella sezione Implementazione dei
protocolli.
Per testare il funzionamento dei protocolli senza avere ancora una struttura
applicativa vera e propria sulla quale eseguirli, sono stati effettuati numerosi test
di unità in cui si simulavano gli utenti comunicanti verificando che ogni step del
protocollo producesse un output corretto.
La maggior parte dei test dell’applicazione sono orientati a garantire la cor-
rettezza dei protocolli, per i dettagli è necessario vedere la sezione Strategie di
testing.
In seguito si è cercato di portare l’implementazione dei protocolli in un am-
biente specifico, ovvero in Android. Il porting dei protocolli è stato molto facile
poiché la piattaforma Android prevede già l’uso di applicazioni java che sono in
pratica la maggior parte di quelle presenti negli store.
I problemi che si sono presentati, indipendentemente dalla piattaforma, sono
stati principalmente due e cioè:
cata della rete Wi-Fi Direct. Si veda la sezione apposita per informazioni più
specifiche.
Una volta scelto il mezzo per la comunicazione tra dispositivi è risultato ne-
cessario costruire una gerarchia di pacchetti per effettuare le varie comunicazioni,
le tipologie di pacchetti sarebbero state necessarie anche se si fosse scelta una
diversa infrastruttura di comunicazione, motivo per cui l’elenco dei pacchetti
possibili è stato già presentato all’interno del capitolo dedicato all’architettura
dell’applicazione.
Il dispositivo che inizializza sia il gruppo all’interno della rete, sia il protocol-
lo di SMC ha un altro ruolo importante all’interno dell’applicazione, si occupa
anche di ricevere tutti i pacchetti e di inoltrarli al dispositivo corrispondente (si
veda L’uso di Wi-Fi Direct per un approfondimento).
Tutti i pacchetti passano per il device iniziale, motivo per cui la sicurezza po-
trebbe essere minata, per evitare questo inconveniente i pacchetti che devono
rimanere privati sono cifrati con la chiave pubblica del destinatario.
I pacchetti scambiati tra un dispositivo e l’altro sulla rete prima di essere in-
viati vengono serializzati in un formato per lo scambio dei dati plain text deno-
minato JSON, per fare questo si è usata la libreria LoganSquare.
LoganSquare è una delle librerie più veloci nel trasformare oggetti java in
strutture json e viceversa. Nella sezione relativa alle librerie è possibile trovare
delle informazioni su essa.
InitUser DefaultUser
generate
Initialization packet1
Packet()
packet2 hasNextPacket? true
generateNextPacket(packet1)
...
packetN-1
generate
NextPacket packetN
(packetN-1) hasNextPacket? false
getVerboseResult(packetN)
In caso il pacchetto ricevuto da SecondMillionaire sia l’ultimo (quello nella fase tre)
allora risulta possibile leggere il risultato della computazione.
public boolean imRicher(SMCProtocolPacket phase3Packet){
...
return !phase3Packet.getValues().get(0).equals(BigInteger.ZERO);
}
In seguito il device iniziale genererà anche l’ultimo pacchetto, per fare questo
aggiungerà prima il suo voto alla lista, incrementando di uno il valore all’indice
corrispondente al voto e poi sottrarrà i valori generati nella fase iniziale.
46 Implementazione
Nello stesso metodo viene fatto anche un controllo per verificare che un utente
non abbia barato aggiungendo più di un voto durante il suo turno.
...
BigInteger c = BigInteger.ZERO;
for(BigInteger bi : smcProtocolPacket.getValues()){
c = c.add(bi);
}
if(c.intValue() != n_voters ){
throw new IllegalArgumentException("Wrong number of voters: "
+ c.intValue() + " expected " + n_voters);
}
Se si tratta dell’ultimo pacchetto del protocollo il risultato può essere letto trami-
te il metodo readVotingResult o per avere un risultato leggibile è presente anche
5.2 Implementazione dei protocolli 47
A B C
...
...
packet1ForC
Il pacchetto è per me? no
Inoltra il packet1ForC
pacchetto a C
sender: B receiver: C
type: SerializableSMCProtocolPacket Header
is encrypted? TRUE
SerializableSMCProtocolPacket Serialized packet
5.4 Tecnologie
Engine
La prima variante è quella da preferire nella maggior parte dei casi, in quanto
si lascia JCA decidere il "miglior" provider da utilizzare. La seconda e terza va-
riante consentono di richiedere un’implementazione da uno specifico provider.
Tutte le varianti infine lanciano una checked exception (omessa) se l’implemen-
tazione non è disponibile.
Ad esempio è possibile richiedere il digester SHA-256 tramite l’engine Messa-
geDigest nel seguente modo:
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
Provider
Providers
Harmony
Bouncy Castle
Bouncy Castle [23] è stato l’unico provider JCA completo disponibile prima di
Android 4.0. La versione presente in Android è, tuttavia, una versione modificata
del provider Bouncy Castle:
• alcuni algoritmi, modi e parametri sono stati rimossi in quanto non suppor-
tati dalla reference implementation di Java
• MD5 e SHA1 sono forniti come implementazione nativa (JNI) per migliora-
re le performances
AndroidOpenSSL
Questo provider JCA continua la strategia di portare in codice nativo gli Engine
con problemi di performance, come già visto per Bouncy Castle.
AndroidOpenSSL quindi usa la libreria nativa OpenSSL, tramite JNI, per for-
nire implementazioni di tutti gli engine. Questo provider a partire da Android
4.4 è stato marcato come default, a priorità 1.
La storia
Inizialmente chiamato Wi-fi p2p, Wi-Fi Direct è uno standard che permette a di-
versi dispositivi di collegarsi l’uno con l’altro senza la necessità di un access point.
5.4 Tecnologie 53
È utilizzato in molti ambiti dal trasferimento di file alle comunicazioni tra diver-
si dispositivi. Uno dei vantaggi di Wi-fi Direct è la sua capacità di permettere
connessioni tra dispositivi generici.
Normalmente le reti wifi prevedono la presenza di access point che hanno
principalmente tre compiti:
scanner. Per fare questo, però, erano stati creati tutta una serie di protocolli co-
me Universal Plug and Play (UPnP), Devices Profile for Web Services (DPWS)
e Zero Configuration Networking (ZeroConf). Questi protocolli permettevano
ai dispositivi di collegarsi ad altri dispositivi della stessa rete senza effettuare un
setup o meglio il setup veniva fatto automaticamente ad insaputa dell’utente.
Col tempo è diventato comune per gli smartphones ed altri dispositivi por-
tatili includere il wifi come funzionalità standard. Il processo di aggiungere la
funzionalità di wifi su un piccolo dispositivo ha permesso ad essi di poter trova-
re stampanti, telecamere e scanner sulla rete, senza la necessità di avere un filo
per collegarsi ad essi.
Implementazione su Android
@Override
public void onFailure(int reasonCode) {
// Questo codice viene chiamato se l’inizializzazione
// del discovery non ha avuto buon fine.
// Spesso è necessario comunicare all’utente che cosa
// non ha funzionato in modo che esso possa
// intraprendere una qualche azione.
// ad esempio se il telefono è in modalità aereo
// l’utente dovrà procedere a riattivare la rete.
}
});
mManager.requestPeers(mChannel, myPeerListListener);
}
@Override
public void onFailure(int reason) {
// L’azione è fallita
}
});
Esiste un listener per mettersi in ascolto sui cambiamenti di stato della connes-
sione, si tratta di
WifiP2pManager.ConnectionInfoListener, un’interfaccia che presenta la callback
onConnectionInfoAvailable() che viene chiamata quando lo stato di una connessio-
ne cambia. In caso ci siano dispositivi multipli che si collegano ad un singolo
peers, uno dei dispositivi deve essere designato come "group owner".
@Override
public void onConnectionInfoAvailable(final WifiP2pInfo info) {
}
}
@Override
public void onFailure(int arg0) {
// In caso di fallimento bisogna controllare se il codice di
errore
// è di tipo P2P_UNSUPPORTED, ERROR oppure BUSY.
}
});
}
Per effettuare il discovery dei servizi vicini, si hanno a disposizione due call-
back che vanno usate insieme.
La prima WifiP2pManager.DnsSdTxtRecordListener permette di mettersi in ascol-
to dei records, in pratica si riescono a scoprire le informazioni inserite nella map-
pa di proprietà registrate insieme al servizio. Le informazioni di record possono
essere gestite come si preferisce ad esempio salvandone una parte.
final HashMap<String, String> buddies = new HashMap<String, String>();
@Override
public void onDnsSdServiceAvailable(String instanceName,
60 Implementazione
String registrationType,
WifiP2pDevice resourceType) {
// Se si conosce il "buddyname" caricato dalla callback dei record
// Si effettua un update del nome del dispositivo.
if(buddies.containsKey(resourceType.deviceAddress)){
resourceType.deviceName =
buddies.get(resourceType.deviceAddress)
} else {
resourceType.deviceName = resourceType.deviceName;
}
serviceRequest = WifiP2pDnsSdServiceRequest.newInstance();
mManager.addServiceRequest(channel, serviceRequest, new
ActionListener() {
@Override
public void onSuccess() {
// La richiesta ha avuto successo!
}
@Override
public void onFailure(int code) {
// In caso di fallimento bisogna controllare se il codice di errore
// è di tipo P2P_UNSUPPORTED, ERROR oppure BUSY.
}
});
@Override
public void onSuccess() {
// l’operazione ha avuto successo
}
@Override
public void onFailure(int code) {
// L’operazione è fallita
if (code == WifiP2pManager.P2P_UNSUPPORTED) {
Log.d(TAG,
"P2P non è supportato su questo dispositivo");
} else if( code == WifiP2pManager.BUSY) {
Log.d(TAG,
"Il sistema è occupato: non può processare la richiesta");
} else if( code == WifiP2pManager.ERROR) {
Log.d(TAG,
"Operazione fallita a causa di un errore interno");
}
...
}
});
5.5 Librerie
5.5.1 Salut
Come visto precedentemente le API messe a disposizione da Google per gestire
il Wi-Fi Direct richiedono molto codice infrastrutturale, per ovviare a questo pro-
blema visto che lo scopo principale del progetto non consiste nel Wi-Fi P2P si è
usata la libreria Salut. Salut è un wrapper delle API di Android per il Wi-Fi P2P,
permette con metodi piuttosto semplici di creare un servizio per il trasferimen-
to di dati denominato SalutServiceData e di poter leggere i dati inviati ad esso
tramite un SalutDataReceiver.
SalutDataReceiver dataReceiver =
new SalutDataReceiver(myActivity, salutDataCallback);
SalutServiceData serviceData =
new SalutServiceData(SERVICE_NAME, PORT, instanceName);
// L’instanceName dovrebbe essere
// un nome leggibile che viene mostrato all’utente
62 Implementazione
}, callContinously);
Per effettuare una classica connect, una volta trovato un host con il servi-
zio che si stava cercando è sufficiente usare il metodo registerWithHost messo
a disposizione dall’oggetto Salut.
network.registerWithHost(possibleHost, new SalutCallback() {
@Override
public void call() {
Log.d(TAG, "Questo dispositivo si è registrato all’host.");
}
}, new SalutCallback() {
@Override
public void call() {
Log.d(TAG, "La registrazione all’host è fallita");
}
});
Come si può vedere la gestione dell’invio di dati sulla rete risulta molto sem-
plificata grazie a questa libreria. Non è più necessario gestire tutte le chiamate
che richiede l’API standard di Wi-Fi P2P ma è sufficiente creare dei servizi, col-
legarsi ad essi ed in seguito inviare i dati tra un device e l’altro, senza avere la
5.5 Librerie 65
5.5.2 LoganSquare
Android nella sua versione più pura mette a disposizione delle classi di utilità
per leggere gli stream in formato Json. È infatti possibile scorrere uno stream
serializzato e leggere i valori che appartengono a determinate chiavi, siano questi
numeri, stringhe o sotto-strutture più complesse. Questa modalità di leggere il
json è molto efficiente perché permette di andare a leggere di volta in volta solo
le parti di json che sono di interesse, scartando quelle che potrebbero non essere
utili. Tuttavia per ogni json che arriva è necessario scrivere del codice ad-hoc, per
ogni situazione di interesse e può diventare pesante, in determinati casi.
Una libreria spesso usata per non doversi occupare di scorrere il json e costrui-
re degli oggetti con i valori trovati è GSON. GSON è molto più avanzata rispetto
al parsing manuale, prevede solo due metodi f romJson() e toJson(), con il pri-
mo metodo dato uno stream e una classe di destinazione per convenzione tutti i
campi con un certo nome dentro il json vengono copiati nell’oggetto, cercando di
rispettare i tipi ed andando in profondità nelle sotto classi contenute nella classe
principale. Il secondo metodo, invece, data una classe permette di ottenere un
json che rispetti la struttura gerarchica della stessa classe.
Usando GSON non è necessario che le classi siano particolari, se una classe
risulta complessa è possibile registrare un TypeAdapter, cioè una classe che de-
scriva un comportamento particolare per la serializzazione e per la deserializza-
zione. In questo modo è anche possibile modificare il comportamento di default
del serializzatore di GSON.
Una soluzione diversa è quella invece adottata da LoganSquare, in cui le classi
che si possono serializzare sono solo quelle annotate, questo permette al processo
di de/serializzazione di essere molto più veloce perché il lavoro più lungo di
mapping tra un eventuale json e la classe viene fatto a compile time. Quando
è necessario scrivere i valori dei campi di un uno stream json su una classe, la
logica da seguire è già conosciuta.
L’annotazione può essere fatta sull’intera classe, decidendo che strategia se-
guire (ad esempio tutti i campi non privati) e poi decidendo quali campi ignorare.
66 Implementazione
@JsonObject(fieldDetectionPolicy =
FieldDetectionPolicy.NONPRIVATE_FIELDS)
public class MyClass {
@JsonIgnore
public int nonJsonField;
Oppure i campi da mappare vengono annotati uno per uno, questo risulta
molto più controllabile e sicuro, perché si può essere certi che qualsiasi cosa venga
mappata automaticamente è stata decisa dallo sviluppatore
@JsonObject
public class MyClass {
@JsonField
public String format;
@JsonField(name = "differentFieldName")
public int imageId;
Anche un pacchetto in una fase sbagliata per un determinato utente (sia que-
sto un’ estensione di InitUser o DefaultUser) viene considerato sbagliato. Ad esem-
pio InitMillionaire tra le sue fasi prevede solo di ricevere un pacchetto in fase 2
(e di generare il primo pacchetto). L’eccezione lanciata è abbastanza parlante e
permette di identificare nel log il problema che si è verificato.
switch (packetReceived.getPhaseint()) {
case 0:
throw new IllegalArgumentException
("Please call generateInitializationPacket() for this phase");
case 1:
throw new IllegalArgumentException("1 is a Wrong phase for init
user!");
case 2:
return generatePhase3Packet( packetReceived);
default:
throw new IllegalArgumentException("Wrong phase for this
protocol!");
}
68 Implementazione
SecondMillionaire mp_b =
new SecondMillionaire(new BigInteger("2"), 4);
mp_b.setB_privkey(new BigInteger("23"), new BigInteger("55"));
mp_b.setP(new BigInteger("31"));
SMCProtocolPacket packet2 = mp_b.generateNextPacket(packet1);
Assert.assertEquals(2, packet2.getPhaseint());
mp.generateNextPacket(packet2);
}
Nel protocollo di voto durante l’ultima fase, quando viene generato il pacchet-
to con il risultato della votazione si ha un controllo per verificare che non siano
state fatte manipolazioni dell’array.
In pratica avendo un array composto da una serie di numeri casuali ai quali
è sono stati aggiunti uno o più numeri è possibile, una volta sottratti i numeri
casuali generati durante l’inizializzazione, facendo una semplice somma dei voti
è possibile verificare che questa sia equivalente al numero di votanti: ad ogni
votante spetta un solo voto e tutti devono votare.
@Test(expected = IllegalArgumentException.class)
public void endingPhaseWithManipulationFail2() {
InitVoter mp = new InitVoter(2,3,1);
SMCProtocolPacket packet0 = mp.generateInitializationPacket();
Supponendo che uno dei votanti sappia per qualche motivo qual è il voto di
un altro votante, questo potrebbe sapere quale valore modificare e quindi togliere
uno o più voti ad un candidato ed aggiungerlo ad un altro. Questo equivarrebbe
a prendere dei fogli da un urna e aggiungerli ad un’altra, questa manipolazione
70 Implementazione
è destinata a non essere rilevata, anche se si suppone che vista la segretezza dei
voti tale sofisticazione non possa avvenire.
@Test
public void endingPhaseWithCleverManipulationCanNotFail() {
InitVoter mp = new InitVoter(2,3,1);
SMCProtocolPacket packet0 = mp.generateInitializationPacket();
// first user
CommonVoter su1 = new CommonVoter(1);
SMCProtocolPacket packet1 = su1.generateNextPacket(packet0);
// second user
CommonVoter su2 = new CommonVoter(1);
SMCProtocolPacket packet2 = su2.generateNextPacket(packet1);
//doing manipulation
packet2.getValues().set(0,
packet2.getValues().get(0).add(new BigInteger("2")));
packet2.getValues().set(1,
packet2.getValues().get(1).subtract(new BigInteger("2")));
mp.generateNextPacket(packet2);
}
avvio del servizio, creazione del gruppo di computazione e i tempi trascorsi tra
l’invio del primo pacchetto del protocollo di SMC e l’invio del pacchetto con il
risultato.
Tutti i tempi sono stati presi sul dispositivo che inizializza la computazione,
in quanto esso ha una visuale più completa dei pacchetti che passano per la rete.
4298
ZENPHONE 2 1979
297
3600
NEXUS 9 1395
121
2322
198
3249
NEXUS 5 1542
220
Protocollo di voto come nel protocollo del milionario, i tempi per l’avvio del
servizio rimangono al di sotto di 1s. Il tempo di creazione del gruppo aumenta
72 Implementazione
6744
ZENPHONE 2 2880
184
5446
NEXUS 9 2659
264
5587
180
4743
NEXUS 5 2381
234
8515
ZENPHONE 2 3980
211
6916
NEXUS 9 4178
170
7773
234
7339
NEXUS 5 4596
325
Confronto protocolli come anticipato alcuni tempi sono costanti e non dipen-
dono dal tipo di protocollo, altri tempi come quelli di costruzione del gruppo di
computazione dipendono dai partecipanti alla computazione ed infine l’esecu-
zione del protocollo dipende sia dal numero di partecipanti al protocollo, sia dal
protocollo stesso: infatti un protocollo che prevede molte fasi durerà più a lungo
di uno che ne prevede poche. Nel caso del protocollo di voto il numero di fasi
dipende direttamente dal numero di partecipanti quindi le due variabili ovvero
numero di partecipanti e numero di fasi del protocollo, collidono.
AVVIO
SERVIZIO
SU
WI-‐FI
DIRECT CREAZIONE
E
CONFIGURAZIONE
RETE
DI
CALCOLO
INVIO
PRIMO
PACCHETTO
E
I NVIO
SOLUZIONE
12000
10000
8000 7635
6000
5630
4000
3367
3989
2000
2604
1614
Prima schermata
con inserimento dati
nome dispositivo
durante la
computazione
scelta della
modalità di avvio
scelta del
protocollo
milionario
no
mostra casella per
inserimento milioni
mostra casella per
inserimento voto
immissione
dei milioni
Figura 5.10: Flusso applicativo durante l’immissione dei dati: nel primo rettan-
golo è possibile vedere, la parte comune, ai due protocolli, in quella arancione si
vede la parte relativa al protocollo di voto ed in quella blu quella del protocollo
del milionario.
Capitolo 6
L’applicazione mobile presentata in questa tesi vuole proporsi come una base sul-
la quale possano essere aggiunti altri tipi di protocolli a due o più parti; quindi
guardando agli sviluppi futuri, sarebbe interessante includere nel codice applica-
tivo un framework generico di SMC per estendere le possibilità computazionali.
Usando un framework di questo genere è possibile creare nuovi protocolli che
risolvono nuovi problemi, riusando l’infrastruttura implementata per questa tesi
che si occupa già di gestire dettagli tecnici come il networking e le interazioni tra
dispositivi.
Di framework per effettuare computazioni sicure ne esistono diversi, il più
noto dei quali è SPDZ [16], scritto in Java. Le difficoltà che si potrebbero riscon-
trare nella sua integrazione riguardano principalmente l’adattamento all’uso nel
mobile, poiché il loro utilizzo è previsto su una JVM standard e non su quella di
Android.
Fortunatamente negli ultimi tempi sono stati presentati nuovi framework SMC
per Android, ad esempio PCF [36] che però è solo two-party o una derivazio-
ne recente di Fairplay per il mobile [37] che usa come linguaggio SFDL (Secure
Function Definition Language) usato anche nella versione originale di Fairplay o
infine la libreria Whitewash [38] che permette di delegare una parte del lavoro ad
un sistema esterno.
Per supportare protocolli SMC generici si dovrebbe trovare un modo per ge-
nerare una schermata di immissione di dati usabile che tenga conto dei dati
necessari come input per effettuare la computazione.
80 Sviluppi futuri e conclusioni
6.2 Conclusioni
Il mobile computing con il passare del tempo sta diventando sempre più comune
e con esso anche la necessità di nuove tecniche di calcolo privacy-preserving,
necessarie per consentire agli utenti di usufruire di applicazioni mobile, senza il
rischio di esporre informazioni private e mantenendo un alto grado di sicurezza.
Nell’ambito mobile, in particolare, le informazioni da proteggere sono nume-
rose: basti pensare al contenuto della rubrica o alle e-mail della casella di po-
sta e non per ultime le applicazioni in ambito bancario che permettono in pochi
passaggi di effettuare pagamenti dal proprio dispositivo.
Molti protocolli di SMC forniscono già gli strumenti per valutare funzioni in
modo sicuro sulle piattaforme desktop, dove la potenza di calcolo è abbondante
e non limitata da consumi di batteria. Purtroppo sono poche le piattaforme e
soluzioni che usano tali protocolli sulle piattaforme mobile.
Quindi la SMC può potenzialmente offrire un modo per preservare la priva-
tezza anche in ambito mobile, l’unico problema rimane l’efficienza di esecuzione.
Infatti per la valutazione di funzioni semplici la soluzione che prevede la costru-
zione protocolli appositi costruendo garbled circuits può essere considerata buo-
na, soprattutto se ci si trova in un contesto di calcolo in cui gli altri partecipanti
sono semi-onesti o curiosi.
Il problema nasce con la costruzione di circuiti molto grandi, per risolvere pro-
blemi più complessi, in questo caso il costo computazionale della costruzione di
un circuito diventa proibitivo sui dispositivi mobile nei quali si tenta di ottimiz-
zare i consumi e la durata della batteria piuttosto che aumentare le prestazioni
(e.g. clock della cpu e ram).
Una soluzione che è stata sperimentata è quella di unire circuiti garbled agli
schemi di cifratura omomorfica ([27], [26]). La cifratura omomorfica permette di
effettuare dei calcoli su degli input che sono stati cifrati per poi decifrare il risul-
tato che grazie alle proprietà del cifrario scelto corrisponde allo stesso risultato
che si otterrebbe operando sugli input non cifrati.
6.2 Conclusioni 81
[2] http://www.sigact.org/Prizes/Knuth/1996.html
[3] Peter Bogetoft, Dan Lund Christensen, Ivan Damgård, Martin Geisler, Tho-
mas Jakobsen, Mikkel Krøigaard, Janus Dam Nielsen, Jesper Buus Nielsen,
Kurt Nielsen, Jakob Pagter, Michael Schwartzbach, and Tomas Toft. 2009.
Secure Multiparty Computation Goes Live. In Financial Cryptography and Da-
ta Security, Roger Dingledine and Philippe Golle (Eds.). Lecture Notes In
Computer Science, Vol. 5628. Springer-Verlag, Berlin, Heidelberg 325-343.
DOI=http://dx.doi.org/10.1007/978-3-642-03549-4_20
[4] Dan Bogdanov, Riivo Talviste, Jan Willemson. Deploying secure multi-party
computation for financial data analysis (Short Paper). In Angelos Keromytis,
editor, Financial Cryptography and Data Security, LNCS 7397, pp. 57-64.
Springer, 2012.
[7] O. Goldreich, S. Micali, and A. Wigderson. How to play any mental game.
In Proceedings of the nineteenth annual ACM symposium on Theory of
computing, pages 218–229. ACM, 1987.
[9] Ishai, Y.; Prabhakaran, M.; Sahai, A. (2008). Founding Cryptography on Obli-
vious Transfer – Efficiently 5157: 572–591. doi:10.1007/978-3-540-85174-5_32
[10] Quisquater, Jean-Jacques; Guillou, Louis C.; Berson, Thomas A. (1990). How
to Explain Zero-Knowledge Protocols to Your Children. Advances in Cryptology
– CRYPTO ’89: Proceedings 435: 628–631.
[11] Peter Snyder. Yao’s Garbled Circuits: "Recent Directions and Implementa-
tions"
[13] M. Ito, A. Saito, and T. Nishizeki. Secret sharing schemes realizing general ac-
cess structures. In Proc. IEEE Global Telecommunication Conf., Globecom 87,
pages 99–102, 1987
[15] Adi Shamir. 1979. How to share a secret. Commun. ACM 22, 11 (November
1979), 612-613. DOI=http://dx.doi.org/10.1145/359168.359176
[19] Y. Lindell and B. Pinkas, An efficient protocol for secure two-party computation in
the presence of malicious adversaries, Eurocrypt 2007, vol. Springer LNCS 4515,
pp. 52-78, 2007.
[20] A. Ben-David, N. Nisan and B. Pinkas, FairplayMP: a system for secure multi-
party computation, ACM CCS 2008, pp. 257-266, 2008
BIBLIOGRAFIA 85
[22] T. Frederiksen and J. Nielsen, Fast and maliciously secure two-pary computation
using the GPU, ACNS 2013, vol. Springer LNCS 7954, pp. 339-356, 2013
[23] https://www.bouncycastle.org/java.html
[24] https://rtyley.github.io/spongycastle/
[25] http://docs.oracle.com/javase/7/docs/technotes/guides/
security/StandardNames.html
[26] Gentry, C., Fully homomorphic encryption using ideal lattices, in Proceedings of
the Annual ACM Symposium on Theory of Computing, 2009.
[27] Rivest, R., Adleman, L., and Dertouzos, M., On data banks and privacy homo-
morphisms, in Proceedings of the IEEE Annual Symposium on Foundations
of Computer Science, 1978.
[28] Demmler, D., Schneider, T., and Zohner, M., Ad-hoc secure two-party compu-
tation on mobile devices using hardware tokens, in Proceedings of the USENIX
Security Symposium, 2014.
[29] Mood, B., Letaw, L., and Butler, K., Memory-efficient garbled circuit generation
for mobile devices, in Proceedings of the IFCA International Conference on
Financial Cryptography and Data Security (FC), 2012.
[30] Kreuter, B., Mood, B., shelat, a., and Butler, K., PCF: A portable circuit for-
mat for scalable two-party secure computation, in Proceedings of the USENIX
Security Symposium, 2013.
[32] Kamara, S., Mohassel, P., and Riva, B., Salus: A system for server-aided secure
function evaluation, in Proceedings of the ACM conference on Computer and
communications security (CCS), 2012.
[33] Green, M., Hohenberger, S., and Waters, B., Outsourcing the Decryption of ABE
Ciphertexts, in Proceedings of the USENIX Security Symposium, 2011.
86 BIBLIOGRAFIA
[35] Blanton, M., Steele, A., and Alisagari, M., Data-oblivious graph algorithms
for secure computation and outsourcing, in Proceedings of the ACM SIGSAC
Symposium on Information, Computer and Communications Security, 2013.
[36] Kreuter, Benjamin, et al. PCF: A Portable Circuit Format for Scalable Two-Party
Secure Computation. Usenix Security. Vol. 13. 2013. APA
[37] Benjamin Mood, Lara Letaw, and Kevin Butler. Memory-efficient garbled cir-
cuit generation for mobile devices, Financial Cryptography and Data Security.
Springer Berlin Heidelberg, 2012. 254-268.
[38] Carter, Henry, Charles Lever, and Patrick Traynor. Whitewash: Outsourcing
garbled circuit generation for mobile devices. Proceedings of the 30th Annual
Computer Security Applications Conference. ACM, 2014.