Outils :Vous avez un site web ? Un blog ?
Technorati reactions rencontre |
| Questa voce o sezione di crittografia è ritenuta da controllare. Motivo: italiano da sistemare
Partecipa alla discussione e/o correggi la voce.
|
In crittografia, l'RC5 è un algoritmo di cifratura a blocchi progettato da Ronald Rivest nel 1994. È degno di nota per la sua semplicità e perché una sua evoluzione (l'RC6) fu fra i candidati al ruolo di AES, per il quale gli fu preferito l'algoritmo Rijndael.
Indice |
Al contrario della maggior parte degli algoritmi di cifratura a blocchi, nei quali è parametrizzabile al più una delle costanti dell'elaborazione, solitamente la dimensione della chiave, nell'RC5 tutti i parametri di base sono variabili; è possibile infatti scegliere fra diverse dimensioni del blocco (32, 64 o 128 bit), della chiave (da 0 a 256 bytes) e nel numero di cicli (rounds), da 0 a 255.
Non tutti i valori ammissibili portano ad un risultato utilizzabile; ad esempio se la dimensione della chiave o il numero di rounds è 0, praticamente non avviene nessuna elaborazione. La combinazione suggerita dall'autore è 12 rounds con una chiave da 128-bit blocchi da 64 bytes.
Una delle operazioni centrali dell'RC5 consiste in una traslazione di un numero di bit dipendente dal dato di ingresso; si può anche affermare che il cifrario stesso nacque proprio per studiare le proprietà crittografiche di questa operazione. In ogni ciclo si effettuano anche operazioni di OR esclusivo e somme in modulo, organizzate in una rete di Feistel.
La caratteristica principale di RC5, è quella di essere un algoritmo orientato all'architettura del computer sul quale è in esecuzione; in particolare, tutte le elaborazioni sono effettuate su stringhe di lunghezza pari a quella della "word" della macchina; ossia dipendente dall’architettura del computer su cui sta girando il cifrario, con i risultanti vantaggi in termine di prestazioni (le operazioni su stringhe di lunghezza pari a quella della "word" del computer, richiedono meno cicli macchina).
Un’altra caratteristica, è che usa istruzioni "base", comuni alla maggior parte dei processori, in quanto opera su dati allineati alla "word", anche se la stessa può essere di lunghezza diversa (come già detto, la lunghezza di una "word", può variare in funzione dell'architettura del computer), ed anche rotazioni data-dependant (ovvero, shifting della stringa di bit).
È un algoritmo che usa poca memoria, quindi adatto per dispositivi quali le smart card, ed è semplice da analizzare ed implementare; infatti l’RC5 è stato utilizzato in diversi prodotti, ad es. BSAFE, JSAFE, S/MAIL.
Dobbiamo anche ricordare che RC5 si basa su una macchina con un’architettura little-endian (ovvero, tipicamente Processori Intel); in realtà può funzionare anche su una macchina con architettura big-endian (ovvero, tipicamente Processori Motorola), ma il procedimento d’espansione della chiave ha bisogno di alcune modifiche.
L’architettura che noi considereremo è la little-endian.
Si può affermare che RC5 è una famiglia di cifrari che dipendono dai parametri w/r/b; laddove:
w - denota la lunghezza della word della macchina (32, 64, 128 bit), ovvero la dimensione del blocco.
In realtà è il cifrario che cifra 2 word di lunghezza w, ottenendo come cifrato 2 word di lunghezza w; w può essere la lunghezza di una word 16, 32, 64 bit, quindi, per l’architettura a 16 bit, funziona su parola a 16 bit, cifrando un blocco di 2w (2*16) alla volta.
Per architetture a 32 bit, la dimensione del blocco è di 64 bit (2*32), per l’architettura a 64 bit la dimensione del blocco è 128 (2*64).
Per questo prima abbiamo sostenuto che la dimensione del blocco è 32, 64, 128 bit, ma in realtà sono trattate come 2 word dove la lunghezza della word è un parametro del cifrario.
r - è il numero di round che varia da 0 a 255.
Ci sarà una prima fase che sarà differente da tutte le altre, dopodiché gli r round sono tutti uguali.
Ogni round utilizzerà 2 sottochiavi; in totale, dalla chiave iniziale, saranno generate 2 sottochiavi per ogni round, quindi 2r, e 2 per la fase iniziale.
Pertanto, in totale saranno generate 2r+2 sottochiavi.
b - è il numero di bytes, che varia da 0 a 255.
Quando vedremo la fase di schedulazione della chiave, noteremo che, dalla chiave composta di b bytes, che varia da 0 a 255, saranno prodotte 2r+2 sottochiavi, ed ogni sottochiave è una parola di w bit.
In generale, quando si dice
RC5 w/r/b
significa che si sta indicando il cifrario RC5 che lavora su 2 parole di w bit con un numero di round pari ad r e con una chiave lunga b bytes.
Le operazioni su RC5 sono tutte orientate alla parola macchina, sono quindi tutte operazioni di w bit, e sono le seguenti:
La prima operazione da vedere è la schedulazione della chiave. Partiamo da una chiave di b bytes, dove b è un parametro di RC5. Immaginiamo che questi b bytes siano memorizzati nell’array K; quindi abbiamo
K[0,….,b-1]
A partire da questa chiave devo produrre un altro array che è l’array S (array delle sottochiavi), perché in totale mi servono 2r+2 sottochiavi; quindi abbiamo
S[0,….,2r+1]
In effetti, per produrre questo array S che verrà poi usato nella fase di cifratura, devo effettuare una conversione dai bytes per ottenere delle word, dopodiché su queste word svolgerò delle operazioni per andare ad aggiornare il contenuto di questo array S (Mixing Function).
Questo array intermedio è l’array L, array di word, che si ottiene dall’array K di bytes. Su una macchina ad architettura little-endian stiamo semplicemente copiando il contenuto dell’array K nell’array L; in totale, L avrà c locazioni, dove c= .
Nel caso 8b non dovesse essere un multiplo di w, aggiungiamo degli zeri per fare il padding.
L’algoritmo di schedulazione della chiave è diviso in 2 fasi:
In pratica, l’array S che era stato inizializzato con le costanti Pw e Qw, subisce degli aggiornamenti che dipendono dall’array L, array di c word ottenuto dalla chiave iniziale. Il risultato finale equivale ad un array S aggiornato, array di 2r+2 locazioni, ognuna di w bit. Quindi, la fase di schedulazione della chiave prende in input una chiave di b bytes e produce 2r+2 sottochiavi, ognuna di w bit.
La fase di cifratura parte da un blocco di 2 parole di w bit e produce un altro blocco di 2 parole di w bit, tramite r round. Ogni round userà 2 chiavi schedulate e poi vi è un round iniziale che usa altre 2 sottochiavi, per un totale di 2r+2.
Nell’algoritmo, in pratica, sono svolte operazioni di somma su word di w bit, operazioni di X-Or e shift circolari data-dependant. Il testo in chiaro è memorizzato nelle 2 word A e B, ognuna di w bit e l’output sarà ancora memorizzato nelle 2 word A e B, utilizzando l’array S con 2r+2 sottochiavi schedulate.
Si aggiorna A con la prima sottochiave e B con la seconda sottochiave (abbiamo usato già 2 sottochiavi), dopodiché ci sono r round, in cui vengono usate 2 diverse sottochiavi schedulate S[2i] e S[2i+1] (abbiamo usato altre 2r sottochiavi); nel round si esegue prima l’X-Or bit a bit tra A e B, poi si esegue uno shift di B, e poi si esegue una somma con la chiave schedulata S[2i] ed andando ad aggiornare A.
Inoltre, nel round si esegue anche un X-Or bit a bit tra B ed A, poi si esegue uno shift a sinistra che dipende dal valore di A, ed infine una somma con la sottochiave S[2i+1], aggiornando il valore di B.
A differenza di DES e dei cifrari di Feistel, nell’RC5 entrambe le metà sono aggiornate nel round sia la parte A sia la parte B, mentre nei cifrari di Feistel un pezzo era ricopiato e si aggiornava mezza parte del blocco. La decifratura è perfettamente l’inversione della cifratura: infatti, sono svolti prima gli r round a partire dall’ultimo al 1° e gli ultimi 2 aggiornamenti. Le operazioni nella decifratura sono sottrazioni di word di w bit, X-Or bit a bit e shift a destra che dipendono dai valori A o B.
Le caratteristiche salienti di RC5 sono: