Ho sviluppato l'encrypt e tutto funziona alla perfezione. adesso ho problemi nel decrypt.
in sostanza mi da l'errore:

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACiphe r.java:338)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RS ACipher.java:383)
at javax.crypto.Cipher.doFinal(Cipher.java:1813)
at Rsa_file.decrypt_file(Rsa_file.java:146)
at Rsa_file.main(Rsa_file.java:192)


ecco il codice:
codice:
import java.security.*;
import java.util.Scanner;
import javax.crypto.*;
import java.io.*;
import java.lang.Object;

public class  Rsa_file{

	public static KeyPairGenerator kpg=null;
	
	
	public static byte[] file_tobyte(File f)throws IOException {
		  
		int size = ((int) f.length());
		byte[] data = new byte[size];
		FileInputStream freader = new FileInputStream(f);
		System.out.println("\nDimensione in byte : " + freader.read(data, 0, size));
		freader.close();
		return data;	
	}
	
	public static String getText (byte[] arr)throws UnsupportedEncodingException {
	  String s = new String( arr, "ISO-8859-1" );
	  return s;
	}
	
	public static void encrypt(String path_file,PublicKey pubblica) throws Exception {
		File ff2=new File("/home/dario/Scrivania/utenti_critt.txt");
		FileWriter fw=new FileWriter(ff2,true);// append sul file
		File ff=new File(path_file);
		byte[] plain=file_tobyte(ff);
		
         Cipher c=null;
         
        	c = Cipher.getInstance("RSA/ECB/PKCS1Padding");			
    		c.init(Cipher.ENCRYPT_MODE, pubblica);
    		
    		byte[] encodeFile=new byte[128];

    		int iteraz=plain.length/117;
    		int resto=plain.length%117;    		
    		int i=0;
    		int dim=117;
    		long a=System.currentTimeMillis();
    		while(i<=iteraz){
    			// entro nell' IF quando rimangono solo   *** plain.lenght%117 ***
    			if(i==iteraz){
    				int offset=dim*i+1;
    	    		byte[] temp=new byte[dim];
    	    		System.out.println("if"+offset+"   "+(plain.length-offset));
    	    		temp=c.update(plain, offset, plain.length-offset);
    	    		encodeFile=c.doFinal(temp);
    	    		fw.write(getText(encodeFile));
    	    		i++;
    			}
    			else{	
    		byte[] temp=new byte[dim];
    		System.out.println("else"+i*(dim+1));
    		temp=c.update(plain, (i*(dim+1)), dim);
    		encodeFile=c.doFinal(temp);
    		fw.write(getText(encodeFile));
    		i++;
    		//System.out.println("else i < iteraz"+i);
    			}
    		}
    		fw.close();
    		long b=System.currentTimeMillis()-a;
    		System.out.println("Tempo per criptare XXX utenti "+b+"ms");
	}

	public static void decrypt_file(String path,PrivateKey privata) throws Exception {
		File ff2=new File("/home/dario/Scrivania/utenti_critt.txt");
		FileInputStream fr=new FileInputStream(ff2);
		File ff3=new File("/home/dario/Scrivania/utenti_decritt.txt");
		FileWriter fw=new FileWriter(ff3,true);
		byte[] ciphered=file_tobyte(ff2);
		int iteraz=ciphered.length/117;
		int resto=ciphered.length%117;
		Cipher c=null;		
		c = Cipher.getInstance("RSA/ECB/PKCS1Padding");			
		c.init(Cipher.DECRYPT_MODE, privata);
		int i=0;
		int dim=117;
		byte[] decodeFile=new byte[128];
		long a=System.currentTimeMillis();
		while(i<=iteraz){
			// entro nell' IF quando rimangono solo   *** plain.lenght%117 ***
			if(i==iteraz){
				int offset=dim*i+1;
	    		byte[] temp=new byte[dim];
			System.out.println("if"+offset+"   "+(ciphered.length-offset));
	    		System.out.println("else"+i*(dim+1));
	    		temp=c.update(ciphered, (i*(dim+1)), dim);
	    		decodeFile=c.doFinal(temp); 
	    		fw.write(getText(decodeFile));
	    		i++;
			}
			else{	
				int offset=dim*i+1;
	    		byte[] temp=new byte[dim];
	    		temp=c.update(ciphered, offset, ciphered.length-offset);
	    		decodeFile=c.doFinal(temp);
	    		fw.write(getText(decodeFile));
		i++;
			}
		}
    		long b=System.currentTimeMillis()-a;
    		System.out.println("Tempo per criptare 100 utenti "+b+"ms");
			fw.close();
			fr.close();
	}

	public static void main(String[] args) throws Exception {
		/*KeyPair kp=gen_key(kpg);
		PublicKey pubblica=kp.getPublic();
		PrivateKey privata=kp.getPrivate();*/
		
		//ISTANZIO UN OGGETTO LOADKEYS CHE MI PERMETTE DI CARICARE LE CHIAVI MEMORIZZATE NEL KEYSTORE.
		LoadKeys aa=new LoadKeys();
		KeyPair kp=aa.getkey_fromkeystore("/home/dario/prova.jks", "storepass", "keypass", "alias", "JKS");
		PublicKey pubblica=kp.getPublic();
		PrivateKey privata=kp.getPrivate();
		
		File a=new File("/home/dario/Scrivania/utenti");
		long len=a.length();
		//CODIFICA
		//Encrypt accetta un pathname e una PublicKey. Cripta il file e lo scrive.
		encrypt("/home/dario/Scrivania/utenti",pubblica);
		

		//DECODIFICA
		//Decrypt accetta un pathname e una PrivateKey. Decripta il file e lo scrive.
		decrypt_file("/home/dario/Scrivania/utenti_critt.txt",privata);
         
	}
}
Dal punto di vista teorico nell'encrypt la funz dofinal() accetta un array di keysize/8-11 byte (per via del tipo di padding) e ritorna un array di keysize/8 byte.

Nel decrypt dovrebbe essere invertito il tutto, quindi dovrebbe accettare in ingresso un array da keysize/8 byte e tornare un array di keysize/8 -11.
Nel mio caso ho una key da 1024bit.
La riga incriminata è quella in grassetto.