import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
import javax.swing.*;
/**
* Classe per usare RSA<br>
*
* @author netarrow
* @version 1.1.00 beta
* @since 1.0.02
*/
public class RSA {
protected Cipher c;
protected UsersPublicKeys upk;
protected Blowfish blowfish;
protected IvParameterSpec spec;
/**
* Costruttore
*/
public RSA() {
upk = new UsersPublicKeys();
blowfish = new Blowfish();
public void run() {
try {
blowfish.createKey();
int i = 0;
while((i = keyReader.read()) > -1) {
baos.write(i);
}
baos.close();
puk = kf.generatePublic(ks);
c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
c.init(Cipher.ENCRYPT_MODE, puk);
byte[] encoded = c.doFinal(blowfish.getKey());
out.writeInt(encoded.length);
out.write(encoded);
byte[] iv = new byte[8];
random.nextBytes(iv);
out.write(iv);
spec = new IvParameterSpec(iv);
blowfish.codifica(spec, out, sourceReader);
e.printStackTrace();
}
}
};
public void run() {
try {
if(!new File("MyKeys").
exists()) {
JOptionPane.
showMessageDialog(null,
"Non trovo la tua chiave privata, genera una coppia di chiavi RSA prima",
"Attenzione",
JOptionPane.
WARNING_MESSAGE);
return;
}
int i = 0;
while((i = storeReader.read()) != -1) {
baos.write(i);
}
baos.close();
checkPass(baos.toByteArray());
baos.reset();
i = 0;
while((i = keyReader.read()) != -1) {
baos.write(i);
}
baos.close();
prk = kf.generatePrivate(ks);
c = Cipher.getInstance("RSA/ECB/PKCS1Padding");
c.init(Cipher.DECRYPT_MODE, prk);
byte[] keyEncrypt = new byte[dis.readInt()];
dis.readFully(keyEncrypt);
byte[] keyPlain = c.doFinal(keyEncrypt);
SecretKey blowfishKey = new SecretKeySpec(keyPlain, "Blowfish");
byte[] iv = new byte[8];
dis.read(iv);
spec = new IvParameterSpec(iv);
blowfish.decodifica(blowfishKey, spec, sorgente, dis);
e.printStackTrace();
}
}
};
}
/**
* Verifica la password<br>
*
* @param pass Password in byte su cui verificare
* @return Vero o falso se la password è corretta o meno
* @throws Exception
*/
private boolean checkPass
(byte[] pass
) throws Exception {
password
= JOptionPane.
showInputDialog(null,
"Inserire password per chiave privata");
if(password == null) return false;
return md.digest(password.getBytes()).equals(pass);
}
/**
* Crea una coppia di chiavi RSA<br>
*
* @throws NoSuchAlgorithmException
*/
kg.initialize(1024);
puk = kp.getPublic();
prk = kp.getPrivate();
}
/**
* Metodo per ottenere la chiave pubblica<br>
*
* @return La chiave pubblica
*/
return puk;
}
/**
* Metodo per ottenere la chiave privata<br>
*
* @return La chiave privata
*/
return prk;
}
/**
* Codifica la chiave di sessione blowfish con la chiave pubblica rsa<br>
* dell'utente destinatario<br>
*
* @param user Utente destinatario
* @param sorgente File da codificare
* @throws Exception
* @throws Exception
*/
public void codifica
(String user,
File sorgente
) {
this.user = user;
this.sorgente = sorgente;
}
/**
* Decodifica file: estrai chiave blowfish, decodifica con la chiave privata<br>
* e col risultato decodifica il file<br>
*
* @param sorgente File da decodificare
* @throws Exception
*/
public void decodifica
(File sorgente
) {
this.sorgente = sorgente;
}
}