Szyfrowanie wiekszej ilosci danych niz pozwala na to klucz RSA

0

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.

0

A co ma długośc klucza do ilosci danych chłopie? Pierw poczytaj co jest co a potem zadawaj pytania.

0
lipkerson napisał(a)

A co ma długośc klucza do ilosci danych chłopie? Pierw poczytaj co jest co a potem zadawaj pytania.

No właśnie czytałem nawet na zagranicznych forach. Jakoś gdzie bym nie zaglądnął odpowiedzi były dwie. Albo sobie odpuść i użyj kluczy symetrycznych i tylko je szyfruj RSA albo jak chcesz na siłę RSA to musisz dzielić na partie o długości zależnej od długości użytego klucza. Ani wzmianki o tym, żeby dało się RSA użyć na żywca.
No ale ok skoro tak mówisz to wytłumacz mi skąd się bierze poniższy błąd (klucz 2048):

javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes

przy użyciu:

 
public byte[] rsaPub(byte[] data, boolean tryb_) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
        
        System.out.println("Klucz publiczny");
        
        byte[] src = data;
        boolean tryb = tryb_;
        PublicKey pubKey = odczytKluczaPub(jtfSciEn.getText());
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

        if(tryb == true)
          {cipher.init(Cipher.ENCRYPT_MODE, pubKey);}
        else
          {cipher.init(Cipher.DECRYPT_MODE, pubKey);}

        byte[] cipherData = cipher.doFinal(src);
        return cipherData;
    }

(bo prościej to się chyba nie da)
jak szyfruję paczkę o wielkości 387bajtów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1