JavaScript Diary

スクリプトのコード化 [ 2001/09/09 ]
たまにあるのですが、ソースのコード部分を分かりにくくしたい場合があります。これに最適なもので、MS社から、Script Encoder なるものが出ています。これは Script 部分をコード化し、ほぼ解析不可能なものにしますが、いかんせん Internet Explorer にしか対応していないという重大な欠点があります。蛇足ですが、これを使用しているすんばらしいサイトに shingo.org があります。
では、こういったツールを使用せずに一般の人でも簡単(?)に実現できる方法はないものでしょうか?(以下、有名な方法なのでスクリプト中級者は見なくても結構です)
それには ISO-Latin-1 コード( + String.fromCharCodeメソッド) を使用します。
document.write( "Hello !!" );
例えば、↑のプログラムを変換すると以下のようになります(fromCharCode メソッドは任意個数の ISO-Latin-1 コード を引数にとり、それを文字列で連結して返します。例えば、下の 72 という数字は Hello !! の H に対応しています)。
document.write( String.fromCharCode( 72,101,108,108,111,32,33,33 ) );
実際の実行例。文字列部分を変換しただけですが、もうこの時点で理解することはかなり困難なものになったと思います。ですが、これは出力する文字列をコード化しただけで、write メソッド部分はそのままなので、「何かを書き出しているんだな」とは分かってしまいます。さて、write メソッド部分もコード化してみますが、それには eval 関数を使用します。
例えば以下のプログラムは同じことをしています。
eval( 'document.write( "Hello !!" );' );
eval 関数は文字列を引数にとり、それを正規のコードとして実行します。もう分かったでしょう。
この引数自体を ISO-Latin-1 コード で書き換えてしまいます。
eval( String.fromCharCode(
    100,111,99,117,109,101,110,116,46,119,114,105,116,
    101,40,32,34,72,101,108,108,111,32,33,33,34,32,41,59
) );
実際の実行例。スクリプトを知らない人には勿論理解不能ですが、スクリプト初心者の人にも理解しにくいコードになりました。さらに、こんな無謀なものも・・・。

最後に、今まで肝心の ISO-Latin-1 コード についてうやむやのままにしたまま話を進めてきましたが、例えば H という文字が 72 というコードであるとどうして分かるのでしょうか?
JavaScript にはそれを調べることができる charCodeAt メソッドが存在します。これは以下のように使用します。
"Hello !!".charCodeAt( 0 ); // 結果は 72
0番目の文字 "H" を ISO-Latin-1 コード に変換して返します。
このメソッドは一文字しか調べることができないので、文字列が長いとだるいことになりそうですね。ということで、エンコード/デコード なるものを作成しました。文字列の扱いは苦手なのでなんか不備があるかも知れませんが、使ってやって下さい。

これらの手法は自称中級者には通用しません。ですが、変換する作業が必要になるのでソースを見難くする上では有効です。また、多用するとファイルサイズが重くなるので要所要所のみに使用することをお勧めします。