【问题标题】:Equal length for input and output of signature generation签名生成的输入和输出长度相等
【发布时间】:2012-11-21 12:34:57
【问题描述】:

我想对长度为300位的文本生成数字签名,在得到的签名中添加一些新的文本,然后对生成的文本进行签名。

我使用了 Bouncy Castle 函数并意识到在 RSA 签名方案中,密钥的大小必须大于输入长度。获得的输出长度等于密钥大小,并且通过添加新文本,密钥大小必须更大。但是,我想使用 one key 进行签名。 例如,我第一次开始使用 512 位密钥,但对于第二次签名,我必须使用 1024 位密钥,而我有一个用于签名的密钥。

我该怎么做?有可能(用 Java 或任何语言)吗?

【问题讨论】:

  • 这是你想要做的吗? Sign(Sign(text)+new_text) AND 你想用一个键同时做“Sign”吗?

标签: encryption signing


【解决方案1】:

如果你坚持只用512-bit键,一次可以签到的最大数据长度是53 bytes=424 bits,所以你要拆分数据单独签.

例如 -

假设你做第二次签名前的数据长度是500 bits,那么 将其分成两组 - 424 bits66 bits。然后分别对这两个签名并连接结果。

编辑

还有另一种方法可以做到这一点,只使用 1 个键 -

  • 具有2048 bits 的密钥大小。您可以签署最长为245 bytes=1960bits 的数据。
  • 在第一次签名操作和添加附加信息之后,即在 Sign(data)+info 之后,执行 SHA-512 结果摘要。这会将结果压缩为 64 字节。
  • 然后再次签名 使用相同的密钥。

    简而言之-Sign(SHA-1(Sign(data)+info))

    注意:您也可以使用 1024-bit 的密钥长度进行上述签名。

【讨论】:

  • 感谢您的回复。但如果我使用 1024 位密钥,输出长度将为 1024 位,并且对于第二次签名,必须使用更大的密钥。
  • @leylamoazami :是的,这是真的。然后你可以尝试我所说的第二种方法,即分裂。我已经从答案中删除了第一种方法。
  • @leylamoazami :如果您想使用 RSA 签名,那么拆分是唯一的方法。拆分 - 符号 - 连接(加入)
  • @leylamoazami:你为什么要签两次?我只是问,因为如果我知道原因,我可能会提供更好的解决方案。
  • 因为我在模拟小额支付,任何一个获得硬币的人都必须在其中添加一些信息并签名并将硬币转移给另一个人。谢谢,我会试试你的解决方案。
【解决方案2】:

您为什么不编写一个简单的算法来创建另一个(为您的虚拟标志),只需将标志加密成一些代码,然后同时使用它们。

它将为您解决两个目的。

  • 您将拥有两个不同的签名
  • 您将能够使用您拥有的唯一密钥

希望它对你有用:)

【讨论】:

  • 我不明白你的意思。我想使用标准签名功能。
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多