在数字签名中,如果数据发生变化,签名会改变吗?

In Digital Signature , if data changes, will signature change?

我正在使用自签名证书对数据进行签名,因为我观察到在对数据进行签名后,将签名捕获到文件中,并注意到签名在数据更改时一直在更改。这是在目的地使用此签名验证数据的挑战。

问题是验证者如何在每个实例中使用更改的签名来验证数据,希望了解。

如果数据改变,签名也每次都会改变?

是的,每次数据变化都必须重新计算签名值。但是,用于验证数据的 public 密钥保持不变。因此,只要您获得了数据、签名和相应的、受信任的 public 密钥,您就可以验证数据。

通常一个签名由一个加密安全的单向散列和两个相关的非对称转换组成,这两个转换依赖于 - 希望 - NP-hard 问题。一种方法是通过消息计算散列;不可能找到将产生相同散列值的第二条消息。然后使用私钥将此哈希值转换为签名,编码为多个字节。收到数据后,将重新计算哈希值,并使用计算出的哈希值和签名值作为输入并使用 public 密钥作为输入来调用验证函数。

例如,对于 RSA(使用 PKCS#1 填充时),验证函数只是检索单向哈希函数,因此可以比较两者。显然,如果数据不同,这将失败。它应该,否则任何有权访问数据的人都可以在签名无效的情况下更改它。其他函数使用散列作为输入,可能不会直接比较散列函数。


如果您想增量更新签名,您可以查看哈希(或 Merkle)树。您可以存储 Merkle 树,只重新计算已更改元素的哈希值。您还可以在树中添加或删除哈希。但是,您仍然必须对生成的最顶层哈希值执行私钥操作。