ragazzi per favore aiutatemi perchè sono ad un passo dalla pazzia
ho trovato girovagando in rete un software di codifica rsa scritto da piero tofy
il software è composto dalle seguenti classi
che trovate al seguente link
eccolo
il software funziona perfettamente solo che il problema è che ha un interfaccia grafica e a me non serve perchè deve fare tutto in automatico e quindi ho eliminato la classe RSACoderGui e ho creato una classe Main in questo modo
codice:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.security.*;
import java.util.Properties;
import java.io.*;
public class Main {
private RSA rsa;
private UsersPublicKeys upk;
private Object[] users;
private PrivateKey prk;
private PublicKey puk;
private JList lista;
protected static Properties keystore;
public Main() throws NoSuchAlgorithmException, IOException{
upk = new UsersPublicKeys();
users = upk.getUsers();
esecuzione();
}
/**
* Metodo per salvare le chiavi
*
* @param prk Chiave privata
* @param puk Chiave pubblica
* @throws IOException
* @throws NoSuchAlgorithmException
*/
private void saveKeys(PrivateKey prk, PublicKey puk) throws IOException, NoSuchAlgorithmException {
byte[] prkBytes = prk.getEncoded();
byte[] pukBytes = puk.getEncoded();
String password = null;
if(!new File("MyKeys").exists()) {
new File("./MyKeys/").mkdir();
}
FileOutputStream fos = new FileOutputStream("./MyKeys/MyPublic");
fos.write(pukBytes);
fos.close();
MessageDigest md = MessageDigest.getInstance("MD5");
do {
password = JOptionPane.showInputDialog(this, "Inserire password per chiave privata");
} while(password == null || password.equals(""));
fos = new FileOutputStream("./MyKeys/MyKeyStore");
fos.write(md.digest(password.getBytes()));
fos.close();
fos = new FileOutputStream("./MyKeys/MyPrivate");
fos.write(prkBytes);
fos.close();
}
public void esecuzione() throws NoSuchAlgorithmException, IOException{
RSA rs = new RSA();
rs.createKeys();
System.out.println("Chiavi create");
PrivateKey prk = rs.getPrivate();
PublicKey puk = rs.getPublic();
saveKeys(prk, puk);
String user;
do {
user = JOptionPane.showInputDialog(this, "Inserire nome utente");
} while(user == null || user.equals(""));
System.out.println("Sto selezionando la chiave pubblica");
File chiavepubblica= new File("MyKeys/MyPublic");
System.out.println(" chiave pubblica selezionata correttamente");
//associo all'unse la sua rispettiva chiave pubblica
upk.addPublicKey(user, chiavepubblica);
File pdf = new File("c:/prova.txt");
System.out.println("ci sono");
String utente=user;
if(utente == null) {
System.out.println( "Non hai scelto nessun utente");
} else {
System.out.println(utente);
rsa.codifica(utente, pdf);
}
}
public static void main(String[]arg) throws NoSuchAlgorithmException, IOException{
new Main();
}
}
e giustamento ho modificato il metodo cod in questo modo nella classe rsa
codice:
public class RSA {
protected PublicKey puk;
protected PrivateKey prk;
protected Cipher c;
protected FileInputStream keyReader;
protected DataOutputStream out;
protected UsersPublicKeys upk;
protected ByteArrayOutputStream baos;
protected Blowfish blowfish;
protected IvParameterSpec spec;
protected KeyFactory kf;
protected SecureRandom random;
protected FileInputStream sourceReader;
protected FileInputStream storeReader;
protected DataInputStream dis;
protected Runnable cod;
protected Runnable decod;
protected String user;
protected File sorgente;
/**
* Costruttore
*/
public RSA() {
upk = new UsersPublicKeys();
blowfish = new Blowfish();
}
public void cod() {
try {
keyReader = new FileInputStream(upk.getPublicFile(user));
sourceReader = new FileInputStream(sorgente);
blowfish.createKey();
out = new DataOutputStream(new FileOutputStream(sorgente.toString()+ ".cod"));
int i = 0;
baos = new ByteArrayOutputStream();
while((i = keyReader.read()) > -1) {
baos.write(i);
}
baos.close();
X509EncodedKeySpec ks = new X509EncodedKeySpec(baos.toByteArray());
kf = KeyFactory.getInstance("RSA");
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);
random = new SecureRandom();
byte[] iv = new byte[8];
random.nextBytes(iv);
out.write(iv);
spec = new IvParameterSpec(iv);
blowfish.codifica(spec, out, sourceReader);
} catch(Exception e) {
e.printStackTrace();
}
........ecc
il problema è che mi dà un java.lang.NullpointerException sulla seguente riga della classe Main
codice:
rsa.codifica(utente, pdf);
sbaglio sicuramente a passare l'utente perchè prima lo prendeva in questo modo
codice:
String utente = lista.getSelectedValue() == null ? null:lista.getSelectedValue().toString();
if(utente == null) {
JOptionPane.showMessageDialog(this, "Non hai selezionato nessun utente", "Attenzione", JOptionPane.WARNING_MESSAGE);
} else {
JFileChooser jfc = new JFileChooser();
int result = jfc.showOpenDialog(this);
switch(result) {
case JFileChooser.APPROVE_OPTION:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
process.setText("Sto codificando");
jpb.setValue(50);
}
});
rsa.codifica(utente, jfc.getSelectedFile());
.....ecc
ragazzi cosa sbaglio ps il metodo decod ancora non lo modifico perchè vorrei prima riuscire a farmi codificare il file
vi prego aiutatemi perchè ho un esame all'uni tra 2 giorni e veramente non sò più come fare
sono 10 giorni che ci perdo la testa
conto su di voi