即使异常被捕获,应用程序也会崩溃(关闭)

时间:2013-08-10 07:38:20

标签: c# encryption key private

我有以下代码:

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;
}

现在,如果我更改私钥中的字符,即使代码包含在try catch块中,应用程序也会在行rsa.FromXmlString(private_key)上崩溃并关闭。另一方面,如果我将私钥设置为无意义的值,例如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 bytes       System.Windows.dll!System.Windows.Controls.Button.OnClick()+ 0x1f bytes
      System.Windows.dll!System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e)+ 0x4e bytes
      System.Windows.dll!System.Windows.Controls.Control.OnMouseLeftButtonUp(System.Windows.Controls.Control ctrl,System.EventArgs e)+ 0xc bytes
      System.Windows.dll!MS.Internal.JoltHelper.FireEvent(System.IntPtr unmanagedObj,System.IntPtr unmanagedObjArgs,int argsTypeIndex,int actualArgsTypeIndex,string eventName)+ 0x115 bytes       [外部代码]

2 个答案:

答案 0 :(得分:1)

  

另一方面,如果我将私钥设置为无意义的值   例如blablabla,异常被抓住并妥善处理。

表明不同的文化背景

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

更新的 RSA.FromXmlString方法

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

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

http://tools.ietf.org/html/rfc3447#appendix-A.1.1

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

答案 1 :(得分:1)

我认为你刚刚发现了一个错误。我假设解析了键值,然后将其传递给底层本机库。在底层库或其周围的包装函数中,不会正常处理错误。请注意,当您将私钥从z更改为A时,您已略微更改了模数长度。模数大小现在与密钥大小不同。这可能没有经过良好的测试。

恭喜:)