4.1 Curva di Hilbert
4.1.2 Algoritmo per la generazione della chiave derivata di Hilbert
Hilbert
L’algoritmo utilizzato per la generazione della chiave derivata a partire da n attributi
numerici `e stato proposto da Jonathan Lawder in [22]. Lo scopo dell’algoritmo `e
quello di determinare un’associazione univoca tra il valore di n attributi ed un punto appartenente alla curva di Hilbert, le cui coordinate compongono la chiave derivata o Hilbert derived-key. Si effettua dunque un passaggio da un sistema n-dimensionale formato dagli n attributi ad un sistema lineare formato dalle chiavi derivate di Hilbert.
Il primo passo dell’algoritmo di generazione della chiave derivata di Hilbert prevede la creazione della generator table di dimensione n necessaria per le fasi successive ed
il suo ordinamento rispetto ai valori della colonna X1. Come descritto in seguito,
l’algoritmo effettua diversi accessi alla generator table in base ai valori contenuti nella
ai valori della colonna X1, in modo da poter effettuare un accesso diretto alla tabella
in base al valore di X1. Le strutture dati utilizzate nel corso dell’algoritmo sono una
matrice di dimensione n × n, matrSc, ad indicare la matrice di trasformazione dello
stato corrente ed un array di n posizioni, signs, utilizzato per mantenere i segni degli elementi della matrice diversi da zero negativi. La posizione i -esima di questo array
avr`a valore pari a uno, se nella i -esima colonna della matrice l’elemento non nullo ha
valore pari a -1, mentre avr`a valore pari a zero nel caso in cui tale elemento abbia
valore pari ad uno. La matrice di trasformazione dello stato corrente viene modificata ad ogni iterazione del ciclo principale dell’algoritmo ed identificher`a lo stato corrente in cui l’algoritmo si trova; ad ogni aggiornamento di questa matrice corrisponde un aggiornamento dell’array dei segni degli elementi.
Un esempio della matrice di trasformazione dello stato corrente, matrSc, e della
struttura dati che ne contiene i segni, signs, `e rappresentato in figura 4.3:
Figura 4.3 – Esempio di matrice di trasformazione dello stato corrente
Il secondo passo dell’algoritmo prevede la creazione di una variable P il cui valore `e
dato dalla concatenazione delle rappresentazioni binarie dei valori degli n attributi di input. La notazione aij sta ad indicare il bit j -esimo dell’attributo i -esimo.
P = {a00 a01 ... a0k−1 a10 a11 ... a1k−1 ... an−10 an−11 ... an−1k−1 }
La variable P avr`a dunque una dimensione pari a n × k bits, dove k esprime il
numero di bits necessari per la rappresentazione binaria dell’attributo con valore mag-
giore e n il numero di attributi (dimensioni). La variabile k esprime pi`u precisamente
l’ordine di raffinamento della curva ovvero l’intervallo di valori [0 ; 2k−1], in cui il valo-
in input verr`a espressa utilizzando k bits per ciascuna, eventualmente aggiungendo uno o pi`u bit con valore pari a zero nelle posizioni pi`u significative. Un esempio del valore assunto dalla variabile P, con n = 4 e k = 5, `e riportato nella figura 4.4.
Figura 4.4 – Esempio di costruzione della variabile P
La matrice dello stato corrente all’inizio dell’algoritmo `e inizializzata con la matrice
identit`a, mentre l’array che rappresenta i segni degli elementi non nulli della matrice
contiene il valore zero in tutte le posizioni. Le altre inizializzazioni, effettuate all’inizio
dell’algoritmo, riguardano la variabile HK che conterr`a la chiave derivata di Hilbert e
una variabile intera i utilizzata per il controllo della terminazione del ciclo principale.
La variabile i inizialmente avr`a un valore pari ad uno, mentre HK `e inizializzata con
il valore zero.
La parte principale dell’algoritmo `e composta da un ciclo che viene ripetuto per k
iterazioni, con k che esprime l’ordine della curva di Hilbert ed `e mostrata in figura 4.5.
La prima istruzione del ciclo assegna alla variabile zi un valore pari ai bit i -esimi di
ciascun attributo che forma la variabile P, quindi zi sar`a composta ad ogni iterazione
da n bits. Il valore di zi corrisponde ad un n-point.
Nella seconda istruzione la variabile zi `e aggiornata con il valore restituito dal cal-
colo della funzione f1 avente come parametri lo stesso valore corrente assunto da zi e
la matrice di trasformazione dello stato corrente. La funzione f1 `e composta di due
step successivi: il primo prevede il calcolo dell’or esclusivo (XOR) tra il valore corrente
della variabile zi e l’array signs che contiene i segni della matrice di trasformazione
dello stato corrente, mentre nel secondo si effettua una permutazione dei bit del valore ottenuto come risultato del primo passo a seconda del valore degli elementi della ma-
trice matrSc corrente. Per ciascuna riga m della matrice, se esiste un valore non nullo
nella colonna j-esima e nella posizione j -esima del risultato dell’or esclusivo vi `e un bit diverso da zero, allora si pone il bit nella posizione m-esima pari al valore di quello presente nella posizione j -esima e il bit nella posizione j -esima a zero. Nel caso in cui il bit in posizione j -esima sia gi`a stato modificato in un’iterazione precedente, il suo valore rimane immutato. Il confronto tra gli elementi della matrice di trasformazione dello stato corrente ed il valore dei bit del risultato dell’or esclusivo avviene sempre sul valore ottenuto dal calcolo dopo il primo passo della funzione f1, senza tener conto
delle modifiche che possono essere state effettuate sui bit nelle iterazioni precedenti del secondo step.
Esempio 4.1.4. Un esempio del valore di zi ottenuto dal calcolo della funzione f1
avente come parametri la matrice di trasformazione dello stato corrente in figura 4.3 ed un valore di zi = 0110, `e il seguente: Primo passo: zi =signs L zi zi = 1010L 0110 = 1100 Secondo passo: m = 0, j = 1 : matrSc(0, 0) 6= 0 ∧ zi[1] 6= 0 → zi = 1000 m = 1, j = 0 : matrSc(1, 0) 6= 0 ∧ zi[0] 6= 0 → zi = 1100
m = 2, j = 2 : matrSc(2, 2) 6= 0 ∧ zi[2] = 0 nessuna trasformazione
Valore finale di zi = 1100
Il valore di zi calcolato serve per accedere alla generator table e ricavare una parte
della chiave derivata.
Nella terza istruzione si memorizza nella variabile hi il valore della k -esima parte
della chiave derivata di Hilbert, ricavato dal valore contenuto nella colonna Y della riga zi-esima della generator table creata inizialmente.
Sempre mediante la generator table si ricava nella quarta istruzione, dalla mede-
sima riga precedente indirizzata dalla variabile zi, la matrice di trasformazione per
lo stato successivo che coincide con la matrice di trasformazione contenuta nella co- lonna T(Y). L’aggiornamento della matrice dello stato corrente avviene nella quinta
istruzione del codice tramite l’esecuzione di una funzione f2, avente come parametri
la matrice di trasformazione dello stato corrente e la matrice di trasformazione per lo stato successivo ricavata dalla generator table. Il risultato restituito dal calcolo
della funzione f2 con questi parametri costituisce la nuova matrice di trasformazione
dello stato corrente. La funzione f2, come la funzione f1 `e definita mediante due step
successivi.
Il primo passo prevede il calcolo della nuova matrice di trasformazione per lo stato corrente (matrice A), come permutazione delle righe della matrice di trasformazione per lo stato successivo ricavata dalla generator table al passo precedente (matrice C - matrice di trasformazione per zi nello stato S0) in base al valore degli elementi della
matrice di trasformazione dello stato corrente attuale (matrice B). La matrice A viene calcolata in base alle seguente regola: se nella riga i-esima della matrice B esiste un bit non nullo nella colonna j-esima, allora la la riga i-esima della matrice A assume il valore degli elementi della riga j-esima della matrice C.
Il secondo step della funzione f2 modifica i segni degli elementi della matrice A a
seconda del valore degli elementi delle matrici B e C in maniera differente a seconda dei seguenti casi:
• se il segno dell’elemento non nullo nella riga m-esima della matrice B `e negativo e il segno dell’elemento non nullo nella riga j -esima della matrice C `e positivo, allora il segno dell’elemento diverso da zero nella riga m-esima della matrice A diventa negativo.
• se il segno dell’elemento non nullo nella riga m-esima della matrice B `e positivo e il segno dell’elemento non nullo nella riga j -esima della matrice C `e negativo, allora il segno dell’elemento diverso da zero nella riga m-esima della matrice A rimane immutato.
• se i segni dell’elemento non nullo nella riga m-esima della matrice B e di quello non nullo nella riga j -esima della matrice C sono entrambi positivi, allora il segno dell’elemento diverso da zero nella riga m-esima della matrice A rimane immutato.
• se i segni dell’elemento non nullo nella riga m-esima della matrice B e di quello non nullo nella riga j -esima della matrice C sono entrambi negativi, allora il segno dell’elemento diverso da zero nella riga m-esima della matrice A diventa positivo.
Una volta terminato il calcolo della funzione f2 ed ottenuta la matrice di trasfor-
mazione per il prossimo stato, si aggiorna la matrice di trasformazione dello stato corrente con questa e l’array signs con i nuovi valori.
Nella sesta e settima istruzione del corpo del ciclo dell’algoritmo si effettua rispet- tivamente uno shift verso sinistra di n bits del valore della variabile HK, che contiene
la chiave derivata di Hilbert gi`a calcolata e si somma a questa la k -esima parte della
chiave, calcolata nella terza istruzione. Al termine dell’algoritmo la variabile HK con-
terr`a la chiave derivata di Hilbert, di dimensione n × k bits, generata a partire dal
valore degli n attributi di input.