Szyfruj i odszyfruj duży ciąg znaków w Javie za pomocą RSA

Próbuję zaimplementować PKI. Chcę zaszyfrować duży ciąg używając RSA w Javie bez używania bouncy castle. Problem, który otrzymuję, to dane nie mogą być dłuższe niż 117 bajtów. Próbowałem seaching dla rozwiązania, gdzie zawiodłem. Jestem nowicjuszem w tym szyfrowaniu. Proszę o pomoc, podając jako przykład duży ciąg znaków i wyjaśniając to.

Author: Mahesh Vemuri, 2012-11-21

2 answers

Nie można używać szyfrowania RSA na więcej niż 128 bajtów na raz. Musisz podzielić Dane i zrobić to w pętli prawie zapisując bajty do String / Array jak idziesz. Jeśli twoim jedynym problemem jest rozmiar danych, prawdopodobnie nie masz wiele więcej do zrobienia. Dzielę dane.

Świetny przykład, być może bardziej kompletny dla Ciebie, dotyczący łańcuchów większych niż 128 bajtów: http://coding.westreicher.org/?p=23

Jeśli potrzebujesz więcej Wyjaśnienie na temat szyfrowania RSA w ogóle:

Poniższy kod pokazuje jak używać KeyPairGenerator do generowania pary kluczy RSA w Javie:

// 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();

To da Ci obiekt KeyPair, który posiada dwa klucze: prywatny i publiczny. Aby skorzystać z tych kluczy, musisz utworzyć obiekt szyfrujący, który będzie używany w połączeniu z SealedObject do szyfrowania danych, które zamierzasz zakończyć w sieci. Oto jak to zrobić:

// 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()); 

Po inicjując szyfr, jesteśmy gotowi do zaszyfrowania danych. Ponieważ po zaszyfrowaniu wynikowe dane nie będą miały większego sensu, jeśli zobaczysz je "nago", musimy je zamknąć w innym obiekcie. Java dostarcza to przez klasę SealedObject. SealedObjects to kontenery dla zaszyfrowanych obiektów, które szyfrują i odszyfrowują ich zawartość za pomocą zaszyfrowanego obiektu.

Poniższy przykład pokazuje, jak utworzyć i zaszyfrować zawartość obiektu 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);

The wynikowy obiekt może być przesyłany przez sieć bez obaw, ponieważ jest szyfrowany. Jedynym, który może odszyfrować i uzyskać dane, jest ten, który posiada klucz prywatny. Normalnie powinien to być serwer. Aby odszyfrować wiadomość, musimy ponownie zainicjować obiekt szyfrujący, ale tym razem w innym trybie, odszyfrować i użyć klucza prywatnego zamiast klucza publicznego.

Tak to się robi w Javie:

// 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());

Teraz, gdy szyfr jest gotowy do odszyfrowania, musimy powiedzieć obiekt SealedObject do odszyfrowywania przechowywanych danych.

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

Uważaj, gdy używasz metody getObject, ponieważ zwraca instancję obiektu (nawet jeśli jest to rzeczywiście instancja String), a nie instancję klasy, którą była przed szyfrowaniem, więc będziesz musiał przenieść ją do poprzedniej postaci.

Powyższy cytat pochodzi ze strony: http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

 26
Author: msj121,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-01 15:54:53

RSA nie jest przeznaczony do szyfrowania zbiorczego danych. Zamiast tego użyj symetrycznego szyfru, takiego jak AES, aby zaszyfrować swój "duży ciąg". Następnie Zaszyfruj klucz symetryczny używany w AES za pomocą klucza RSA.

BouncyCastle obsługuje dwa protokoły: S / MIME i PGP. Wszystkie sensowne protokoły prywatności wykorzystują algorytmy asymetryczne do transportu kluczy lub wymiany kluczy w ten sposób.

Wielkość wiadomości, która może być zaszyfrowana za pomocą RSA, zależy od modułu klucza, mniej wymaganych bajtów za bezpieczne wypełnianie wiadomości.

 7
Author: erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-21 20:15:18