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、例外がキャッチされ、適切に処理されます。

秘密鍵から 1 文字を変更すると、アプリケーションがクラッシュして終了するのはなぜですか? たとえば、" <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 に答える