0

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

我的问题是在初始化时出现KeyPairGenerator,每次我调用kpg.initialize(4096,sr)wherekpgKeyPairGenerator变量的名称,并且srSecureRandom我创建的,程序崩溃并返回 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();
       }

    }

主.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)
4

2 回答 2

2

更改sr.getInstance("SHA1PRNG");sr = KeyPairGenerator.getInstance("SHA1PRNG");

编译器可能已经告诉您您的错误,但您选择忽略它。帮自己一个忙并删除@SuppressWarnings("static-access"),这也是编译器错误的好处;D

于 2012-08-01T22:57:15.720 回答
0

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

于 2014-06-25T17:49:03.477 回答