[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くらい複雑なシステムになるとアルゴリズムの追加も大変ですね。