2009-09-30 16 views
41

Quando si chiama la seguente funzione:crittografia RSA, ottenendo cattivo lunghezza

byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true); 

Ora sto ottenendo l'errore: bad lunghezza.

Con una stringa più piccola funziona, qualsiasi idea quale sia il problema potrebbe essere la stringa che sto passando è inferiore a 200 caratteri.

risposta

58

La crittografia RSA è solo media per piccole quantità di dati, la quantità di dati che è possibile crittografare dipende dalla dimensione della chiave che si sta utilizzando, ad esempio per le chiavi RSA a 1024 bit e PKCS # 1 riempimento V1.5 , è possibile crittografare al massimo 117 byte, con una chiave RSA 2048, è possibile crittografare 245 byte.

C'è una buona ragione per questo, la crittografia asimmetrica è computazionalmente costosa. Se si desidera crittografare grandi quantità di dati, si dovrebbe utilizzare la crittografia simmetrica. Ma cosa succede se vuoi il non ripudio? Bene, allora quello che fai è usare entrambi. Si crea una chiave simmetrica e la si scambia utilizzando la crittografia asimmetrica, quindi quella chiave simmetrica scambiata in modo sicuro per crittografare le grandi quantità di dati. Questo è ciò che SSL e WS-Secure sono sotto le copertine.

+0

Sai fuori mano ciò .net oppongo dovrei usare per crittografare le stringhe fino a 500 caratteri? –

+0

Qualsiasi degli algoritmi simmetrici. Dipende dallo scopo per cui vuoi crittografarlo. Probabilmente è meglio esprimerla come un'altra domanda. – blowdart

+2

Non è solo che è estensivo dal punto di vista computazionale. L'algoritmo RSA crittografa un numero specifico, producendo un altro numero. A causa del modo in cui l'algoritmo funziona, c'è una dimensione massima per quel numero. Più è ampia la chiave, maggiore è il numero massimo che può crittografare. Una chiave a 1024 bit è larga 128 byte e una chiave a 2048 bit è 256 byte. Ognuno può crittografare un numero con una larghezza massima un po 'inferiore alla sua larghezza. Se il numero di input è troppo grande, l'output sarà lo stesso della crittografia di un altro numero compreso nell'intervallo e non è possibile stabilire quale sia l'input effettivo. –

35

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 cifratura asimmetrica imbottitura (OAEP) parametro è vero, come è nel post originale, può essere utilizzato per calcolare il byte max seguente:

((KeySize - 384)/8) + 7

Le dimensioni di chiavi legali 384 thru 16384 con una dimensione di salto 8.

15

Come spiegato sopra, la soluzione ai eccezioni 'lunghezza cattivo' tipo è da ibridare l'uso della crittografia simmetrica e asimmetrica, in modo che la dimensione del testo che stai crittografando non è vincolata dalla dimensione della chiave. Fondamentalmente usi la crittografia RSA per crittografare asimmetricamente la chiave casuale .

For encryption:

  1. Generate a random key of the length required for symmetrical encryption technique such as AES or Rijndael.

  2. Symmetrically encrypt your text/data using AES/Rijndael using the random key generated in step 1.

  3. Using RSA, asymmetrically encrypt the random key generated in step 1.

For decryption:

  1. First decrypt the AES/Rijndael-generated random key using your private RSA key.

  2. Then decrypt the original text/data using the RSA-decrypted random key

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/

Problemi correlati