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.