2012-11-21 15 views
12

Sto tentando di implementare PKI. Voglio cifrare una grande stringa usando RSA in java senza usare il castello gonfiabile. Il problema che sto ottenendo è che i dati non devono essere più lunghi di 117 byte. Ho provato a cercare la soluzione in cui ho fallito. Sono novizio in questa crittografia. Per favore aiutatemi dando una grande stringa come esempio e spiegatela.Cifra e decrittografa la stringa di grandi dimensioni in java utilizzando RSA

+2

La sicurezza, e in particolare la crittografia, è ** difficile **. Dovresti utilizzare i pacchetti di alto livello esistenti anziché le API crittografiche crude o imparare i dettagli di come funzionano. In caso contrario, è probabile che si scriva codice non sicuro. – SLaks

+1

pacchetti di alto livello significa? –

+1

per favore pubblica il tuo codice. possiamo lavorare da lì. – Frank

risposta

25

Non è possibile utilizzare una decifratura della crittografia RSA su più di circa 128 byte alla volta. È necessario dividere i dati e farlo in un ciclo praticamente scrivendo i byte su String/Array man mano che si procede. Se il tuo unico problema è la dimensione dei dati, probabilmente non hai molto altro da fare. Basta dividere i dati.

Un grande esempio, forse più completo per voi, che fare con le stringhe di dimensioni superiori a 128 byte: http://coding.westreicher.org/?p=23

Se avete bisogno di ulteriori spiegazioni sulla cifratura RSA in generale:

Il seguente codice mostra come utilizzare KeyPairGenerator per generare una coppia di chiavi RSA in Java:

// Get an instance of the RSA key generator 
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
// Generate the keys — might take sometime on slow computers 
KeyPair myPair = kpg.generateKeyPair(); 

questo vi darà un oggetto coppia di chiavi, che detiene due chiavi: una privata e una publ circuito integrato. Per poter utilizzare queste chiavi, è necessario creare un oggetto Cipher, che verrà utilizzato in combinazione con SealedObject per crittografare i dati che si intende terminare sulla rete. Ecco come lo fai:

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher c = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key 
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic()); 

Dopo aver inizializzato il Cipher, siamo pronti per crittografare i dati. Poiché dopo la crittografia i dati risultanti non avranno molto senso se li vedi "nudi", dobbiamo incapsularli in un altro oggetto. Java fornisce questo, dalla classe SealedObject. SealedObjects sono contenitori per oggetti crittografati, che crittografano e decodificano il loro contenuto con l'aiuto di un oggetto Cipher.

Il seguente esempio illustra come creare e crittografare il contenuto di un SealedObject:

// Create a secret message 
String myMessage = new String("Secret Message"); 
// Encrypt that message using a new SealedObject and the Cipher we created before 
SealedObject myEncryptedMessage= new SealedObject(myMessage, c); 

L'oggetto risultante possono essere inviati attraverso la rete senza timore, poiché è crittografato. L'unico che può decifrare e ottenere i dati, è quello che detiene la chiave privata. Normalmente, questo dovrebbe essere il server. Per decifrare il messaggio, è necessario reinizializzare l'oggetto Cipher, ma questa volta con una modalità diversa, decrittografare e utilizzare la chiave privata anziché la chiave pubblica.

Questo è il modo di fare questo in Java:

// Get an instance of the Cipher for RSA encryption/decryption 
Cipher dec = Cipher.getInstance("RSA"); 
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key 
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate()); 

Ora che il Cipher è pronto a decifrare, dobbiamo dire al SealedObject per decifrare i dati conservati.

// Tell the SealedObject we created before to decrypt the data and return it 
String message = (String) myEncryptedMessage.getObject(dec); 
System.out.println("foo = "+message); 

Attenzione quando si utilizza il metodo GetObject, dal momento che restituisce un'istanza di un oggetto (anche se in realtà è un esempio di stringa), e non un'istanza della classe che era prima della crittografia, in modo da' Dovremo lanciarlo nella sua forma precedente.

Quanto sopra è da: http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

6

RSA non è inteso per la cifratura dei dati bulk. Invece, usa un codice simmetrico, come AES, per crittografare la tua "stringa grande". Quindi, crittografare la chiave simmetrica utilizzata per AES con la chiave RSA.

BouncyCastle supporta due protocolli per questo scopo: S/MIME e PGP. Tutti i protocolli sensibili sulla privacy utilizzano algoritmi asimmetrici per il trasporto di chiavi o lo scambio di chiavi in ​​questo modo.

La dimensione del messaggio che può essere crittografata con RSA dipende dal modulo della chiave, meno alcuni byte necessari per il riempimento sicuro del messaggio.

+0

La crittografia ibrida come questa è la strada da percorrere. – CodesInChaos

+14

Un esempio di codice o un collegamento all'API pertinente non farebbe male. – CodesInChaos

Problemi correlati