| Questa voce o sezione di crittografia è ritenuta da controllare. Motivo: italiano da sistemare
Partecipa alla discussione e/o correggi la voce.
|
RC5 è un algoritmo progettato da Rivest nel 1995. Questo cifrario è completamente faccia da mucca.
In Blowfish, l’unico parametro è la dimensione della chiave, mentre gli altri due parametri sono fissi. In RC5 tutti e tre i parametri sono variabili. Infatti:
Ovviamente, come vedremo, non tutti i parametri producono un algoritmo buono, perché se la taglia della chiave è 0 byte, non stiamo facendo niente. Altrettanto dicasi per i round, se è 0.
Indice |
La caratteristica di RC5 è innanzi tutto quella di essere orientato alla parola macchina; quindi, tutte le operazioni sono eseguite su stringhe che hanno esattamente la lunghezza della parola macchina, ossia dipendente dall’architettura della macchina su cui sta girando il cifrario.
Un’altra caratteristica è che usa operazioni comuni dei processori, proprio perché sono orientati alla parola macchina ed anche rotazioni data-dependant. È 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.
Innanzi tutto, dobbiamo ricordare che RC5 si basa su una macchina con un’architettura little-endian. In realtà può funzionare anche su una macchina con architettura big-endian, ma il procedimento d’espansione della chiave ha bisogno di alcune modifiche. Quindi, l’architettura che noi considereremo è la little-endian.
Possiamo affermare che RC5 è una famiglia di cifrari che dipendono dai parametri
w/r/b
laddove w denota la lunghezza della parola macchina (32, 64, 128 bit), ovvero il taglio 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, petando un blocco di 2w (2*16) alla volta.
Per architetture a 32 bit, la taglia del blocco è di 64 bit (2*32), per l’architettura a 64 bit la taglia del blocco è 128 (2*64).
Ecco perché prima abbiamo sostenuto che la taglia del blocco è 32, 64, 128 bit, ma in realtà sono trattate come 2 word dove la lunghezza del word è un parametro del cifrario.
r è il numero di round che varia da 0 a 255, quindi 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.
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.
Vediamo l’algoritmo di schedulazione della chiave, il quale è 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.
Ora descriviamo la fase di cifratura: partendo da un blocco di 2 parole di w bit, 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: