2012-08-01 32 views
0

我正在用Java創建一個加密安全的IM應用程序。第一步(建立連接之後)是交換一個公鑰(RSA-4096),以便另一方可以創建一個對稱密鑰(AES-256),使用對方的公鑰進行加密,通過連接發送,原始方可以用他們的私鑰解密對稱密鑰,然後雙方可以交換使用256位密鑰加密的消息。Java - KeyPairGenerator.Initialize(int,SecureRandom)NullPointerException

我的問題是出在初始化KeyPairGenerator了,每次我打電話kpg.initialize(4096,sr)其中kpgKeyPairGenerator的變量的名稱,並sr是我所創建的SecureRandom,程序崩潰並返回一個NullPointerException,這裏是全代碼:

CryptoBox.java:

package crypto; 

    import java.security.*; 

    public class CryptoBox { 
     private static SecureRandom sr = new SecureRandom(); 
     private static KeyPairGenerator kpg; 
     private static KeyPair kp; 

     private static Key PubKey; 
     private static Key PrivKey; 

     @SuppressWarnings("static-access") 
     public void init(int keySize){ 
      try { 
       sr.getInstance("SHA1PRNG"); 
       kpg.getInstance("RSA"); 
      } catch (NoSuchAlgorithmException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      try { 
       kpg.initialize(keySize,sr); // <-- NullPointerException 
      }catch(Exception e){ 
       e.printStackTrace(); 
     return; 
      } 

      kp = kpg.genKeyPair(); 
      PubKey = kp.getPublic(); 
      PrivKey = kp.getPrivate(); 
     } 

    } 

Main.java:

package main; 

import crypto.CryptoBox; 

public class Main { 

/** 
* @param args 
*/ 
public static void main(String[] args){ 
    // TODO Auto-generated method stub 
    CryptoBox cb = new CryptoBox(); 
    cb.init(4096); // <-- NullPointerException 
} 

} 

完整的錯誤信息是:

java.lang.NullPointerException 
at crypto.CryptoBox.init(CryptoBox.java:23) 
at main.Main.main(Main.java:15) 
+0

我剛剛編輯了我的代碼,它現在可以工作。感謝Mene,Reimeus和Pshemo。現在我只需要讓編碼的其餘部分得到! – 2012-08-01 23:24:35

回答

2

變化sr.getInstance("SHA1PRNG");sr = KeyPairGenerator.getInstance("SHA1PRNG");

的copmiler可能已經告訴過你你的錯,但你選擇忽略它。幫你一個忙,並刪除@SuppressWarnings("static-access"),這也是編譯器錯誤的好處; D

+0

謝謝,我想我必須放下C++一段時間,重新學習Java的基礎知識,這是一個新手的錯誤。自我注意:切勿再次使用SupressWarnings。 – 2012-08-01 23:10:50

+1

有時候(但肯定不是很多次)抑制威脅是合法的,例如當鑄造到一個類型的類。大多數情況下,編譯器知道最好,至少Eclipse不會拋出太多難以避免的警告和錯誤。 – 2012-08-03 23:07:18

0

對於消息通信的每個方向具有單獨的密鑰是加密優先模式。因此,不要共享一個對稱密鑰 - 而是讓每一方都生成自己的密鑰,並使用對方的公鑰對其進行加密,然後將其作爲首個傳出消息發送,然後使用它們生成的用於加密它們發送的消息的密鑰,收到解密每個收到他們收到的消息。

+0

這個答案是如何解決問題中的npe的? Asif_Hirai已經按照你的建議去做了嗎? – Andreas 2014-06-25 18:08:03