.NET密码学中SignData()和CreateSignature()之间的区别

时间:2018-07-17 08:38:21

标签: c# .net cryptography

基本上,两者之间有什么区别?

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.SignData(..)

RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(rsa);
RSAFormatter.CreateSignature(...)

在一天结束时都对消息签名,区别在于SignData计算哈希值然后签名,而CreateSignature已经需要哈希消息了,这是正确的吗?

2 个答案:

答案 0 :(得分:3)

两者的输出应该相同。

第一个RSACryptoServiceProvider提供了一个高级API。实际的软件实现是隐藏的。这样,API还可与特殊硬件(例如智能卡)一起使用。提供者只是实际实施的前端。由于硬件可能不提供那种功能,因此可能不需要预先计算的哈希值。最后,如果可以使用PSS实现,则该API也可以用于使用PSS填充的签名。

第二个RSAPKCS1SignatureFormatter仅提供部分功能。例如,它不提供计算的哈希部分,并且不执行签名验证。它很可能用于受管代码中RSACryptoServiceProvider的实现。它是直接实现加密原语的较低级API的一部分。

  

...区别在于SignData先计算哈希值然后签名,而CreateSignature已经需要哈希消息,这是正确的吗?

是的,即使rgbHash的描述为“要签名的数据”,这也是.NET文档中的另一个混蛋。 example code清楚地表明,确实需要散列的字节 ,而不是消息本身。签名生成包括对数据进行哈希处理,因此将其描述为“要签名的数据”是完全错误的。

答案 1 :(得分:2)

RSAPKCS1SignatureFormatter是对象API的一部分,允许分隔“我希望对此签名”和“我知道我想要哪种签名”。其CreateSignature方法仅调用RSA.SignHash(with a bit of reflection overload magic)。

RSA.SignData仅computes the hash of the input and calls RSA.SignHash

因此,其想法是,如果您知道自己具有RSA密钥并且正在执行RSA签名,则只需使用RSA类。如果您是SignedCms或SignedXml之类的通用组件,则可以使用AsymmetricFormatter,然后向其提供数据以获取签名。但是,实际上,最终在签名周围存在太多上下文,这些类通常无法使用。 CMS,X.509和xmldsig均具有不同的上下文数据,而AsymmetricFormatterAsymmetricDeformatter类并没有真正的帮助。因此,ECDSA,RSA-PSS和FIPS 186-3对DSA的重新访问并未添加它们。