Witam forumowiczów.
Na wstępie zaznaczę, że programista ze mnie marny jednak zostałem zmuszony (studia) do rozgryzienia tego problemu.
Potrzebuję pomocy przy wykorzystaniu szyfrowania asymetrycznego RSA. Dokładniej problem w tym, że potrzebuję zaszyfrować ciąg bitów dłuższy niż pozwala na to długość użytego klucza (używam 2048). Szyfrowanie symetryczne nie wchodzi w grę (filozofia programu). Szukałem po różnych zagranicznych forach i znalazłem tylko takie coś:
[url]http://coding.westreicher.org/?p=23[url]
ten kod teoretycznie powinien jednocześnie szyfrować i deszyfrować dane jednak przy deszyfracji dostaję błąd:
"javax.crypto.BadPaddingException: Data must start with zero"
nie doszedłem dlaczego tak się działo. Klusze sprawdziłem. Dane wejściowe również.
Próbowałem samemu napisać taką pętlę i poniżej przedstawiam kod:
public byte[] rsaPryw(byte[] data, boolean tryb_) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException{
System.out.println("Klucz Prywatny");
boolean tryb = tryb_;
PrivateKey privKey = odczytKluczaPryw(jtfSciDn.getText());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
System.out.println(data.length);
int pozycjazr = 0;
int pozycjadoc = 0;
int dlbufforu;
byte[] buffor = null;
byte[] czesc = new byte [0];
byte[] cipherData = new byte[256];
if (tryb == true)
{cipher.init(Cipher.ENCRYPT_MODE, privKey);
dlbufforu = 240;
while(true)
{ boolean koniec = false;
if(pozycjazr +dlbufforu > data.length)
{dlbufforu = data.length - pozycjazr; koniec = true;}
buffor = new byte[dlbufforu];
System.arraycopy(data, pozycjazr, buffor , 0, dlbufforu);
czesc = cipher.doFinal(buffor);
System.arraycopy(czesc, 0, cipherData, pozycjadoc, 256);
pozycjazr += 240;
pozycjadoc += 256;
buffor = null;
czesc = null;
if(koniec == true) break;
}
}
else
{cipher.init(Cipher.DECRYPT_MODE, privKey);
dlbufforu = 256;
while(true)
{ boolean koniec = false;
if(pozycjazr +dlbufforu > data.length)
{dlbufforu = data.length - pozycjazr; koniec = true;}
buffor = new byte[dlbufforu];
System.arraycopy(data, pozycjazr, buffor , 0, dlbufforu);
czesc = cipher.doFinal(buffor);
System.arraycopy(czesc, 0, cipherData, pozycjadoc, dlbufforu);
pozycjazr += 256;
pozycjadoc += 240;
buffor = null;
czesc = null;
if(koniec == true) break;
}
}
return cipherData;
(Kod wykorzystujący klucz publiczny jest identyczny z wyjątkiem użytego klucza)
Nie ukrywam, że było to zrobione kompletnie w ciemno łącznie z wartościami zmiennych i oczywiście nie działa.
Mogę prosić o jakieś porady (gotowy kod od zbawcy) jak się za taką pętlę zabrać.
P.S dodam, że paczki danych które idą do zaszyfrowania sięgają od 40 bajtów do około 1,5kilobajta. więc wydajność nie jest szczególnie ważna.