URLエンコードとは関係ありません
Google等で日本語で検索すると、URL欄に不気味な文字列が並ぶ。これをURLエンコードと言うらしい。
例えば
↑これは「あいうえおかきくえ」と検索したときのURL。
ひらがなは9文字ですが、URLの%の区切りは27つある。
しかも「E3」が9回あって、間隔も2個開いている。
非常に不気味である。
上のツールで16進数にしてもらいました!!
e38182e38184e38186e38188e3818ae3818be3818de3818fe38188
どうやら、ひらがな1文字は6文字の英数字に変換されるらしい。
UTF-8にあたる。URLなどでは日本語が使えないから%の記号を用いた文字列に変換する。
ひらがな、カタカナ、漢字などは6文字に変換されたが、a~z、1~0などはどうだろうか。
「noob」→6e6f6f62
2文字だ。
どうやら英数字1文字は英数字2文字に変換されるらしい。
0~9は30~39に変換される。
多重エンコード
残念ながら、ここからエンコードを2回3回と重ねる。
まずは「糞」から。うんち。
「糞」→e7b39e(1回目)
このe7b39eをエンコードする。
e7b39e→653762333965(2回目)
全部数字になった。というのも、最初のエンコードは0~fに変換される。
0~fをエンコードすると全て数字になるため、2回目は全て数字になるというわけだ。
このままどんどんエンコードを重ねていく。
653762333965→363533373632333333393635(3回目)
363533373632333333393635→333633353333333733363332333333333333333933363335(4回目)
333633353333333733363332333333333333333933363335→333333363333333533333333333333373333333633333332333333333333333333333333333333393333333633333335(5回目)
3がどんどん増えている。
333333333333333633333333333333353333333333333333333333333333333733333333333333363333333333333332333333333333333333333333333333333333333333333333333333333333333933333333333333363333333333333335(6回目)
ここでちょっと中断。
あまりにも3が増えすぎた。ここで問題。
(1)6回目の文字数は。
(2)6回目の3以外の文字数は。
(3)6回目の3の文字数は。
(1)は簡単だ。2回目からは文字数が2倍ずつ増えている。
1回目の文字数は6文字だから、6回目には6*2^(6-1)=192文字。
(2)も数えればわかるが、8文字だ。
でも注目すべきなのは2回目~5回目のとき。
2回目…8文字 3回目…8文字 4回目…8文字 5回目…8文字 6回目…8文字
変わっていない。なぜなのか
数字の0~9は30~39に変換されるから。(例えば45 → 3435)
このとき元の数は残るというわけだ
(3)は3の文字数なので全体から3以外の文字数を引けばよい。192-8=184
さて、他にも適用させよう。
n回目の16進数変換(n≧3)
a = 2回目変換のときの3の文字数
b = 2回目変換のときの3以外の文字数
文字数=(a+b)*2^(n-2)
どんどん2倍,それを2倍と繰り返しているので2の累乗を使います
また、a+bは2回目の文字数なのでn=2の時に2^0にします。なので指数は(n-2)です。
3以外の文字数=b
3以外の文字数はさっき説明した通り変わりません。
3の文字数 = {(a+b)*2^(n-2)}-b
3の文字数は全体の文字数から3以外の文字数を引いた数です。
おれは3→33となることから{a*2^(n-2)}+{b*2^(n-2)-b}より求めました
ここで、33回目の全体の文字数、3の文字数、3以外の文字数を求めてみましょう。
2回目は653762333965。3の文字数は4、3以外の文字数は8。
ここですぐにわかります。
全体の文字数は(4+8)*2^(33-2) = 12*2^31 = 25769803776文字
3以外の文字数は8文字。
3の文字数は25769803776 - 8 = 25769803768文字
あっという間に終わりましたね…
適当になってきたからいい話で終わらせる
実際に33回変換して文字数をカウントするよりも、このように文字数を計算で求める方が圧倒的に速いです。(適当)
また少し工夫すれば、実際に変換しなくても3以外の文字数の間に3が何個挟まっているか計算することができます。(適当)
ご覧いただきありがとうございました