2017-07-24 152 views
0

我嘗試使用下面的方法來簽署流,但我總​​是得到一個加密異常說,這是不是即使它在文檔中列出一個有效的哈希算法:爲什麼使用RSA簽名時SHA256和無效哈希算法?

byte[] SignData(RSACryptoServiceProvider rsa, Stream stream, string hashName) 
{ 
    HashAlgorithm hash = HashAlgorithm.Create(hashName); 
    byte[] signature = rsa.SignData(stream, hash); 
    return signature; 
} 

我與調用它「SHA256」作爲hashName參數。並在rsa.SignData()被調用的行拋出異常。

這不是使用X509證書,它不是重複的。順便看下面的答案。

+1

僅供參考,對於這些類型的問題,還有[信息安全](https://security.stackexchange.com/)。 –

+0

可能的重複[爲什麼我會得到「無效的算法指定」異常](https://stackoverflow.com/questions/7433074/why-am-i-getting-invalid-algorithm-specified-exception) – anothermh

回答

1

剛剛解決,它不是重複因爲我使用.NET,而不是X509證書的普通的RSACryptoServiceProvider

我碰到了這個帖子: http://hintdesk.com/c-how-to-fix-invalid-algorithm-specified-when-signing-with-sha256/

讀它,它發生在我檢查RSA SignatureAlgorithm和它產生的URI表示這是SHA1所以沒有SHA256或SHA512。然後,我在MSDN文檔中查找該屬性,並說該屬性總是返回該值,因爲它只支持該屬性,所以只有SHA1

1

軟件支持RSACryptoServiceProvider只能夠做使用SHA-2摘要算法當CSP ProviderType值爲24(PROV_RSA_AES)和的ProviderName是 「Microsoft增強RSA和AES加密提供」 RSA簽名(MS_ENH_RSA_AES_PROV)。硬件可能需要或不需要PROV_RSA_AES,只取決於硬件。

RSACng總是可以做使用SHA-2摘要RSA簽名(除非硬件支持和硬件拒絕,但似乎不太可能),以及RSACng還能夠做使用SHA-2摘要RSA OAEP加密(RSACryptoServiceProvider只有PKCS#1 v1.5和OAEP-SHA-1)和RSA PSS簽名。

但是RSACryptoServiceProvider是唯一的內置RSA提供者,直到.NET Framework 4.6.2纔得到整個框架滿意接受RSACng(在4.6中增加)。

至於SignatureAlgorithm屬性,它被硬編碼爲SHA-1 XML值。你無法從中提取任何信息。 (https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsacryptoserviceprovider.cs,e4a5c015070c0714