Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    14

    Problema decrypt rsa con file grandi

    salve,

    sto scrivendo un programmino per criptare e decriptare file in rsa utilizzando la Java Security.
    Quando cripto e decripto file minori della grandezza della chiave(1024bit) va tutto bene.

    il problema sorge quando devo decriptare i file splittati in più blocchi di keysize/8 perchè la loro dimensione è maggiore della keysize.

    Di seguito posto il codice.

    codice:
    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 byte[] encrypt(String path_file,PublicKey pubblica) throws Exception {
    		File ff2=new File("/home/dario/Scrivania/utenti_critt.txt");
    		FileWriter fw=new FileWriter(ff2);
    		File ff=new File(path_file);
    		byte[] plain=file_tobyte(ff);
    		
    		 int dim_max = (1024/8)-11;
             int dim_dati = plain.length;
             Cipher c=null;
     		 byte[] encodeFile;
    		
            if( (dim_dati< dim_max) ){
            	System.out.println("pppppppppp");
        		c = Cipher.getInstance("RSA/ECB/PKCS1Padding");			
        		c.init(Cipher.ENCRYPT_MODE, pubblica);
        		System.out.println("publick key"+pubblica);
        		encodeFile = c.doFinal(plain);
        		System.out.println("Frase cifrata "+getText(encodeFile));
        		fw.write(getText(encodeFile));
        		fw.close();
            }
            
            else{
             
            	c = Cipher.getInstance("RSA/ECB/PKCS1Padding");			
        		c.init(Cipher.ENCRYPT_MODE, pubblica);
        		
        		encodeFile=c.doFinal(plain,0,dim_max);
        		System.out.println("Frase cifrata "+getText(encodeFile));
        		//fw.write(getText(encodeFile));
        		fw.write(getText(encodeFile));
        		fw.close();	        	
            }
    		
    	return encodeFile;	
    	}
    
    	
    	
    	public static byte[] decrypt_file(byte[] plain,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);
    
    		
    		Cipher c=null;
    		byte[] decodeFile=file_tobyte(ff2);
    
    		System.out.println("decode"+decodeFile.length);
    		System.out.println("plain"+plain.length);
    		
    		if(decodeFile.length<128){
    			c = Cipher.getInstance("RSA/ECB/PKCS1Padding");			
    			c.init(Cipher.DECRYPT_MODE, privata);
    			decodeFile = c.doFinal(plain);
    			System.out.println("private key"+privata);
    			//System.out.println("Frase decifrata "+getText(decodeFile));
    			fw.write(getText(decodeFile));
    			fw.close();
    			fr.close();
    			}
    		
    		else{
    			c = Cipher.getInstance("RSA/ECB/PKCS1Padding");			
    			c.init(Cipher.DECRYPT_MODE, privata);
    
    			plain=c.doFinal(decodeFile,0,128);
    			
    			
    			System.out.println("private key"+privata);
    			//System.out.println("Frase decifrata "+getText(decodeFile));
    			fw.write(getText(decodeFile));
    			fw.close();
    			fr.close();
    
    		}
    		
    		
    		return decodeFile;
    	}
    	
    
    	
    	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
    		byte[] cypher=encrypt("/home/dario/Scrivania/utenti",pubblica);
    
    		//System.out.println("MAIN stringa cyphered "+getText(cypher));
    		
    
    		//DECODIFICA
    		byte[] out=decrypt_file(cypher,privata);
    		//System.out.println("MAIN Frase decifrata: "+getText(out));
             
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    quale è l'errore?

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    14
    Con file minori di 117byte il problema non sussiste.
    I problemi nascono quando il file è più grande, lasciando il codice così come è mi decripta solo 128byte, quindi questo mi fa pensare che egli cripta solo 128byte.

    Ho provato con la funzione update() della classe cipher che dovrebbe aggiornare i buffer per proseguire nella criptazione multipla ma nulla cambia....

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    ancora quale è l'errore? stampa uno stacktrace che so, così per capirci devo rieseguire il tuo codice (sempre che ci sia tutto).
    Potrebbe essere che devi fare un semplice flush del buffer, ma ripeto devi darmi INDICAZIONI sull'errore, non posso andare ad intuito

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Trovi codice pronto qui:

    http://www.aviransplace.com/2004/10/...ion-with-java/

    L'articoletto (è composto di sole 3 pagine) ha un link per scaricare il codice verso la fine della 3 pagina.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    14
    Originariamente inviato da Andrea1979
    Trovi codice pronto qui:

    http://www.aviransplace.com/2004/10/...ion-with-java/

    L'articoletto (è composto di sole 3 pagine) ha un link per scaricare il codice verso la fine della 3 pagina.
    Questo codice è per criptare/decriptare Stringhe minori della keysize/8 e non File.

    Ringrazio tutti quelli che hanno risposto e si sono interessati.
    Ho risolto il problema.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    1. non ho ancora capito quale era il problema visto che non c'è una traccia ma solo la tua indicazione
    2. lascia almeno la soluzione per i posteri

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    oltre a quello detto da valia il link che ti ho fornito non cifra/decifra solo stringhe, ma file (prende come argomento String solo i percorsi dei file) e cifra a blocchi di 100 byte proprio per evitare le limitazioni di RSA. Comunque, a questo punto posta la tua soluzione...
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    14
    Hai ragione, scusami, cripta anche i file. Però non è una soluzione ottimale perchè di per se la classe cipher fornisce dei metodi per criptare/decriptare parti multiple di byte[ ] , ed io è proprio con quelli che faccio funzionare il tutto.

    Adesso sto sviluppando il codice della decrypt, appena completo posto il tutto.

    Grazie ancora a tutti.

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2010
    Messaggi
    14
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.