Lunghezza chiave cifratura e bit di crittografia

4

Sto cercando di aggiungere funzionalità di crittografia a uno script PHP, modellato su un'applicazione C # esistente.

L'app C # utilizza l'algoritmo Rijndael con il costruttore predefinito. Da questo sono in grado di determinare che ha una dimensione della chiave di 256 e una dimensione del blocco di 128.

Non sono sicuro di selezionare il codice appropriato per la funzione mcrypt di php. L' elenco di codici mostra:

MCRYPT_RIJNDAEL_128
MCRYPT_RIJNDAEL_192
MCRYPT_RIJNDAEL_256

Ma non sono sicuro che il numero finale si riferisca alla lunghezza della chiave, al numero di bit usati nella crittografia o se siano uno nella stessa.

Quale cifratura dovrei usare per abbinare la funzionalità esistente? Quando provo 256 ottengo l'errore "The IV parameter must be as long as the blocksize" . Se provo 128, i tasti risultanti non corrispondono (anche se ho il sospetto che sia ancora un errore con qualcosa di diverso dalla selezione del cipher).

Ci scusiamo per la natura di base della domanda, sarebbe d'aiuto avere qualche spiegazione laica.

    
posta JYelton 26.01.2012 - 19:43
fonte

1 risposta

3

Rijndael è un cifrario a blocchi versatile che può funzionare con blocchi di dimensioni 128, 192 o 256 bit, e con chiavi di 128, 192 o 256 bit. Sono possibili tutte e nove le combinazioni.

Nel 2001, nell'ambito di una competizione aperta durata tre anni, Rijndael è stata scelta per diventare lo "Advanced Encryption Standard" federale statunitense, ovvero AES; ma solo con una dimensione di blocco di 128 bit. Quindi ci sono esattamente tre versioni di AES, tutte con un blocco di 128 bit e con chiavi di 128, 192 o 256 bit.

Pertanto, mentre Rijndael supporta formalmente blocchi di 192 o 256 bit, è usato molto raramente in questo modo; è quindi altamente plausibile che MCRYPT_RIJNDAEL_256 in realtà significhi "Rijndael con una dimensione di blocco di 128 bit e una chiave di 256 bit (nota anche come 'AES-256')".

Il Vettore di inizializzazione (IV) è un pezzo di dati che deve essere utilizzato come parametro per la modalità di crittografia; nel tuo codice, sembra che usi CBC, quindi l'IV deve avere la stessa lunghezza della dimensione del blocco (128 bit, ovvero 16 byte).

Vedo che stai cercando di utilizzare PBKDF1. Questa è una vecchia funzione di derivazione della chiave che è limitata in diversi modi, inclusa la sua incapacità di produrre più di 20 byte. Ti sarà difficile ottenere 32 byte di chiave e 16 byte di IV ouf di PBKDF1 ... Ti suggerisco di passare a PBKDF2, definito anche in RFC 2898 , implementato in C # da Rfc2898DeriveBytes e in grado di generare quanti più byte hai bisogno.

Si noti che PBKDF2 (e PBKDF1, ad esempio) utilizzano alcuni parametri configurabili, come un "conteggio di iterazioni" o il nome della funzione di hash sottostante. Devi fare attenzione ad usare gli stessi identici parametri nel codice PHP e nel codice C #, altrimenti non otterrai le stesse chiavi e IV, e la decifrazione fallirà.

    
risposta data 26.01.2012 - 20:43
fonte

Leggi altre domande sui tag