我想签署一条消息,然后从签名中获取原始消息。我在 java 中找到 RSA 和 DSA 签名:http: //docs.oracle.com/javase/tutorial/security/apisign/vstep4.html
但他们的验证方法使用原始数据进行验证,无法从签名中恢复消息。
有没有办法在 Java 或任何免费的 Java 库中做到这一点?
谢谢大家。
问问题
1766 次
2 回答
0
您可以使用 BouncyCastle。它支持 ISO-9796-2。ISO9796Test.java提供了一个例子。这是一个可能有帮助的摘录:
RSAKeyParameters pubParameters = new RSAKeyParameters(false, mod3, pub3);
RSAKeyParameters privParameters = new RSAKeyParameters(true, mod3, pri3);
RSAEngine rsa = new RSAEngine();
byte[] data;
ISO9796d2Signer eng = new ISO9796d2Signer(rsa, new RIPEMD128Digest());
eng.init(true, privParameters);
eng.update(msg4[0]);
eng.update(msg4, 1, msg4.length - 1);
data = eng.generateSignature();
eng.init(false, pubParameters);
eng.update(msg4[0]);
eng.update(msg4, 1, msg4.length - 1);
if (eng.hasFullMessage()) {
eng = new ISO9796d2Signer(rsa, new RIPEMD128Digest());
eng.init(false, pubParameters);
if (!eng.verifySignature(sig4)) {
// signature tampered with
}
byte[] message = eng.getRecoveredMessage(), 0, msg4);
}
于 2012-06-03T14:38:43.113 回答
0
我想您指的是不需要原始消息的 ISO9796-2 数字签名方案 1、尾部字段 1、八位字节“BC”。
RSAEngine rsa = new RSAEngine();
//DS as SHA1
Digest dig = new SHA1Digest();
//3rd parameter "true" indicates implicit which means TF1(octet BC)
ISO9796d2Signer eng = new ISO9796d2Signer(rsa, dig, true);
eng.init(false, pubKeyParameter);
eng.verifySignature(sig); // if the signature is valid
eng.getRecoveredMessage(); // get the recovered message, only after successful signature verification
于 2012-06-13T02:23:43.023 回答