Dimensioni chiave e dimensione del blocco: in pratica

4

Ho riscontrato molta confusione tra la dimensione della chiave di crittografia e la dimensione del blocco. Mi sento come se capissi completamente la differenza tra i due, non c'è bisogno di spiegare quello che sono. Ma è quando in pratica mi sento come se i due numeri si confondessero.

Quindi diamo un'occhiata al seguente codice php ...

$encrypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$plaintext,MCRYPT_MODE_CBC,$iv);

... e supponiamo che $iv sia stato creato in modo crittografico sicuro.

Domanda 1)

MCRYPT_RIJNDAEL_128 definisce la dimensione della chiave o la dimensione del blocco?

Domanda 2)

Se avessimo impostato la chiave come:

$key={{eight cryptographically strong characters}};

Il codice riportato sopra sarebbe un'implementazione della crittografia a 64 bit, a causa della chiave con otto caratteri? O sarebbe un'implementazione della crittografia a 128 bit a causa del MCRYPT_RIJNDAEL_128 ?

Domanda 3)

Infine, se invece lo facciamo:

$key={{thirty-two cryptographically strong characters}};

Sarebbe un'implementazione della crittografia a 256 bit o ancora della crittografia a 128 bit? E se 128 bit, vuol dire che una chiave più lunga di 128 bit viene tagliata in qualche modo dall'algoritmo di crittografia?

    
posta rgbflawed 06.10.2014 - 04:59
fonte

2 risposte

4
  1. Dimensione della chiave. Tutte le varianti di codice Rijndale (aka. AES) operano sul testo in chiaro 128 bit alla volta.
  2. Nessun. I tuoi 64 bit di dati chiave verrebbero espansi in una chiave a 128 bit, tramite il padding zero o tramite una funzione di derivazione della chiave. Non sarà così strong come se avessi fornito 128 bit di dati chiave, ma è diverso.
  3. Nessun. I tuoi 256 bit di dati chiave verranno ridotti a una chiave a 128 bit, tramite il troncamento o tramite una funzione di derivazione della chiave. Poiché esiste una chiave lunga da 128 bit che produce la stessa crittografia dei tuoi 256 bit di dati chiave, non ottieni alcuna sicurezza.
risposta data 06.10.2014 - 05:09
fonte
4

Rijndael è una famiglia di nove algoritmi crittografici che offre tutte le combinazioni di dimensioni dei blocchi e dimensioni delle chiavi nel set di 128/192/256-bit. I tre algoritmi con blocchi a 128 bit (e le chiavi di 128, 192 e 256 bit) sono noti collettivamente come AES . Le altre sei combinazioni sono state definite dagli autori di Rijndael, ma sono state molto meno studiate dai crittografi poiché non facevano parte dell'obiettivo della competizione AES.

Ciò che le costanti MCRYPT_RIJNDAEL_* rappresentano sono scarsamente documentate, quindi poco chiare. Questa pagina man su una libreria chiamata "mcrypt" afferma che:

RIJNDAEL: Rijndael is a block cipher, designed by Joan Daemen and Vincent Rijmen, and was approved for the USA's NIST Advanced Encryption Standard, FIPS-197. The cipher has a variable block length and key length. Rijndael can be implemented very efficiently on a wide range of processors and in hardware. The design of Rijndael was strongly influenced by the design of the block cipher Square. There exist three versions of this algorithm, namely: RIJNDAEL-128 (the AES winner) , RIJNDAEL-192 , RIJNDAEL-256 The numerals 128, 192 and 256 stand for the length of the block size.

L'ultima frase sembrerebbe implicare che il "128" sarebbe la dimensione del blocco, non la lunghezza della chiave. Tuttavia, questo sarebbe vero solo nella misura in cui il modulo mcrypt di PHP traduce fedelmente le convenzioni di denominazione della libreria mcrypt sottostante, che non è un dato.

In ogni caso, la documentazione per mcrypt_encrypt() afferma che:

The key with which the data will be encrypted. If it's smaller than the required keysize, it is padded with '%bl0ck_qu0te%'. It is better not to use ASCII strings for keys.

Quindi, se fornisci solo 8 "caratteri forti", questi caratteri vengono in qualche modo convertiti in byte (Rijndael non funziona sui caratteri, funziona su byte) in un modo non specificato, e se questo non produce un numero sufficiente di byte, quindi vengono aggiunti byte aggiuntivi di valore 0. Cosa succede se ci sono troppi byte non specificati (il troncamento è plausibile, ma questo è PHP - tutto può succedere).

Se vuoi davvero utilizzare queste funzioni , dovrai fare alcuni test, confrontando i risultati della crittografia con ciò che un'altra libreria, meglio documentata, produrrebbe (in una lingua in cui i byte sono byte, ad es. C o Java). Tra le cose da testare:

  • Dimensione del blocco e lunghezza della chiave.
  • Conversione di una stringa PHP in byte (in particolare in presenza di caratteri non ASCII).
  • Comportamento sulla mancata corrispondenza della lunghezza della chiave (riempimento, troncamento, ...).

Affidarsi a una funzione così poco documentata per la sicurezza è simile al paracadutismo senza verificare il paracadute. Se, al momento dell'apertura della borsa, il paracadute risulta essere il bucato della tua settimana, allora avrai alcuni secondi per riflettere, mentre cadi liberamente in mezzo a una nuvola in espansione di calzini sporchi, che avresti dovuto essere più cauto.

    
risposta data 06.10.2014 - 15:01
fonte

Leggi altre domande sui tag