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)); } }

Rispondi quotando