2009-04-17

続 .NET Framework のRSA署名用ハッシュアルゴリズム  [by miyachi]

[2011-04-25 追記] .NET FrameworkによるRSA-SHA2署名(完結編)を投稿しました。

2008-05-26に「.NET Framework のRSA署名用ハッシュアルゴリズム」として、WindowsのXP環境で .NET Framework において、RSA署名を使うクラスRSACryptoServiceProviderの検証メソッドVerifyDataがRSA-SHA2の署名に対応していないと書きました。今日別件もあり.NETのXML署名関連を調査していて、確認の為にRSA-SHA2の署名と検証を試したところ問題なく動作していました!以前は例外になった箇所がきちんと動作しています。以下はC#で試したコードです。

 RSACryptoServiceProvider key
    = new RSACryptoServiceProvider(2048);
 Byte[] target = Encoding.UTF8.GetBytes("TEST DATA");
 Byte[] sign = key.SignData(target, "SHA512");
 bool verify = key.VerifyData(target, "SHA512", sign);
 if (verify)
  Console.WriteLine("RSA-SHA2 Verify: OK : valid.");
 else
  Console.WriteLine("RSA-SHA2 Verify: NG : faild !!!!!");

う~む何時OKになったんでしょう?少なくとも昨年11月の時点では例外になる事を確認していたのですが… まあいずれにせよRSA-SHA2対応してくれたのはありがたいですね。もう少し調査をして何か分かればまた書きましょう。ちなみに過去の記事も更新しました。

なおXML署名のクラスであるSignedXmlではまだRSA-SHA2署名には対応していないようです。

[2009-05-03 追記]
XMLコンソーシアムWeek向けに調査をしていて、以前ある方からご指摘頂いた現象を確認。実はSignDataメソッドをPKCS#12形式の証明書+秘密鍵から取得した鍵を使うと例外になると言うものだ。しかも例外は「無効なアルゴリズムが指定されました。」と言うもの。どこかでSHA-2に対応できていないに違いない(^^; 参考までにXP環境で例外になるソースを張っておきます。

 X509Certificate2 cert =
   new X509Certificate2("testcert.p12", pkcs12Pswd);;
 RSACryptoServiceProvider key =
   (RSACryptoServiceProvider)cert.PrivateKey;
 Byte[] target = Encoding.UTF8.GetBytes("TEST DATA");
 // Exception !!
 Byte[] sign = key.SignData(target, "SHA512");
 bool verify = key.VerifyData(target, "SHA512", sign);
 if (verify)
  Console.WriteLine("RSA-SHA2 Verify: OK : valid.");
 else
  Console.WriteLine("RSA-SHA2 Verify: NG : faild !!!!!");

Windowsくらい複雑なシステムになるとアルゴリズムの追加も大変ですね。
2009-04-17 17:23:34 - miyachi - - [PKI/暗号] -