1

我正在阅读这篇文章,有两个字节数组,一个用于签名数据,一个用于原始数据。

 byte[] originalData = ByteConverter.GetBytes(dataString);
 byte[] signedData;

我们签署数据,这部分没问题,但我无法理解为什么要使用原始数据进行验证?

// Hash and sign the data.
   signedData = HashAndSignBytes(originalData, Key);

// Verify the data and display the result to the
// console.
   VerifySignedHash(originalData, signedData, Key);

举个例子,我们在服务端签署一个数据并发送给客户端,客户端想知道我是否发送了那个数据,为什么我要发送原始数据直到客户端可以验证呢?

有一些帖子以同样的方式做到了:

4

2 回答 2

1

当通过signedData另一部分时,不知道是什么originalData,就这样。
要进行验证,您需要signedData和 [originalData和 public-key ]。

上述代码中的VerifySignedHash函数调用RSACryptoServiceProvider.VerifyData.


文档

通过使用提供的公钥确定签名中的散列值并将其与提供的数据的散列值进行比较来验证数字签名是否有效。

于 2020-08-26T07:10:40.460 回答
1

加密哈希函数 hash(x) 具有某些理想的属性:

  1. 单向:hash(x) 给你 y。给定 x,很容易计算 y。但反过来,给定 y,找到 x 可能非常困难或不可能。
  2. 冲突:由于输入的大小(以位为单位)远大于散列大小(例如:我们可以计算千兆字节数据的 SHA-256),理论上多个输入可以产生相同的散列。尽管理论上是这种情况,但哈希算法旨在将实际设置中的冲突降至最低。
  3. 不可预测性:输入的微小变化会导致生成完全不同的哈希值。这有助于检测数据篡改(例如:将付款从 100.00 美元更改为 10000 美元)

这些是使哈希适用于加密签名和验证这些签名的一些属性。

为什么要使用原始数据进行验证(释义)

发送原始数据可以让接收方独立重新计算哈希,并比较发送方发送的哈希签名值,以确保接收到的数据与发送方发送的数据相同。

于 2020-08-26T07:29:38.713 回答