Declinazione di responsabilità: Sono consapevole che l'implementazione della propria crittografia è una pessima idea. Questo fa parte di una tesi di master, il codice non verrà utilizzato nella pratica.Implementazione di un ordinamento, tipo di attacco resistente alla cache in C
Come parte di un algoritmo crittografico più grande, ho bisogno di ordinare una matrice di lunghezza costante (piccola, 24 per essere precisi), senza perdite di informazioni sul contenuto di questo array. Per quanto ne so (si prega di correggermi se questi non sono sufficienti a prevenire temporizzazione e di cache attacchi), questo significa:
- L'ordinamento deve essere eseguito nella stessa quantità di cicli in termini di lunghezza della matrice, indipendentemente dai valori particolari della matrice
- l'ordinamento non dovrebbe diramare o memoria ad accesso a seconda delle particolari valori dell'array
esistono tali implementazioni? In caso contrario, ci sono buone risorse su questo tipo di programmazione?
Per essere onesti, sto persino lottando con il sottoprogetto più semplice, vale a dire trovare il valore più piccolo di un array.
double arr[24]; // some input
double min = DBL_MAX;
int i;
for (i = 0; i < 24; ++i) {
if (arr[i] < min) {
min = arr[i];
}
}
Sarebbe l'aggiunta di un else
con un incarico fittizio essere sufficiente per rendere i tempi di sicurezza? In tal caso, come faccio a garantire che il compilatore (GCC nel mio caso) non annulli il mio duro lavoro? Sarebbe suscettibile agli attacchi della cache?
Una rete di ordinamento più un confronto e scambio a tempo costante è ciò che si desidera. Vedi [qui] (http://hoytech.github.io/sorting-networks/) (diapositiva 32) per l'idea. Poiché la dimensione del tuo problema è piccola, il costo della rete probabilmente non sarà proibitivo. –
Se stai davvero andando * così * in profondità, devi pensare a cosa il compilatore * effettivamente * fa * dal tuo codice - ad esempio "pensa in assemblatore". Lavorare a livello "C" non sarà sufficiente, specialmente con i compilatori moderni e molto aggressivi. 'min = arr [i]' molto probabilmente funzionerà con un singolo assegnamento di registro (controllare questo;)), senza un reale impatto temporale misurabile esternamente. Qualsiasi 'else'clause non sarebbe necessaria. Nel caso in cui le cose in un 'se'clause si stanno rivelando più complesse, il tuo approccio è quello giusto. – tofro
La mia intuizione mi dice che non puoi cavartela con l'ordinamento di alcuni dati e non perdere informazioni sulle sue proprietà attraverso la temporizzazione della filiale e il comportamento della cache. Perché non iniettare rumore nel sistema per nascondere invece le cose? Mescola il tuo array con fisher-yates alimentati da un CSPRNG, quindi ordinalo normalmente con quicksort. Intuitivamente questo sembra sufficiente poiché tutti gli attacchi temporali che ho visto fino ad ora dipendono da ripetute operazioni di crittografia che ogni volta perdono un po 'di informazioni. Quindi, a meno che un attacco di temporizzazione non possa estrarre l'intera chiave usata per lo shuffle, dovrebbe andare bene. – Art