作成したばかりの署名の検証に問題があります。署名後、まず 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)。