none
C#でW3C方式の暗号化を実装するには RRS feed

  • 質問

  • ファイルの暗号化を行いたいのですが、W3Cで提示されている暗号化方法(例えば「http://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html#kw-aes128」など)で暗号化した際、第三者が開発したプログラムでも同じパスワードで複合化できるよう互換性を保ちたいと考えています。

    .NET FrameworkのAPIにはAESなどの暗号化ルーチンが用意されていますが、これらのクラスを使っての実装は可能でしょうか。

    2010年10月13日 13:12

回答

  • 実践したことはありませんが、XML暗号化とXMLデジタル署名 に手順は書かれています。そこには例示されたkw-aes128を示すURLフィールド も用意されているので実現できると思います。
    • 回答の候補に設定 山本春海 2010年11月2日 2:09
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月13日 14:42
  • 外池と申します。

    よくよく考えて頂きたいのですが、マシンのハードウェアもプログラムの実装も異なる2つの環境の間で、暗号化されたデータをやりとりしようとすれば、暗号化に関するインターフェイスやアルゴリズムは厳密に定められていなければなりません。その点で「変換の決まり事があるというわけでもなさそうです。」というご理解は、不用意過ぎると思います。

    最初にお示しになったURLの資料で、特に着目されている「kw-aes128」の部分ですが、これは、暗号化につかった鍵(Key)をさらに暗号化するためのものです。データ(ファイル)全体をブロックに分けて暗号化する方法は、同じURLの「5.2」で説明されており、IVも現れます。こちらを読まれることをお奨めします。私がざっと読んだところ「5.2.1」のTriple DESは、.Net Frameworkで用意されているTriple DESのクラスと互換なように思います。


    (ホームページを再開しました)
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月14日 10:17
  • 外池です。すいません、補足です。

    そもそも・・・、最初に示されたURLは、XMLの暗号化に関するものですよね? ご質問に対する解が直接見つかるものではないように思います。それよりも、例えばTriple DESについては、参考文献として挙げられている「ANSI X9.52: Triple Data Encryption Algorithm Modes of Operation. 1998.」をご覧になるべきかと思います。


    (ホームページを再開しました)
    • 回答の候補に設定 山本春海 2010年11月2日 2:09
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月14日 10:27
  • 外池です。文字で覚えられるパスワードをKeyやIVのバイト列に変換するための方法は、いくつかサンプルがあります。http://blogs.msdn.com/b/shawnfa/archive/2004/04/14/113514.aspx とか。

    RFCだと、RFC2898(http://www.ietf.org/rfc/rfc2898.txt)が良いようですね。.Net FrameworkにRfc2898DeriveBytesというクラスで用意されています。

    ただ・・・、Tank2005さんが互換性を持たせたいと考えておられる他のソフトがどのような方式を採用しているのかがわかりませんので、ここまでかなぁ。


    (ホームページを再開しました)
    • 回答の候補に設定 山本春海 2010年11月2日 2:09
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月14日 13:29

すべての返信

  • 実践したことはありませんが、XML暗号化とXMLデジタル署名 に手順は書かれています。そこには例示されたkw-aes128を示すURLフィールド も用意されているので実現できると思います。
    • 回答の候補に設定 山本春海 2010年11月2日 2:09
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月13日 14:42
  • 追記事項です。

    .NET Frameworkの暗号化クラス「RijndaelManaged」の場合、暗号化の際にKeyとIVの2つの項目の値が必要となります。一方、ファイルのやりとりに用いる暗号化はユーザーが任意で作成したパスワードとなる文字列の1つだけが必要となります。普通に考えるとこの文字列をKeyとIVに変換して・・・と、なるのでしょうが、ネットでわかる範囲では、変換の決まり事があるというわけでもなさそうです。

    2010年10月14日 9:37
  • 外池と申します。

    よくよく考えて頂きたいのですが、マシンのハードウェアもプログラムの実装も異なる2つの環境の間で、暗号化されたデータをやりとりしようとすれば、暗号化に関するインターフェイスやアルゴリズムは厳密に定められていなければなりません。その点で「変換の決まり事があるというわけでもなさそうです。」というご理解は、不用意過ぎると思います。

    最初にお示しになったURLの資料で、特に着目されている「kw-aes128」の部分ですが、これは、暗号化につかった鍵(Key)をさらに暗号化するためのものです。データ(ファイル)全体をブロックに分けて暗号化する方法は、同じURLの「5.2」で説明されており、IVも現れます。こちらを読まれることをお奨めします。私がざっと読んだところ「5.2.1」のTriple DESは、.Net Frameworkで用意されているTriple DESのクラスと互換なように思います。


    (ホームページを再開しました)
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月14日 10:17
  • 外池です。すいません、補足です。

    そもそも・・・、最初に示されたURLは、XMLの暗号化に関するものですよね? ご質問に対する解が直接見つかるものではないように思います。それよりも、例えばTriple DESについては、参考文献として挙げられている「ANSI X9.52: Triple Data Encryption Algorithm Modes of Operation. 1998.」をご覧になるべきかと思います。


    (ホームページを再開しました)
    • 回答の候補に設定 山本春海 2010年11月2日 2:09
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月14日 10:27
  • 「変換の決まり事」は暗号化アルゴリズムを指したものではなかったのですが、誤解を招く表現であったようなのでお詫びします。今の状況では解決のめどが立ちそうにないため、海外のMSDNフォーラムに誘導することにします。

    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3965168d-ac29-4d48-a355-b71e22d65894

    2010年10月14日 10:35
  • 相変わらず実践したこともなく書きますが、aes128-cbc ならこう書かれてます。

    [AES] is used in the Cipher Block Chaining (CBC) mode with a 128 bit initialization vector (IV). The resulting cipher text is prefixed by the IV. If included in XML output, it is then base64 encoded.

    暗号には詳しくないんですが、IVが必要な場合も埋め込まれてる場合もあるってこと…?

    2010年10月14日 10:36
  • 外池です。

    「変換の決まり事」は、もちろん、暗号化アルゴリズムだけじゃなくて、ユーザーフレンドリーな文字で覚えられるような「パスワード」をビット列のKeyやIVにどのように変換するかの関係もあることは理解しています。

       それこそを決めるべき(独自のプログラムを書くなら)、あるいは、

       それこそを調べるべき(他のプログラムと互換性を持たせたいなら)

    と思いますが、違いますかね? 海外フォーラムに投稿された記事によれば、特定の文書フォーマットに取り組まれているようですので、後者ですよね?

    で、特定の文書フォーマットの記事をざっと読んでみたのですが、これを読んだだけではすぐに暗号化の実装は難しいと思います。ご覧になっている記事に書かれていることは、どのようなアルゴリズムを用いて文章が暗号化されているかを示すメタデータの説明ですから・・・。


    (ホームページを再開しました)
    2010年10月14日 12:12
  • 外池です。文字で覚えられるパスワードをKeyやIVのバイト列に変換するための方法は、いくつかサンプルがあります。http://blogs.msdn.com/b/shawnfa/archive/2004/04/14/113514.aspx とか。

    RFCだと、RFC2898(http://www.ietf.org/rfc/rfc2898.txt)が良いようですね。.Net FrameworkにRfc2898DeriveBytesというクラスで用意されています。

    ただ・・・、Tank2005さんが互換性を持たせたいと考えておられる他のソフトがどのような方式を採用しているのかがわかりませんので、ここまでかなぁ。


    (ホームページを再開しました)
    • 回答の候補に設定 山本春海 2010年11月2日 2:09
    • 回答としてマーク 山本春海 2010年11月4日 5:22
    2010年10月14日 13:29
  • こんにちは、Tank2005 さん

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。

    今回、皆様からアドバイスをいただきましたので、有効な情報と思われるものに勝手ながら一旦回答としてマークさせていただきました。
    回答くださった皆さん、ありがとうございました。

    実装された結果、またその上で疑問点などありましたら、詳しい状況を再投稿いただければと思います。
    また、他の方も、もしこのスレッドの内容に関して何か情報をお持ちの方がいらっしゃいましたら、是非情報提供をお願いいたします。

    今後とも、MSDN フォーラムをよろしくお願いいたします。
                                                                                     
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2010年11月4日 5:29