3

我有以下代码:

public byte[] GenerateSignature(List<string> text_list)
        {
            StringBuilder text_string = new StringBuilder();
            string private_key = "<RSAKeyValue><Modulus>zDYX4tbHSy....";
            byte[] digital_signature = null;

            for (int i = 0; i < text_list.Count; i++)
            {
                text_string.Append(text_list[i]);
            }

            try
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(private_key);

                RSAPKCS1SignatureFormatter rsa_form = new RSAPKCS1SignatureFormatter(rsa);
                rsa_form.SetHashAlgorithm("SHA1");

                SHA1Managed sha1 = new SHA1Managed();
                UnicodeEncoding encoding = new UnicodeEncoding();
                byte[] data = encoding.GetBytes(text_string.ToString());
                byte[] hash = sha1.ComputeHash(data);
                digital_signature = rsa_form.CreateSignature(hash);
            }
            catch (Exception)
            {
                digital_signature = Encoding.Unicode.GetBytes("false");
            }
            return digital_signature;
}

现在,如果我更改私钥中的一个字符,rsa.FromXmlString(private_key)即使代码包含在 try catch 块中,应用程序也会崩溃并在线关闭。另一方面,如果我将私钥设置为无意义的值,例如blablabla,则会捕获并优雅地处理异常。

当我从私钥更改单个字符时,为什么应用程序会崩溃并关闭?例如,如果我将“ <RSAKeyValue><Modulus>zDYX4tbHSy....”更改为“ <RSAKeyValue><Modulus>ADYX4tbHSy....”,(将 z 更改为 A)应用程序崩溃并关闭。该应用程序是一个 Windows Phone 应用程序,但我想这应该没什么区别。

更新

这是抛出异常之前的调用堆栈:

MobileApp.dll!MobileApp.Classes.SignatureMobile.GenerateSignature(System.Collections.Generic.List text_list) 第 38 行 C# MobileApp.dll!MobileApp.StartPage.Button_LogIn_Click(object sender, System.Windows.RoutedEventArgs e) 第 74 行 + 0x4 字节 C# System.Windows.dll!System.Windows.Controls.Primitives.ButtonBase.OnClick() + 0x1f 字节 System.Windows.dll!System.Windows.Controls.Button.OnClick() + 0x1f 字节
System.Windows.dll!System。 Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) + 0x4e 字节
System.Windows.dll!System.Windows.Controls.Control.OnMouseLeftButtonUp(System.Windows.Controls.Control ctrl, System.EventArgs e) + 0xc 字节
System.Windows.dll!MS.Internal.JoltHelper.FireEvent(System.IntPtr unmanagedObj, System.IntPtr unmanagedObjArgs, int argsTypeIndex, int actualArgsTypeIndex, string eventName) + 0x115 字节 [外部代码]

4

2 回答 2

1

另一方面,如果我将私钥设置为无意义的值(例如 blablabla),则会捕获并优雅地处理异常。

这表明不同的文化背景

http://msdn.microsoft.com/en-US/library/system.globalization.cultureinfo.aspx

更新: RSA.FromXmlString 方法

FromXmlString 使用使用 ToXmlString 方法生成的 XML 字符串中的密钥信息初始化 RSA 对象。FromXmlString 方法接受包含公钥的 XML 字符串或包含公钥和私钥的 XML 字符串。

此方法需要有效的 RSA 密钥。根据规格有效:

https://www.rfc-editor.org/rfc/rfc3447#appendix-A.1.1

如果您按照描述使用私钥,难怪它会生成异常,因为私钥包含公钥和私钥。另一方面,无意义的密钥可能仅被解释为公钥。

于 2013-08-10T08:03:15.100 回答
1

我想你刚刚发现了一个错误。我假设键值被解析,然后传递给底层的本机库。该错误在底层库或围绕它的包装函数中没有得到妥善处理。请注意,当您将私钥从 更改为 时,您已经稍微更改了模数z长度A。模数大小现在与密钥大小不同。这可能没有经过很好的测试。

恭喜:)

于 2013-08-10T11:38:26.013 回答