600000007

プログラムと折り紙のブログです。

照れくさいからお祝いメッセージを難読化&アスキーアートにしてみた

同僚が入籍しました。
お祝いメッセージを送りたいのですが真正面から伝えるのはなんだか照れくさいですよね。
ということで、お祝いメッセージを難読化してみました。
これなら照れくさくない!

   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. メッセージを決める
  2. アスキーアートのデザインを決める
  3. ざっくり難読化
  4. 字数調整


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文字になっています。
あとはこれをアスキーアートと同じ形に整形すれば完成です。


いやあ、これで照れずにお祝いメッセージを送れますね。
よかったよかった。