验证签名而不需要原始消息(在java中)

时间:2012-06-01 06:06:20

标签: java signature verify

我想签署一条消息然后从签名中获取原始消息。 我发现RSA& java中的DSA签名:http://docs.oracle.com/javase/tutorial/security/apisign/vstep4.html
但他们的验证方法使用原始数据进行验证,无法从签名中恢复邮件 有没有办法在Java或任何Java免费库中做到这一点? 谢谢大家。

2 个答案:

答案 0 :(得分:0)

您可以使用BouncyCastle。它supports ISO-9796-2ISO9796Test.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);
}

答案 1 :(得分: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