2013-08-10 3 views
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), даже если код завернут в блок catch try. С другой стороны, если я установил закрытый ключ на бессмысленное значение, такое как blablabla, исключение поймано и обработано изящно.

Почему приложение сбой и закрытие при изменении одного символа из закрытого ключа? Например, если я изменил «<RSAKeyValue><Modulus>zDYX4tbHSy....» на «<RSAKeyValue><Modulus>ADYX4tbHSy....», (изменен z на A) приложение аварийно завершает работу. Приложение является приложением Windows Phone, но я думаю, что это не должно меняться.

Update

Это стек вызовов непосредственно перед тем, исключение:

MobileApp.dll MobileApp.Classes.SignatureMobile.GenerateSignature (System.Collections.Generic.List text_list) Строка 38 C# MobileApp.dll! MobileApp.StartPage.Button_LogIn_Click (отправитель объекта, 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 е) + 0x4e байт
системы .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, внутр argsTypeIndex, внутр actualArgsTypeIndex, строка именем_события) + 0x115 байт [External Code]

+0

Предположительно у вас есть трассировка стека для аварии - что это такое? –

+1

Какой тип исключения? –

+0

@SriramSakthivel Я не знаю. Фактически, Visual Studio не сообщает об исключении. Приложение просто закрывается в эмуляторе, вот и все. – Matthew

ответ

1

Я думаю, вы только что обнаружили ошибку. Я полагаю, что ключевое значение анализируется, а затем передается в базовую библиотеку. Ошибка не обрабатывается изящно в базовой библиотеке или вокруг нее. Обратите внимание, что вы немного изменили длину модуля, когда вы изменили закрытый ключ от z до A. Размер модуля теперь отличается от размера ключа. Возможно, это не было хорошо проверено.

Поздравляем :)

+0

Было бы интересно попробовать это с помощью открытого ключа. Если это работает, возможно, вы обнаружили уязвимость. –

+0

Спасибо, hehe :) Я еще не пробовал это с открытым ключом. – Matthew

+1

Пожалуйста, сообщите нам, как вы с этим согласны, я лично создаю отчет об ошибке для библиотеки. –

1

На с другой стороны, если я установил закрытый ключ на бессмысленное значение , например blablabla, исключение поймано и обработано изящно.

, что предполагает различные настройки культуры

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

Обновление: RSA.FromXmlString Метод

FromXmlString инициализирует объект RSA с использованием ключевой информации в строке XML, который был сгенерирован с помощью метод ToXmlString. Метод FromXmlString принимает либо строку XML, содержащую открытый ключ, либо строку XML, содержащую открытый и закрытый ключ.

этот метод ожидает действительный RSA ключ. Действительно в соответствии с требованиями:

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

Если вы используете секретный ключ, как не описано не удивительно, что он генерирует исключение, как секретный ключ состоит как государственные, так и частные ключи. С другой стороны, бессмысленный ключ может быть интерпретирован только как открытый ключ.

+0

Спасибо :) Я рассмотрю вопрос :) Спасибо :) – Matthew

+0

UnicodeEncoding encoding = new UnicodeEncoding(); byte [] data = encoding.GetBytes (text_string.ToString()); вы уверены, что строка после кодировки соответствует шаблону? –

+0

Да, строка отлично подходит после вызова, поскольку сервер аутентифицирует вызов. Когда закрытый ключ остается неизменным, программа работает отлично. Это когда я изменяю один символ в закрытом ключе, где программа сбой. Однако, если я установил секретный ключ на нечто бессмысленное, например «hellothere :)», исключение поймано и обработано изящно. Я знаю, это очень странно. – Matthew

Смежные вопросы