★JavaScriptで色々な暗号化★


HTMLを暗号化するには結局ツールを使った方が早くて確実です。(ちなみにescape以外にも色々あります)

しかし、少しでも暗号化の仕組みを知ってもらうためにこのページを用意しました。

 

Javascriptのescape関数で判読を難しくする   

Javascriptのescape関数を用いると、日本語などそのままURLに渡すと問題が起こる可能性のある文字を

エンコードしてくれます。IEでは、ユニコードにエンコードしてくれます。例えば、「あ」という文字はIEでは

「%u3042」と「%u」で始まる文字列にエンコードしてくれます。

一方、Netscapeでは、escape関数を用いると文字列をISO-Latin-1コード(ASCIIコード)に変換してくれます。

例えば、「あ」という文字は、「%82%A0」というふうに変換してくれます。

2バイト文字は1バイト(8ビット)ずつ、16進数に変換しています。

このesacpe関数と対になっているのがunescape関数です。

unescape関数は、エンコードされた文字列をデコードし、元の文字に戻す機能があります。

この2つの関数(escape、unescape)を用いて、HTMLソースコードの解読を難しくさせることが可能です。、

<script language="JavaScript">
<!--
document.write(unescape("%3Cb%3E%u3042%u3044%u3046%u3048%u304A%3C/b%3E"));
//-->
</script>

と書けば、IEでは「あいうえお」とボールドで表示されます。タグの部分(「<b>」と「</b>」)も

16進数に変換されていますので、ぱっと見は分からないですね。

下の簡単なツールで試してみてください。左側のテキストエリアに何か文字を入力すれば、

escape関数でエンコードされた文字列が右側のテキストエリアに表示されます。

元の文字列:

変換後:    

しかし、ここまで読み進んできて、何か気がついた方もおられることでしょう。

先述のように、IE4.0以降ではescape関数でエンコードされた結果はISO-Latin-1コードではなく、unicodeです。

この方法でソースを隠そうとした場合、IE用とネットスケープ用と2種類準備しなければならないことになります。

これはかなり面倒です。 そこで、IEでもネットスケープでも動くescape関数及びunescape関数を

自作すればいいことになります。IEでもurlencodeさせる関数を自作するか、

ネットスケープでもunicode(%u****。*は0-9、A-Fのいずれかの文字。

16進数の文字列です。例:%u3042は「あ」を表します。)に変更させれば良いことになります。

恐らくネットスケープでもunicodeに変換する関数を自作する方が簡単です。

ただ、更に重大な問題があります。decode関数を使えば、 ブラウザは作成者の意図したとおりに

ユニコードの文字列を人間が読める文字に変換して表示してくれているので 人間だって、

decode関数でデコードさせている対象の文字列及び、decode関数のソースさえ分かれば、

簡単に HTMLソース全体を読むことができるようになってしまいます

(ここで注目すべきは、通常の文字列をどのようにエン コードしているかを知る必要は全くないということです)。

ちょうど、上にある簡単な「escape関数・unescape関数実 験ツール」のようなものを作成してしまえば、

簡単に元の文字列にデコードできてしまいます。


VBScript で URL エンコード

ついでに VBScript バージョンも作ってみました。

Microsoft Internet Explorer 4.0 以降では、 JavaScriptでescape() を使用すると

Unicodeとしてエンコードされた文字列を返してしまいます。

一般的に普及している jcode.pl も NKF も Unicode には対応していませんので、非常に都合が悪いです。

Unicode → Shift-JIS 変換テーブルを用いれば、 JavaScript でもShift-JIS として

URLエンコードできるはずですが、 大変な労力と時間を費やしますので、 ここは VBScript で我慢しましょう(^^;




手動で暗号化する。

パスワードを入力してリンクするようにしたけど、ソースを見たらバレバレでは全く意味ありません。

見ただけでは分からない程度まで暗号化してみましょう。

【リスト】

<script language="JavaScript"><!-- function myEnter(){ myPassWord = prompt("Tatsuya家のパスワードを入力してください 「 pass1 」",""); if ( myPassWord == String.fromCharCode(112,97,115,115,49) ) location.href = String.fromCharCode(115,101,99,114,101,116)+".htm"; else alert( "パスワードが違います!" ); } // --></script> <form> ここは家族専用です→ <input type="button" value="Tatsuya家へ入る" onclick="myEnter()"> </form> 

 

【説明】

このサンプルは前回のStepのパスワード比較部分をソースを見ただけではわからないように暗号化しました。

if ( myPassWord == "pass1" )
   location.href = "secret.htm";
         ↓
if ( myPassWord == String.fromCharCode(112,97,115,115,49) )
   location.href = String.fromCharCode(115,101,99,114,101,116)+".htm";

String.fromCharCode( 文字コード ) は、文字コードを文字に変換します。

ひとつひとつの文字には文字コードが割り付けられています。コンピュータは結局、文字ではなく、

文字コードで処理しています。 fromCharCode( ) は、その文字コードを私たちが分かる文字へ変換してくれます。

(といっても、文字コード=文字 ですから表現を変えただけです)

文字コード表

 

32

48

64

80

96

112

0

 

0

@

P

 

p

1

!

1

A

Q

a

q

2

"

2

B

R

b

r

3

#

3

C

S

c

s

4

$

4

D

T

d

t

5

%

5

E

U

e

u

6

&

6

F

V

f

v

7

'

7

G

W

g

w

8

(

8

H

X

h

x

9

)

9

I

Y

i

y

10

*

:

J

Z

j

z

11

+

;

K

[

k

{

12

,

<

L

\

l

|

13

-

=

M

]

m

}

14

.

>

N

^

n

~

15

/

?

O

_

o

 


該当する文字の上の数字と左の数字を足したものが、その文字コードです。

's' でしたら、112 + 3 = 115 となります。半角スペースは 32 + 0 = 32 です。

書式は、myStr = String.fromCharCode( 文字コード ) です。

myStr = String.fromCharCode( 115 ) とすれば、myStr には、"s" が入ります。

また、パラメータにカンマ区切りで続けてセットすればその文字列が myStr にセットされます。

myStr = String.fromCharCode(115,101,99,114,101,116); では、myStr は "secret" です。

暗号化といっても、ソースが見れる以上、解読は容易です。

今回も暗号化とはいうものの、文字コードはプログラマーにとってはご用達、「 s 」が 115 なんて当たり前のこと

なのです。また、例でいえば、myStrdocument.write すればバレバレです。 (^^;

どうしても解読されたくない場合は、CGIや性能の高い暗号化ツールが必要になります。