【问题标题】:Program crashing when Applying SHA-256/SHA-512 instead of SHA-1 when signing documents with RSA使用 RSA 签署文档时应用 SHA-256/SHA-512 而不是 SHA-1 时程序崩溃
【发布时间】:2025-12-24 20:40:11
【问题描述】:

首先我生成一个签名并放在 txt_EmpSignature 文本框中,然后我在“签名”按钮单击事件处理程序中使用以下参数来签署文档:

RSACryptoServiceProvider MySigner = new RSACryptoServiceProvider();
openFileToSign.ShowDialog();
FileStream file_to_sign = new FileStream(openFileToSign.FileName, FileMode.Open, FileAccess.Read);
BinaryReader reader_to_sign = new BinaryReader(file_to_sign);

byte[] data_to_sign = reader_to_sign.ReadBytes((int)file_to_sign.Length);
MySigner.FromXmlString(txt_EmpSignature.Text);
SHA1CryptoServiceProvider SHA = new SHA1CryptoServiceProvider();
byte[] signature_to_sign = MySigner.SignData(data_to_sign,SHA);
UTF8Encoding UTF = new UTF8Encoding();
txt_DocSignature.Text = Convert.ToBase64String(signature_to_sign);
reader_to_sign.Close();
file_to_sign.Close();  

然后,当我将“SHA1CryptoServiceProvider”替换为“SHA256CryptoServiceProvider”时,我得到了一个我无法指定的未处理异常!
处理 SHA-2 算法而不是 SHA-1 时有什么区别吗?

EDIT1:

当我指定文件并在“openFileToSign”打开文件对话框中单击“打开”时发生异常。我正在开发“WINDOWS 7”

EDIT2:

异常消息显示“值无效”
并且异常发生在以下行:

byte[] signature_to_sign = MySigner.SignData(data_to_sign,SHA);

【问题讨论】:

  • 异常的名称/内容是什么。您有权访问堆栈跟踪吗?还有......你从哪里得到它,哪条线?
  • @Skurmedel,我刚刚编辑了问题以包含一般异常的消息,因为我无法指定确切的类型。
  • 您“无法指定”是什么意思?只需将异常复制并粘贴到您的问题中即可。

标签: c# .net cryptography rsa digital-signature


【解决方案1】:

回答我自己的问题,因为我终于在这个article 中找到了答案。
结果发现 CryptoConfig 不理解 SHA256CryptoServiceProvider
相反,我们使用 SHA256Managed 来生成哈希,然后一切都会很好地工作。

【讨论】:

  • 对此投票不够。我阅读的所有其他解决方案都涉及修改 machine.config 也没有解决问题。谢谢!
【解决方案2】:

如果你不说确切的例外,很难说。但请注意,旧版本的 Windows 不支持 SHA-2。它已被添加到 Windows XP SP3 和 Windows 2003 Server 中的修补程序或其他东西中。见this post

【讨论】:

  • 我编辑了我的问题以说明我正在使用 Windows 7 :-)
  • 谢谢 - 不过,您还没有告诉我们异常是什么。
【解决方案3】:

我的猜测是您正在尝试使用 512 位密钥。 512 位密钥太短,无法与 SHA-256 一起使用(没有足够的空间用于最小填充)。

尝试改用 1024 位或 2048 位密钥。

【讨论】:

  • 我想到了这一点,并尝试生成具有不同大小“512、1024、2048”的密钥,但我仍然得到相同的结果。
最近更新 更多