2014-04-23 8 views
7

Il campo AesCryptoServiceProvider.LegalKeySizes mostra le dimensioni consentite in bit.Le dimensioni della chiave legale AES sono davvero il limite?

Tuttavia, ciò che non capisco è se questi sono veri, come sono in grado di utilizzare correttamente una lunghezza della chiave di 2048 bit (256 byte)?

Suppongo che la mia vera domanda è, la mia chiave viene prodotta nella dimensione richiesta (maggiore di 32 byte max), ma solo i primi 32 byte (256 bit) vengono effettivamente presi nel processo di crittografia/decrittografia, rendering la dimensione della chiave più grande è uno spreco di spazio?

Non so se c'è un modo di dire in realtà da ciò che è esposto nel API ...

Qualche idea? Forse lo sto guardando nel modo sbagliato?

+3

'(nuovo AesCryptoServiceProvider()). Chiave = nuovo byte [256];' -> "CryptographicException: la chiave specificata non è una dimensione valida per questo algoritmo." - Puoi mostrare il codice che stai utilizzando con una chiave da 256 byte? – Blorgbeard

+0

Ho scritto una risposta diretta ma sono d'accordo con Blorgbeard su questo, non vedo come 'AesCryptoServiceProvider' possa essere usato con qualsiasi dimensione di chiave diversa dalle dimensioni della chiave" legale ". Detto questo, i documenti di Mickeysoft sono - di nuovo - abbastanza vaghi da non specificare eventuali errori che potrebbero sorgere. –

+1

Se si imposta prima la dimensione della chiave a 256, quindi si genera una chiave, l'API produce una chiave da 256 byte senza errori e consente di utilizzarla nel modo corretto senza errori. Ho scritto un'intera libreria di classi funzionali che utilizza una dimensione chiave di 256 byte per AES e RSA/AES ibrido per vedere se avrebbe funzionato durante la scrittura di programmi su più piattaforme. E fa ... solo la spiegazione 8 che i tasti legali sono sbagliati o che la maggior parte della chiave non viene utilizzata. Sono incline a credere a quest'ultimo. – SteakNinja

risposta

5

AES può essere utilizzato per 3 dimensioni chiave: 128, 192 e 256 bit. Fondamentalmente se si è in grado di usare chiavi più grandi di 256 bit, allora la libreria è "mentire a voi", cioè alcuni bit della chiave più grande vengono scartati o compressi in qualche modo. Ad esempio, PHP mcrypt riduce semplicemente la dimensione della chiave alla dimensione massima possibile.

I "semi" di chiavi più grandi sono piuttosto comuni nel mondo della crittografia. Ad esempio Diffie-Hellman - un algoritmo di accordo chiave - di solito genera un segreto più grande della dimensione della chiave richiesta. Quindi, la domanda di che estrae (concentrando) la quantità di entropia in una chiave spesso si pone. Se i bit vengono troncati, l'entropia in questi bit viene scartata.

Quindi ciò che viene effettivamente utilizzato nella crittografia moderna è un KDF, una funzione di derivazione chiave. Se l'input - the seed - è una password, è necessario utilizzare un PBKDF (KDF basato su password). I moderni PBKDF sono PBKDF2, bcrypt, scrypt e Argon2.

Se l'input è già una chiave - i dati che forniscono un'entropia sufficiente (casualità) se presi insieme - è necessario utilizzare un KBKDF (Key Based KDF). Un KBKDF moderno è ad esempio HKDF. Si noti che questi algoritmi richiedono input aggiuntivi, quindi se non vengono forniti dati aggiuntivi è molto probabile che i bit chiave extra vengano semplicemente ignorati.

La forza crittografica di AES-128 è e rimane 128 bit, naturalmente. Finché questi bit sono indistinguibili da un utente malintenzionato, AES-128 should provide enough security for practical needs. AES-256 potrebbe essere usato se si temono scoperte nella crittografia quantistica.


Quindi per la risposta: "sono AES dimensioni delle chiavi di legge davvero il limite?" la risposta è un clamoroso . Le dimensioni delle chiavi a 2048 bit si trovano più comunemente per algoritmi asimmetrici come RSA/DSA. Per RSA e DSA la dimensione della chiave è in realtà piuttosto bassa, anche se dovrebbe essere ancora irraggiungibile per attacchi pratici. Forse il testo cifrato è stato crittografato utilizzando hybrid encryption.

+0

Ok, quindi i byte extra vengono sicuramente ignorati? Forse potrei trovare un test per dimostrarlo ... forse generare una chiave più grande, quindi cifrare separatamente sia a grandezza intera che massima dimensione legale (stesso sale del corso) e vedere se il testo cifrato è lo stesso? – SteakNinja

+0

Non penso che vengano ignorati se si utilizza direttamente 'AesCryptoServiceProvider'. Il codice sarebbe bello, sì! Probabilmente indicherà un bug, per favore includi API e informazioni di runtime se decidi di postarlo (nella domanda, per favore). –

+0

Ok ho notato che la documentazione indica che la variabile per l'impostazione di keysize è in bit. Se questo è vero perché l'API restituirà la quantità di byte inserita? 'AES.KeySize = Xbits;' ma KeyProduced = Xbytes ... – SteakNinja

1

È possibile utilizzare larger key sizes with Rijndael, l'algoritmo di crittografia su cui è basato AES, in genere fino a un limite definito dalla libreria. Tuttavia, è possibile utilizzare solo le dimensioni della chiave di 128, 192 o 256 bit con AES. Alcune implementazioni possono usare i primi X bit (dove è la dimensione della chiave di 128, 192 o 256 bit) di un array o flusso di bit di byte (di solito quelli C/C++) ma le implementazioni di .Net Base Class Library (BCL) non , come @Blorgbeard cita nel suo commento.

Edit: Per chiarire la relazione tra Rijndael e AES, AES è una specifica creata dalla US National Institute of Standards and Technology (NIST) (FIPS 197 per essere precisi) che definisce un sottoinsieme di Rijndael.AES è incluso in FIPS 140-2, il che significa che è approvato per determinati usi dai dipartimenti governativi degli Stati Uniti.

+1

"base" può utilizzare alcuni chiarimenti qui - AES è identico a Rijndael, tranne che con dimensioni chiave/blocco limitate. –

+0

Non è possibile usare una dimensione della chiave * più grande * di 256 bit anche con Rijndael, Rijndael usa chiavi 128, 160, 192, 224 o 256 bit, tuttavia le implementazioni di Rijndael spesso implementano solo i tasti di AES. –