Mam zaszyfrować i odszyfrować zadany plik.
Czytanie i zapis pliku na pewno mam dobrze, natomiast w szyfrowaniu lub deszyfrowaniu mam jakiś błąd, bo nie działa.
Proszę o pomoc.

Robię to tak.

Szyfrowanie:
Wczytuję plik jako tablicę bajtów, wyliczam ilość części(szyfrowanie odbywa się częściami), dzielę, szyfruję, zapisuje do dwuwymiarowej tablicy bajtów, sprawdzam jaka jest największa długość kawałka po zaszyfrowaniu, krótszym szyfrom dopisuję odpowiednią liczbę zer na początku, tak, żeby zaszyfrowane kawałki były jednakowej długości, zapisuję do pliku, z tym, że pierwsze 2 bajty to długość kawałka.

 
BigInteger tmp;
            int lines;
            if (bfile.length % portion == 0) {
                lines=bfile.length/portion;
            } else {
                lines=bfile.length/portion+1;
            }
            byte[][] message=new byte[lines][portion];
            BigInteger[] temp=new BigInteger[lines];
            int footage = 0;
            for (int i = 0; i < bfile.length; i++) {
                message[i / portion][i % portion] = bfile[i];
            }
            for (int i = 0; i < lines; i++) {
                tmp = new BigInteger(message[i]);
                temp[i] = tmp.modPow(e, n);
                if (temp[i].toByteArray().length > footage) {
                    footage = temp[i].toByteArray().length;
                }
                progress.setValue((100 * i / lines) / 1);
            }
            if(progress.getValue()==99){
                progress.setValue(100);
            }
            cbfile=new byte[footage*message.length+2];
            cbfile[0]=(byte)(footage>>8);
            cbfile[1]=(byte)(footage);
            int i=2;
            int dif;
            for(int j=0;j<temp.length;j++){
                dif=footage-temp[j].toByteArray().length;
                System.arraycopy(temp[j].toByteArray(), 0, cbfile, i+dif, temp[j].toByteArray().length);
                i+=footage;
            }

Deszyfrowanie:
Czytam długość kawałka, dzielę na kawałki o podanej długości, deszyfruję, liczę długość wszystkich danych, składam wszystkie dane.

int part = (bfile[0] & 0xff) << 8 | (bfile[1] & 0xff);
                byte[] line = new byte[part];
                BigInteger tmp;
                BigInteger[] temp = new BigInteger[(bfile.length - 2) / part];
                int footage = 0;
                int i = 2;
                for (int j = 0; j < temp.length; j++) {
                    System.arraycopy(bfile, i, line, 0, part);
                    tmp = new BigInteger(line);
                    temp[j] = tmp.modPow(d, n);
                    footage += tmp.toByteArray().length;
                    i += part;
                }
                cbfile = new byte[footage];
                i = 0;
                for (int j = 0; j < temp.length; j++) {
                    System.arraycopy(temp[j].toByteArray(), 0, cbfile, i, temp[j].toByteArray().length);
                    i += part;
                }