バイナリ列の解答/解説(序章)
ということで解答と解説を。
今回は始めなので解答よりもまずは解けるためのスタート地点に持っていくことがメインです。
自力でやりたい方は読まないことをお勧めします。
では続きから解説を。
始めに
見てわかるとおり16進数がずらっと並んでいます。
なので、まずはこの16進数の文字列をバイナリデータに落とすことから始めましょう。
また、16進数のデータが並んでいる以上バイナリエディタは必須と考えておきましょう。
ということで、まずはバイナリエディタを準備してください。
ちなみに私はStirlingを愛用させてもらってます。
が、私は各個人が好きなバイナリエディタを使えばいいと思うよ!よ!
16進数 => バイナリ
さて、16進数の文字列をバイナリに落とす方法です。
何らかの手段を各自準備してください。
私は16進数の文字列をバイナリデータに変換するいいソフトを知らないので自分で書いてしまいました。
これぐらいであれば簡単ですしね。
一応下にそのソースコードを貼りつけておきます。
#include <iostream> #include <fstream> #include <string> using namespace std; int main( int argc, char *argv[] ) { string s; if( argc < 3 ) { cout << "Usage : " << argv[0] << " infile outfile" << endl; return 1; } ifstream in( argv[1] ); ofstream out( argv[2], ios_base::binary | ios_base::out ); if( !( in.is_open() && out.is_open() ) ) { cout << "Can't open file." << endl; return 1; } while( in >> s ) { char c; int j = 0; for( int i = 0 ; i < s.size() ; ++i ) { if( ( '0' <= s[i] && s[i] <= '9' ) || ( 'A' <= s[i] && s[i] <= 'F' ) || ( 'a' <= s[i] && s[i] <= 'f' ) ) { if( !( j & 0x01 ) ) { c = 0; if( '0' <= s[i] && s[i] <= '9' ) c = ( s[i] - '0' ) << 4; else if( 'A' <= s[i] && s[i] <= 'F' ) c = ( s[i] - 'A' + 10 ) << 4; else c = ( s[i] - 'a' + 10 ) << 4; } else { if( '0' <= s[i] && s[i] <= '9' ) c += s[i] - '0'; else if( 'A' <= s[i] && s[i] <= 'F' ) c += s[i] - 'A' + 10; else c += s[i] - 'a' + 10; out.write( &c, 1 ); } j ^= 0x01; } } } }
使い方は、第一引数に入力ファイル名、第二引数に出力ファイル名を指定してください。
タイトル
さて、これでバイナリのデータが手に入ります。
では早速タイトルから見てみましょう。
E382BBE382ADE383A5E383AAE38386E382A3EFBC86E38397E383ADE382B0E383A9E3839FE383B3E382B0E382ADE383A3E383B3E3839732303130E381ABE58F82E58AA0E38197E381A6E3818DE381BEE38197E3819FEFBC81
これをファイルに保存し先程のプログラムなどで変換します。
そしてここでおもむろにテキストエディタなどで見てみましょう。
セキュリティ&プログラミングキャンプ2010に参加してきました!
UTF-8に対応していれば上記文字列が見えたと思います。
ということで、タイトルはUTF-8でエンコーディングされただけの文字列であったことがわかりました。
ちなみに分かる人にとっては16進数の状態でもUTF-8だとわかるそうです。
私にはわかりません><
本文
さて、同じように本文もバイナリに変換しましょう。
しかし、今度は先程のようにテキストエディタで開けばいいものではありません。
なにやら変なバイト列が並んでいるのがわかるかと思います。
これを解いていくのですが今回は序章ということでここまでです。
おわりに
さて、今回はスタート地点まで行ないました。
次回から順に解いていきます。
内容は結構いろんな事が含まれているので幅広い知識が必要になるかと思います。
しかし、作った本人はそんな知識ありません ←
だって作るだけだからね!
ということで、今回は簡単ですがここまでです!