照れくさいからお祝いメッセージを難読化&アスキーアートにしてみた
同僚が入籍しました。
お祝いメッセージを送りたいのですが真正面から伝えるのはなんだか照れくさいですよね。
ということで、お祝いメッセージを難読化してみました。
これなら照れくさくない!
eval (%w( p r i n t f ( " %s ",[02* 0x0 2*0b1 0 *0 b 10 1 0 0 0 0 0 0 1 * 0b1 1 0 0 1 0 00 0 0 0 1 1 1 1 1 1111 111 11* 0x86d 56fc3 35,0b 11 0 1 1 10 1 1 1 , 0 b 1 1 *0b 11 *0b 11* 0b 1 01 * 0 b 1 0 0 1 1 * 0 b1001 11011 1 ,0 b10 * 0b 10*0b 1 1 0 0 1 1 1* 0 b 1 0 1 0 0 0 1 100 1 1 1 1 1 1 1 1 1 0 10 0 1 1 101 ] . m a p { | s | s . t o _ s(2 *2*3* 3)}*" \s" +33 .chr) ) . join)
ソースコード:message.rb
これを実行すると、お祝いメッセージが出力されます。
$ ruby message.rb congratulations on your wedding!
難読化方法
こちらのブログを参考にしました。
多謝。
手順はこんな感じです。
- メッセージを決める
- アスキーアートのデザインを決める
- ざっくり難読化
- 字数調整
1.メッセージを決める
今回は"congratulations on your wedding!"にしました。
あまり短すぎると難読化しずらくなります。
これでベースとなるソースコードが出来上がります。
puts "congratulations on your wedding!"
2.アスキーアートのデザインを決める
難読化前に決めてしまいましょう。
今回はbannerコマンドを使って原型を作成しました。
XXXX XX X X X X X X X X XX XXX XX XXX XXXXX X XX X XX X X X X X X X X X XXX X X X X X XX X X X X X X X X XXXX XXX XXX XXXXX XXXXX XXXXX XX X X X XX X X X X X X X X XXX XX XXX XXX XX X XX X X X X X X X X X X XXXXX XXXXX X XX XXX X XX XXXXX X X X X X X XX X X X X X X X X X XXX X X X X X X X X X X XX X X X XXX X X X X X X X X X X X X X X XXX XXXXX XXXXX XXX XXX XXXXX XX XX XXXXX
このAAの文字数は237文字です。
なので難読化ソースコードも237文字になるように調整します。
3.ざっくり難読化
文字を36進数に変換します。出力する時は数値を文字に再変換します。
puts 77896456584017463722584.to_s(36) + " " + 887.to_s(36) + " " + 1618515.to_s(36) + " " + 70526026924.to_s(36) + "!"
数値を配列に格納して、空白で結合するようにします。
puts [77896456584017463722584,887,1618515,70526026924].map{|s|s.to_s(36)}* " " + "!"
アスキーアート化できるようにする為にeval(%w( ... ).join)で囲います。
このとき囲いの中にスペースがあると実行できないので、putsをprintfに変更し、" "を"¥s"に変更してスペースを消しています。
eval(%w(printf("%s",[77896456584017463722584,887,1618515,70526026924].map{|s|s.to_s(36)}*"\s"+"!")).join)
だいぶ難読化されて来ましたね〜。
この状態になるとeval(%w( ... ).join)の中は自由に整形できます。
eval(%w(prin tf("%s",[7789 6456584017 463722584,8 87,1618515,7 0526026924]. map{|s|s.to_s( 36)}*"\s"+"!")).join)
4.字数調整
アスキーアートに必要なのは237文字ですが、現在は105文字しかありません。
今回は以下のテクニックを使って字数を調整しました。
- 数値を素因数分解する
- 数値を2進数、8進数、16進数にする
- 文字をASCIIコードで表現する
- "!" -> 33.chr # 2文字増えた!
そして完成したのがこれです。
eval(%w(printf("%s",[002*0x02*0b10*0b1010000001*0b1100100000011111111111111*0x86d56fc335,0b1101110111,0b11*0b11*0b11*0b101*0b10011*0b1001110111,0b10*0b10*0b1100111*0b1010001100111111111010011101].map{|s|s.to_s(2*2*3*3)}*"\s"+33.chr)).join)
変数名を長くしたり、数値を+1+1+1 ... したりすれば簡単に文字数を増やせますが、それだとつまらないので不採用にしました。
最終的には整形の都合で239文字になっています。
あとはこれをアスキーアートと同じ形に整形すれば完成です。
いやあ、これで照れずにお祝いメッセージを送れますね。
よかったよかった。