I am building application for signing files digitally, I done tow parts signing and verification, but I want to build method to read private key, and than just sign the file. Because i do not want to use different key every time when I am signing something.
// Here is my method for reading private key
class PK implements Serializable{
PrivateKey pk = null;
public PK(String nazivFajla) throws FileNotFoundException, IOException {
this.pk = privatni;
FileOutputStream fos = new FileOutputStream(nazivFajla);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(this.pk);
oos.close();
fos.close();
}
public PrivateKey getPk(String nazivFajla) throws FileNotFoundException, IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream(nazivFajla);
ObjectInputStream ois = new ObjectInputStream(fis);
this.pk = (PrivateKey) ois.readObject();
return pk;
}
And here is method in my button field:
private void ucitajPrivatniActionPerformed(java.awt.event.ActionEvent evt) {
try {
jfc.showOpenDialog(jfc);
String fajlZaprivatniKljuc = jfc.getSelectedFile().getAbsolutePath();
PK pk = new PK(fajlZaprivatniKljuc);
privatni = pk.getPk(fajlZaprivatniKljuc);
this.tick_UF2.setVisible(true);
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
This is my signing method:
private void Potpisi1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
//Alisa bira algoritme - izabrala je RSA sa SHA-1
Signature dsa = Signature.getInstance("SHA1withRSA");
try{
dsa.initSign(privatni);
}catch(Exception e){
System.out.println("Crashed here!");
}
FileInputStream poruka = new FileInputStream(fajlZaPotpis);
BufferedInputStream bufporuka = new BufferedInputStream(poruka);
byte[] buffer = new byte[1024];
int len;
while (bufporuka.available() != 0) {
len = bufporuka.read(buffer);
dsa.update(buffer, 0, len);
}
bufporuka.close();
poruka.close();
//Alisa generiše digitalni potpis pozivajući metod sign()
byte[] digitalniPotpis = dsa.sign();
jfc.showSaveDialog(jfc);
sacuvaj(digitalniPotpis, jfc.getSelectedFile().getAbsolutePath());
this.tick_UF3.setVisible(true);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
} catch (FileNotFoundException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
} catch (SignatureException ex) {
Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
}
And here is the mistake after trying to sign:
мај 14, 2015 8:09:55 PM DP.GUI Potpisi1ActionPerformed
SEVERE: null
java.security.SignatureException: object not initialized for signature or verification
at java.security.Signature.update(Signature.java:738)
at DP.GUI.Potpisi1ActionPerformed(GUI.java:553)
at DP.GUI.access$1500(GUI.java:46)
at DP.GUI$16.actionPerformed(GUI.java:306)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6525)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6290)
at java.awt.Container.processEvent(Container.java:2234)
at java.awt.Component.dispatchEventImpl(Component.java:4881)
at java.awt.Container.dispatchEventImpl(Container.java:2292)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
at java.awt.Container.dispatchEventImpl(Container.java:2278)
at java.awt.Window.dispatchEventImpl(Window.java:2739)
at java.awt.Component.dispatchEvent(Component.java:4703)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:719)
at java.awt.EventQueue$4.run(EventQueue.java:717)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Please if anyone know the answer please help me, I am a junior programmer, and I really need help about this.. Thanks in advance!
Private keys should not be encoded using object serialization. Private keys can be encoded using the getEncoded()
method and read in using PKCS8EncodedKeySpec
supplied to an "RSA"
KeyFactory
instance.