我有一个由私钥签名的数据。现在我如何获得签名的初始数据?我使用Bouncy Castle进行了很多例子,但它们主要用于验证是否有一些数据是由正确的私钥签名的。
CMSSignedData s = new CMSSignedData(new CMSProcessableByteArray(toverify.getBytes()),contents);
SignerInformationStore signers = s.getSignerInfos();
SignerInformation signerInfo = (SignerInformation)signers.getSigners().iterator().next();
boolean result = signerInfo.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert.getPublicKey()));
CMSSignedData对象有两个参数: -
1.toverify - 这是已签名的样本字符串
2.contents - 这是获得的签名数据
问题是我只有'内容'和我一起。我必须生成'toverify'部分来验证签名。
如何生成'toverify'字符串?
答案 0 :(得分:3)
您无法从签名中恢复数据。签名是一小块数据,对于给定的签名方案,密钥和表示,它总是大小相同。如果您有签名和公钥,则可以验证签名是否由相应的私钥生成,但仅此信息很少有用。通常,验证签名的目的是验证某些数据是否可信。您需要拥有正在验证的数据!
答案 1 :(得分:0)
我必须生成'toverify'部分来验证签名。
不,不。您应该已经提供了签名以及公钥。否则整个过程毫无意义。没有签名的数据,签名就毫无意义。在任何情况下,您都无法从签名中恢复数据。这不是加密。
答案 2 :(得分:0)
只有一种方法可以做到这一点,我将解释如何:
如果蛮力过于复杂,那么你运气不好。 (单向)散列是签名方案的一个组成部分,并且它们已经设计,如顾名思义不可逆转。
有 - 或更好 - 是RSA的标准,它提供(部分)消息恢复。然而,由于安全问题,该标准ISO 9796第1部分已被撤销。如果你想要一个低开销的签名,现在最好使用ECC签名。