ちょっと前に発生した社会問題ともなったセキュリティ問題について相談が結構あったので、特に頼まれた訳ではないがMS-Office製品などの暗号化済み判定プログラムを作ってみた。
Office製品のDLLを利用して暗号化等を判定する手法を試したが、これは余りにも遅い(1ファイルに1秒もかかっていては・・)ので使い物にならないことが判明。
他にも「xd2txlib.dll」を利用した汎用テキスト抽出ツールを利用する手もあったが、これも利用ができない局面があって断念。
結局、バイナリ検索を用いることとなった。
そもそもOffice2003以降で扱ったファイルは拡張子が「XSLX」「DocX」など最後に「X」が付いている。なんでかなあ~と思っていたがどうも「XMLS」の「X」らしい。
実体は、XMLSでデータを記述しZip圧縮してある。したがって、XSLXをZipにリネームするとZipとして扱うことができることが判明。
ダンプを調べると「XLSX」形式ファイルには暗号化がされていれば特定文字列を保有することが判明(「Microsoft Enhanced Cryptographic」「EncryptedPackage」など)
本当は別の場所に暗号化フラグが立っていると思うけど、英語の内部文書を読むことが不可能 orz
2003以前に生成されたファイル(拡張子が「xls」の場合)でも、2003以降のプログラムから一回でも保存すれば暗号化する形式が変わってしまうなど、問題はちょっと複雑(いかにもMS社の泥縄製品)
2003以前の暗号化ファイルはハッシュ(00以外の値)が内部に含まれているはずだが、アドレスなどの資料が古くて見つからない(仕様書らしき物は発見したがこれも膨大な英語資料・・・)
困ったことである。
結局、力任せの文字検索方式にしかできなかった。速度はかなり速いが文字がヒットしなければ取りこぼしてしまう。
リリースがちょっと不安