#tmctf のオンライン予選のcrypto400の解法が https://gist.github.com/spake/0472b9fd462cf35c6cb2 にあったので、それに従って解いてみた。

自力で解こうとした際には、二つのメタデータが証明書っぽいことと、 libolecf https://github.com/libyal/libolecf/wiki のolecfexportコマンドでbitsのEncryptionInfoストリームを取り出して、metadata2の証明書が暗号化に使われていることまでは分かったのだけど、そこで詰まっていた。

そこから更に、
* 2つの証明書に含まれるRSA公開鍵を取り出して、
* 素因数が共有されている可能性に気づいて、GCDを使って素因数を求めて、秘密鍵を復元し、
* さらにそれを元の証明書と合わせてpfx形式に変換してWindowsの証明書ストアに格納し、
* docrecryptツールを使って解読する
というところまで必要だったのか。暗号や証明書に関する基礎的な知識、各種ファイル形式の知識に加えて、MS Office のキーエスクローの仕組みの知識なども必要で、よく練られた問題だけれど、こりゃ自分には相当難しい。 CTF上位チームはこういう問題をガシガシ解いてるのだとしたら、凄すぎるな。

GCDを使って素因数を得られる場合があることに関しては、昔以下のような文献で読んだことはあったので、それに気づけなかったのはちょっと悔しい。 もっとも、証明書からの公開鍵の取り出し方すら分かって無かったので、それ以前の問題だったんだけれど。

* Ron was wrong, Whit is right.
  http://eprint.iacr.org/2012/064.pdf

* Factoring RSA Moduli. Part I. | Windows On Theory
  http://windowsontheory.org/2012/05/15/979/

* Factoring RSA Moduli. Part II. | Windows On Theory
  http://windowsontheory.org/2012/05/17/factoring-rsa-moduli-part-ii/

一応、GCDを計算して秘密鍵を復元する部分だけ自分で書いてみたコード:
https://github.com/msakai/tmctf2015-qualifier/blob/3f075602a650da0dc00eb3219a08be472104fb71/crypto400.hs