Crittografia RSA, ottenendo cattivo lunghezza
-
19-09-2019 - |
Domanda
Quando si chiama la seguente funzione:
byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);
Ora sto ottenendo l'errore: bad lunghezza.
Con una stringa più piccola funziona, tutte le idee che cosa il problema potrebbe essere la stringa sto passando è meno di 200 caratteri.
Soluzione
RSA crittografia è significa solo per piccole quantità di dati, la quantità di dati è possibile crittografare dipende dalla dimensione della chiave che si sta utilizzando, ad esempio per 1024 bit RSA chiavi, e PKCS # 1 V1.5 imbottitura, è possibile crittografare 117 byte al massimo, con una chiave RSA 2048, è possibile crittografare 245 byte.
C'è una buona ragione per questo, la crittografia asimmetrica è computazionalmente costoso. Se si desidera crittografare grandi quantità di dati si dovrebbe utilizzare la crittografia simmetrica. Ma cosa succede se si vuole non ripudio? Ebbene quello che poi fare è utilizzare entrambi. Si crea una chiave simmetrica e scambiare utilizzando la crittografia asimmetrica, che poi in modo sicuro scambiati chiave simmetrica per crittografare i grandi quantità di dati. Questo è ciò che SSL e l'uso WS-Secure sotto le coperte.
Altri suggerimenti
Per le future ricerche in materia di RSA eccezioni male lunghezza ...
È possibile calcolare il numero massimo di byte che possono essere crittografati con una particolare dimensione della chiave con il seguente:
((KeySize - 384) / 8) + 37
Tuttavia, se l'ottimale asimmetrica crittografia imbottitura (OAEP) parametro è vero, come è nel post originale, il seguente può essere utilizzato per calcolare il byte max:
((KeySize - 384) / 8) + 7
Le dimensioni delle chiavi legali 384 thru 16384 con una dimensione di salto 8.
Come spiegato in precedenza, la soluzione per le eccezioni 'lunghezza cattivo' tipo è quello di ibridare l'uso della crittografia simmetrica e asimmetrica, in modo che la dimensione del testo che si sta cifrando non è vincolato dalla dimensione della chiave. Che, fondamentalmente, utilizza la crittografia RSA per crittografare in modo asimmetrico il chiave casuale .
Per la crittografia:
Generare una chiave casuale della lunghezza richiesta per tecnica di cifratura simmetrica come AES o Rijndael.
Simmetricamente crittografare il testo / dati utilizzando AES / Rijndael con il tasto casuale generato nel passaggio 1.
Utilizzando RSA, asimmetricamente cifrare la chiave casuale generato nel passaggio 1.
Per decrittazione:
Per prima decifrare la chiave casuale AES / Rijndael generati utilizzando la chiave privata RSA.
Poi decifrare il testo originale / dati utilizzando la chiave casuale RSA-decifrati
Per una dimostrazione, si potrebbe desiderare di avere uno sguardo questa seguente esempio in C #:
http: / /www.technical-recipes.com/2013/using-rsa-to-encrypt-large-data-files-in-c/