2009-07-29 14 views
39

Sono nuovo alla crittografia. Devo implementare un algoritmo di crittografia asimmetrica, che penso utilizzi una chiave privata/pubblica. Ho iniziato a utilizzare un campione di RSACryptoServiceProvider. era ok con piccoli dati da crittografare. Ma quando lo si utilizza su dati relativamente più grandi "2 righe", ottengo l'eccezione CryptographicException "Bad Length"!come utilizzare RSA per crittografare i file (dati enormi) in C#

//Create a new instance of RSACryptoServiceProvider. 
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) 
{ 

    //Import the RSA Key information. This only needs 
    //toinclude the public key information. 
    //RSA.ImportParameters(RSAKeyInfo); 
    byte[] keyValue = Convert.FromBase64String(publicKey); 
    RSA.ImportCspBlob(keyValue); 

    //Encrypt the passed byte array and specify OAEP padding. 
    //OAEP padding is only available on Microsoft Windows XP or 
    //later. 
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding); 
} 

Poi ho trovato alcuni campioni di cifratura dei dati di grandi dimensioni (o file) utilizzando CryptoStream, e solo utilizzare algoritmi simmetrici come DES o 3DES, che hanno la funzione CreateEncryptor per restituire ICryptoTransform come uno degli ingressi al costruttore di CryptoStream !!!

CryptoStream cStream = new CryptoStream(fStream, 
       new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV), 
       CryptoStreamMode.Write); 

Qual è il modo di crittografare i file utilizzando RSA?

+15

Gli algoritmi privati ​​/ pubblici non sono adatti per crittografare i dati di grandi dimensioni. In pratica vengono utilizzati per scambiare una chiave privata segreta tra le due parti che verranno utilizzate per crittografare/decifrare simmetricamente i dati di grandi dimensioni. –

risposta

32

Come detto in altre risposte crittografia asimmetrica è previsto soltanto per la crittografia dei dati più piccoli di quello che è la dimensione della chiave.

Un'opzione che ho implementato quando è necessario trasferire grandi quantità di dati crittografati tra due sistemi è di avere una coppia di chiavi RSA la cui chiave pubblica è nota sia al mittente che al ricevente, quindi quando i dati devono essere inviati il ​​ricevitore genera una nuova coppia di chiavi RSA, crittografa la chiave pubblica di quella coppia di chiavi con la chiave pubblica comune e invia la chiave pubblica crittografata al mittente. Il mittente decrittografa la chiave pubblica del ricevitore utilizzando la sua chiave privata (che il destinatario non ha bisogno di sapere, proprio come il mittente non ha bisogno di conoscere la chiave privata generata dai ricevitori), genera una chiave di crittografia simmetrica, crittografa i dati con la chiave simmetrica e quindi crittografa la chiave simmetrica usando la chiave pubblica ricevuta dal ricevitore.Sia la chiave simmetrica crittografata che i dati crittografati vengono quindi inviati al destinatario che utilizza la propria chiave privata generata per decrittografare la chiave simmetrica e quindi decrittografare i dati.

È possibile utilizzare i metodi RSACryptoServiceProvider.ToXMLString() e RSACryptoServiceProvider.FromXMLString() per memorizzare la chiave pubblica comune come stringa letterale XML nell'applicazione di ricezione.

Non dimenticare, quando si genera la chiave di crittografia simmetrica per utilizzare RNGCryptoServiceProvider() per generare la chiave in quanto è un metodo molto più sicuro di generazione di numeri casuali (pseudo).

Inoltre, consiglio vivamente di non utilizzare 3DES come algoritmo di crittografia simmetrica, è vecchio e inizia a mostrare la sua età. Utilizzare la crittografia simmetrica AES con le classi AesCryptoServiceProvicer o RijndaelManaged.

19

In genere, RSA viene utilizzato solo per trasferire una chiave simmetrica (ad esempio all'inizio dello stream) e quindi i dati di massa vengono crittografati con quella chiave.

La crittografia asimmetrica non è abbastanza efficiente per trasferire molti dati.

6

Le implementazioni .NET di RSA (e tutti gli algoritmi di chiave pubblica/privata) non supportano grandi blocchi di dati, perché questo non è l'obiettivo della chiave pubblica/privata.

Invece quello che dovresti fare è generare una nuova chiave simmetrica e usarla per crittografare i dati. Quindi si utilizza la chiave pubblica/privata per crittografare la chiave simmetrica e scambiarla con l'altra parte in modo sicuro. Quindi decodificano la chiave simmetrica e la usano per decrittografare i dati.

56

RSA può cifrare solo i blocchi di dati che sono più corti rispetto alla lunghezza della chiave in modo da quello che normalmente è

  1. generare una chiave casuale della lunghezza corretta necessaria per AES (o simili).
  2. crittografare i dati utilizzando AES o simili che utilizzano la chiave
  3. crittografare la chiave casuale utilizzando la RSA chiave

Poi si pubblicano sia le uscite 2 e 3

Per decifrare

  1. Decifra la chiave AES utilizzando la chiave RSA.
  2. decrittografare i dati utilizzando tale chiave AES
+0

Se si esegue questa operazione, gli unici che possono decrittografare i dati sono quelli che possiedono la chiave privata dalla propria coppia di chiavi RSA. –

+24

Sì, certo, non è questo il punto di crittografia in realtà? – jcoder

18

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, il seguente può essere utilizzata per calcolare il byte max:

((KeySize - 384)/8) + 7

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

1

abbiamo:

MaxBlockSize=((KeySize - 384)/8) + 37 

O

MaxBlockSize=((KeySize - 384)/8) + 7 

così, si può dividere i dati di alcuni blocchi e quindi criptare ciascuno e quindi unirli

Problemi correlati