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