0

Java で暗号的に安全な IM アプリケーションを作成しています。最初のステップ (接続を確立した後) は、公開鍵 (RSA-4096) を交換して、相手が対称鍵 (AES-256) を作成し、それを相手の公開鍵で暗号化し、接続を介して送信できるようにすることです。 、元の当事者が秘密鍵を使用して対称鍵を復号化でき、その後、両方の当事者が 256 ビット鍵で暗号化されたメッセージを交換できます。

私の問題は、の初期化時に表示されます。 whereは変数の名前であり、私が作成しKeyPairGeneratorた を呼び出すたびに、プログラムがクラッシュし、NullPointerException が返されます。完全なコードは次のとおりです。kpg.initialize(4096,sr)kpgKeyPairGeneratorsrSecureRandom

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)
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 に答える