Java-KeyPairGenerator.Initialize(int,SecureRandom)NullPointerException

Java-KeyPairGenerator.Initialize(int,SecureRandom)NullPointerException,java,cryptography,nullpointerexception,key-generator,Java,Cryptography,Nullpointerexception,Key Generator,我正在用Java创建一个加密安全的IM应用程序。第一步(建立连接后)是交换公钥(RSA-4096),以便另一方可以创建对称密钥(AES-256),用另一方的公钥加密,通过连接发送,其中,原始方可以使用其私钥解密对称密钥,然后双方可以交换使用256位密钥加密的消息 我的问题出现在初始化KeyPairGenerator时,每次调用kpg.initialize(4096,sr),其中kpg是KeyPairGenerator的变量名,sr是我创建的SecureRandom,程序崩溃并返回一个null点异

我正在用Java创建一个加密安全的IM应用程序。第一步(建立连接后)是交换公钥(RSA-4096),以便另一方可以创建对称密钥(AES-256),用另一方的公钥加密,通过连接发送,其中,原始方可以使用其私钥解密对称密钥,然后双方可以交换使用256位密钥加密的消息

我的问题出现在初始化
KeyPairGenerator
时,每次调用
kpg.initialize(4096,sr)
,其中
kpg
KeyPairGenerator
的变量名,
sr
是我创建的
SecureRandom
,程序崩溃并返回一个null点异常,以下是完整的代码:

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

    }

更改
sr.getInstance(“SHA1PRNG”)
to
sr=KeyPairGenerator.getInstance(“SHA1PRNG”)


直升机驾驶员可能已经告诉你你的错误,但是你选择忽略它。帮自己一个忙,删除
@SuppressWarnings(“静态访问”)
,这就是编译器错误的好处;D

对于消息通信的每个方向都有单独的密钥是加密的首选模式。因此,不要共享一个对称密钥,而是让每一方生成自己的密钥,使用另一方的公钥进行加密,并将其作为第一条传出消息发送,然后使用生成的密钥对发送的消息进行加密,并使用收到的密钥对收到的每个传入消息进行解密。

谢谢,我想我必须先放下C++,重新学习java的基础知识,这是新手错误。自我提醒:永远不要再使用suppresswarnings。有时(但肯定不是很多次)suppresswarnings是合法的,例如在强制转换到类型化类时。大多数情况下,编译器最清楚,至少Eclipse不会抛出太多难以避免的警告和错误。谢谢Mene,Reimeus和Pshemo。现在我只需要把剩下的东西都编码好!这个答案如何解决问题中的npe?Asif_Hirai不是已经按照你的建议做了吗?
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)