0

サーバーと Android クライアント アプリケーションの両方を作成しています。Android クライアントは測定値をサーバーに送信します。データの完全性を確保するために、デジタル署名が各測定値に追加されます。

すべてを Gson 対応にする必要があるため、公開鍵自体を保存することはできません。代わりに、G、P、Q、および Y 係数を格納しています。

リクエスト クラスのスニペットを次に示します。

    public PublicKey getPublicKey() {
    try {
        DSAPublicKeySpec keySpec = new DSAPublicKeySpec(publicKeyY, publicKeyP,
                                                        publicKeyQ, publicKeyG);
        KeyFactory fact = KeyFactory.getInstance("DSA");
        PublicKey pubKey = fact.generatePublic(keySpec); // A
        return pubKey;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public void setPublicKey(PublicKey publicKey) {
    try {
        KeyFactory fact = KeyFactory.getInstance("DSA");
        DSAPublicKeySpec pub = fact.getKeySpec(publicKey, DSAPublicKeySpec.class); // B
        publicKeyG = pub.getG();
        publicKeyP = pub.getP();
        publicKeyQ = pub.getQ();
        publicKeyY = pub.getY();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

コンストラクターは、setPublicKey メソッドを使用します。クライアント側でそのようなリクエストを作成してサーバーに送信すると、どちらも例外になります。

クライアントで:

 java.lang.RuntimeException: not implemented yet DSA Public Key
             y: 2f9286201b266f38d682e99814612f7d37c575d3a210de114bdf02092f4a835109f28a590cfc568bb6525d59b8275fe791f3ddf20e85df44fd2e8622289f6dbc27c73d31d1769feae19573df22a9ca8ef80a9f7230b0b4a2671cc03fdb2788b55b4e9a68a7a5a93a214cc5aa39ccb5155a13354870d45a38760a80fd34333073
  class java.security.spec.DSAPublicKeySpec
    at org.bouncycastle.jce.provider.JDKKeyFactory.engineGetKeySpec(JDKKeyFactory.java:148)
    at java.security.KeyFactory.getKeySpec(KeyFactory.java:210)

スタック トレースの次のものは、私が B としてマークしたルールを指しています

サーバー上:

java.lang.NullPointerException
    at sun.security.provider.DSAPublicKey.<init>(DSAPublicKey.java:74)
    at sun.security.provider.DSAPublicKeyImpl.<init>(DSAPublicKeyImpl.java:46)
    at sun.security.provider.DSAKeyFactory.engineGeneratePublic(DSAKeyFactory.java:86)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:304)
    at sensserve.protocol.StartSessionRequest.getPublicKey(StartSessionRequest.java:66)

次に、ルール A を指します。

何が間違っていたのか、これらのメッセージが何を意味するのか、まったくわかりません。これらを解決するにはどうすればよいですか?私が間違っていることを教えてくれる人はいますか?

どうもありがとう。

4

1 に答える 1

0

からエンコードされた Base64 で公開鍵を保存し、有効な JSON を取得できるはずです。どうやら Bouncy Castle (Android の JCE プロバイダー) に実装されていDSAPublicKeySpecない呼び出しなしで直接使用できるはずです。getKeySpec()サーバーで NPE を取得している理由がわかりません。形式が間違っている可能性があります。ところで、単一のプロバイダーを扱う場合はおそらく簡単になるため、サーバーでも Bouncy Castle を使用することをお勧めします。

于 2012-05-10T03:57:57.120 に答える