1

作成したばかりの署名の検証に問題があります。署名後、まず Base64 を使用して署名をテキストに変換し、テストとして、Base64 をデコードして署名を検証できることを確認したいと考えました。これは失敗します。エラー処理のないコードを次に示します。

キーペアがあります:

DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate();
DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic();

今、私はいくつかのテキストに署名し、出力をログに記録します - それは問題ないようです:

String text = "test";
Signature signer = null;
signer = Signature.getInstance(privateKey.getAlgorithm());
SignedObject signedObject = null;
signedObject = new SignedObject(text, privateKey, signer);
String print_signature = Base64.encodeToString(signedObject.getSignature(), Base64.DEFAULT);
System.out.println("Base64 Signature: " + print_signature);

次に、Base64 ではなく、上記で作成した SignedObject オブジェクトを使用して署名を検証します。これは成功です:

Signature verifier = null;
verifier = Signature.getInstance(publicKey.getAlgorithm());
boolean b = signedObject.verify(publicKey, verifier));

私のアプリでは、署名者の公開証明書と Base64 でエンコードされた文字列しか持たないため、これらのパラメーターのみを使用して署名を検証する必要があるため、AFAIK では SignedObject オブジェクトを使用できません。Signature オブジェクトを使用しました。

Signature verifier1 = null;
verifier1 = Signature.getInstance(publicKey.getAlgorithm());
verifier1.initVerify(publicKey);
verifier1.update(text.getBytes()); // sorry I forgot this in original posting
byte[] sig1 = Base64.decode(print_signature, Base64.DEFAULT);
b = verifier1.verify(sig1));

この検証は常に失敗します (b = false)。

4

1 に答える 1

0

SignedObjectそもそもなんで使ってんの?それはあなたに何を買うのですか?ベリファイの失敗に関しては、送受信後に同じバイトを取得することを確認してください。同じエンコーディングで送受信していますか? 誰かが文字列を変更していますか?

于 2012-07-25T02:53:17.427 に答える