2015-05-14 3 views
0

Я создаю приложение для подписания файлов в цифровом виде, я выполнил подписание и проверку элементов автоподстройки, но я хочу построить метод для чтения секретного ключа, а не только для подписания файла. Потому что я не хочу использовать разные ключи каждый раз, когда я что-то подписываю.как читать секретный ключ для цифровой подписи

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

А вот метод в моей кнопочной панели:

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

Это мой метод подписи:

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

А вот ошибку после попытки подписать:

мај 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) 

Пожалуйста, если anyo Не знаю ответ, пожалуйста, помогите мне, я младший программист, и мне действительно нужна помощь в этом. Спасибо заранее!

+0

Возможно, людям будет легче понять ваш код, если это английский. Я ценю, что вы не носитель английского языка, но большинство людей здесь общаются по-английски. – christopher

+0

Вы игнорируете исключения во время 'dsa.initSign (privatni)'. в случае такого исключения результирующее сообщение «объект, не инициализированный», в точности верен. – mkl

+0

@christopher Извините, об этом, но я подумал, что это понятно вам, потому что вы в этом лучше меня. –

ответ

0

Закрытые ключи не должны кодироваться с использованием сериализации объектов. Закрытые ключи могут быть закодированы с использованием метода getEncoded() и считаны с использованием PKCS8EncodedKeySpec, предоставленного на примере .

Смежные вопросы