Android:DSA签名 - 签名并验证

时间:2012-07-24 19:14:27

标签: android base64 digital-signature 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)。

1 个答案:

答案 0 :(得分:0)

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