1

我有由私钥签名的数据。现在如何获取已签名的初始数据?我经历了许多使用 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”字符串?

4

3 回答 3

3

您无法从签名中恢复数据。签名是一小段数据,对于给定的签名方案、密钥和表示,它的大小始终相同。如果您有一个签名和一个公钥,您可以验证签名是由相应的私钥生成的,但仅此信息很少有用。通常,验证签名的目的是验证某些数据是否真实。您需要拥有要验证的数据!

于 2013-08-08T09:27:30.510 回答
0

只有一种方法可以做到这一点,我将解释如何:

  1. 使用公共指数和模数(构成公钥)执行原始模幂运算
  2. 检索用作签名数据一部分的哈希值
  3. 现在通过针对给定哈希尝试所有可能的值来暴力破解纯文本

如果蛮力太复杂,那么你就不走运了。(一种方式)哈希是签名方案不可或缺的一部分,顾名思义,它们被设计为不可逆转的。

有——或者更好的是——提供(部分)消息恢复的 RSA 标准。然而,出于安全考虑,该标准 ISO 9796 第 1 部分被撤销。现在,如果您想要一个开销较低的签名,最好使用 ECC 签名。

于 2013-08-10T18:45:23.857 回答
0

我必须生成“toverify”部分来验证签名。

不,你没有。您应该已经将它与签名以及公钥一起提供。否则整个过程毫无意义。如果没有签名的数据,签名将毫无意义。在任何情况下,您都无法从签名中恢复数据。这不是加密。

于 2013-08-09T00:13:13.637 回答