暗号化する



ゲームのセーブデータとか、文字列の何たるかを理解している人ならすぐに書きかえる事が出来るでしょう。 (HSP付属ヘルプ「文字列のひみつ」を見れば大体わかります)
そういうのを防ぐには暗号化です。ここではありがちで簡単な暗号化を載せています。

足す
コードにある数を足し暗号化し、ある数を引いて復元する。
例えば、100(コード)という数値に50(ある数)を足し、150というコードになる。 元に戻すには50(ある数)を引き復元する。
この「ある数」を暗号キーといい、これを自分で決めておけば、他の人にはわからない。
注意しなければいけないのは、コードが255を超えた場合。1バイト数値の限界は255なので、255を超えた分は0へループさせる。
例えば、100というコードに200という暗号キーを足す。するとコードは300となり255を超えているので、コードは44となる(これは剰余演算子「\」を使えば一発で出来る)。 復元時は、44から200を引き、マイナスになってしまったのでまた逆にループさせ、コードは100となる(これはifを使わないと無理)。

xor演算
コードをxor演算し、復元時にもう一度xor演算する。
結構よく使われていて(多分)、xor演算は、2度同じ数字で演算するともとの数値に戻ります。それを利用して暗号化します。例を書くとビットとか書かなきゃ行けなくてめんどくさいので、 xorについては「演算記号 &,|,^,<< >>,!について」を参照してください。

以下のサンプルはこの両方を使ったものです。

;暗号化

#module

#deffunc encode val,int,int
	mref date,32
	mref pkey,1
	mref xkey,2
	strlen len,date
	repeat len
		peek code,date,cnt
		code=code+pkey\256^xkey
		poke date,cnt,code
	loop
return

#deffunc decode val,int,int
	mref date,32
	mref pkey,1
	mref xkey,2
	strlen len,date
	repeat len
		peek code,date,cnt
		code=code^xkey-pkey
		if code<0 : code=256+code
		poke date,cnt,code
	loop
return

#global

#define pkey 89	;+演算用のキー
#define xkey 39	;xor演算用のキー

	string="0123456789abcdefghijklmnopqrstuvwxyz"
	mes "初期文字列\n"+string
	encode string,pkey,xkey
	mes "エンコード後\n"+string
	decode string,pkey,xkey
	mes "デコード後\n"+string
	stop

ものすごく簡単だった。
encode命令とdecode命令はいっしょにしても良かったけど一応見やすいようにと。
これをファイルにかけておいて、読みこむときに復元して使えば立派な暗号化ファイルになります。 ただこの程度では解読できる人には解読できます。あまりに一般的な方法なので…。
ではどうするかというと、おそらく一番読まれにくいのは「圧縮」する事です。 圧縮というのはhspで実装するにはとても難しいです。まず私はほとんど理解できないです。
圧縮に関しては「Fuluichi's page」というサイトが役立ちます。 なんとか「静的ハフマン符号法」を理解できたぐらい。でも作れなかった…。あとは「連長圧縮法」とか(ほぼ増える)。


戻る 次へ