質問するのは奇妙な質問ですが、試してみます。SHA256を使ってXMLを署名しないでください。
ターゲットフレームワークを4.5.2として使用してプロジェクトを開始しました。要件はSHA1アルゴリズムを使用してXMLファイルに署名することでした。私は、このMSDNのページで例を使用し、それがうまく働いた:
はその後、要件はSHA256アルゴリズムに変更しました。私は、元のコードを適応させるためにそれらのページ内のコードを使用し、それがうまく働いた、私はその時によって、ターゲットフレームワークとして4.6を使用していました:
https://blogs.msdn.microsoft.com/winsdk/2015/11/14/using-sha256-with-the-signedxml-class/
の.NET Framework 4.6.2が追加されますRSA-SHA256 を使用してXML文書に署名するためのサポート
[Iは、2つの以上のリンクを投稿することができません]それから私は、フレームワークのバージョン4.6.2がSHA256を完全にサポートを追加したことを発見し、暗号いますConfig.AddAlgorithm()呼び出しはもはや必要ではありませんでした。プロジェクトをバージョン4.6.2に変更し、必要な変更を加え、CryptoConfig.AddAlgorithm()呼び出しについてコメントしました。うまくいきました。
しかし、私たちのソフトウェアはWindows XPで動作するように変更しました(はい、まだ使用しています)。XP(SP3)で動作する最後のフレームワークバージョンはv4.0です。したがって、SHA256を使用してXMLファイルに署名することがフレームワーク4.0で機能するかどうかをテストする必要がありました。
ターゲットフレームワークをv4.0に変更して変更を開始しました。私がCryptoConfig.AddAlgorithm()呼び出しで使用したRSAPKCS1SHA256SignatureDescriptionクラスは、フレームワーク4.5以降でしか使用できないため、一部のWebページで見たように、独自のバージョンを作成する必要があります。
しかし、今は変です。私はCryptoConfig.AddAlgorithm()コールが何が起こるかを見るためにコメントしたので、私はカスタムクラスを書くことができましたが、ちょうどうまくいきました!
私は、CryptoConfig.AddAlgorithm()がプロジェクトまたは自分のマシンのどこかにアルゴリズムを登録していると考えました。私はそれについて研究しましたが、何も見つかりませんでした。だから私は別のマシンで試してみましたが、それも機能しましたが、そのマシンは前のコードを実行していた可能性があります。私は別のマシンを試しました。そのマシンは確かではありませんでしたが、そこでも働いていました。
私はプロジェクトを見たことがないマシンに行きました。その時、私はそれをコンパイルし、実行可能ファイルを配備しました(他のマシンでVSプロジェクトを実行していました)。そのマシンで4.0以降の.NET Frameworkをすべて削除し、アプリケーションを実行しようとしました。そして...それはまだ動作します! SHA256を使ってXMLに署名し、正常に動作します。これらのマシンはすべてWindows 10を実行しています。
何が起こっているのですか?
多くの場合、暗号アルゴリズムは互換性を維持するために古いバージョンにバックポートされます。それはそのような非常に簡単な答えかもしれません。あなたがWindows XPをインストールし、最初に4.0のものをインストールすると失敗することがあります。Microsoftは実際のバージョン情報を保持していないという厄介な癖を持っていることに注意してください(4.0.0と4.0.999のファイルは同じファイル名を持ち、最後の変更日で区別されます)。 –
しかし、実際には奇妙なのは、コードをSHA256に適合させ始めたときに、CryptoConfig.AddAlgorithm()呼び出しがなければ動作しなかったということです。フレームワーク4.6を使用していますそして今、フレームワーク4.0で動作します。私はちょうどそれを行い、クリーンなWindows XP SP3をインストールした仮想マシンを作成し、何が起こるかを見てみましょう。 –