我有以下代码:
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 [外部代码]
答案 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
时,您已略微更改了模数长度。模数大小现在与密钥大小不同。这可能没有经过良好的测试。
恭喜:)