安卓:DSA签名-签名和验证



我在验证刚刚创建的签名时遇到问题。签名后,我首先使用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);

现在,我使用上面创建的SignedObject对象而不是Base64来验证签名。这是成功的:

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)。

为什么首先使用SignedObject?它能给你买什么?至于验证失败,请确保在传输/接收后获得相同的字节。您是否使用相同的编码发送/接收?有人在修改字符串吗?

最新更新