〜 テキスト 〜
ビットシフトを行い解読しにくくする

使用するデータをファイルとして保持し、次回はそのデータを読み込んで使用する場合、
利用者のいいようにデータを変更されると都合が悪く、開発側としてはデータ操作されることを嫌います。
そこで、簡単には解析されないようにデータを暗号化することが回避策として考えられます。
ココではビットシフトと言うか、ビットの加減算で文字列の読み取りを防ごうと思います。
ビット値の減算で暗号化をしたなら、同じ数分加算してやれば、
逆のビット値の加算で暗号化したなら、同じ数分減算してやれば復号化することが出来ますね。
もし、加算結果が256以上(1バイト単位で処理する時)になったり、減算結果が0未満になった場合、
そのまま何の分岐もなく処理させると、きちんと元に戻せなくなってしまいます。
上限下限値を超える値は処理しないようにする(復号化の場合も処理しない)とかの制御が必要です。
下記サンプルでは、マイナスとなった場合、結果値と256を合算し、
256以上の場合は結果値に256を減算し、0から255の範囲内になるようにしています。
また、結果が0になると、文字列終端を意味するコードと被ってしまうので、
0になる(復号化時には256になる)場合は処理しないように制御しています。
	

strenc 変数, キー
変数暗号化するテキストの入った文字列型変数を指定する。
キー暗号化に使用する0〜255いずれかのキーコードを指定する。

strdec 変数, キー
変数復号化するテキストの入った文字列型変数を指定する。
キー暗号化に使用したものと同じ0〜255のキーコードを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#module
#deffunc strenc val, int
	mref s, 24 : mref key, 1
	if key >= 256 | (key < 0) : return   // 指定可能なキーは0〜255
	strlen len, s
	repeat len
		peek code, s, cnt
		code -= key
		if code = 0 : continue             // 処理しない
		if code < 0 : code = code + 256    // 下限値を超えるなら上限値に戻る
		poke s, cnt, code
	loop
	return

#deffunc strdec val, int
	mref s, 24 : mref key, 1
	if key >= 256 | (key < 0) : return
	strlen len, s
	repeat len
		peek code, s, cnt
		code += key
		if code = 256 : continue           // 処理しない
		if code >= 256 : code = code - 256 // 上限値を超えるなら下限値に戻る
		poke s, cnt, code
	loop
	return
#global

	randomize
	rnd k, 200
	s = "じゅげむじゅげむごこうのすりきれ"
	strenc s, k // 暗号化
	mes s
	strdec s, k // 復号化
	mes s
	stop

strenc 変数, キー
変数暗号化するテキストの入った文字列型変数を指定する。
キー暗号化に使用する0〜255いずれかのキーコードを指定する。

strdec 変数, キー
変数復号化するテキストの入った文字列型変数を指定する。
キー暗号化に使用したものと同じ0〜255のキーコードを指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#module
#deffunc strenc var s, int key, local code
	if key >= 256 | key < 0 : return     // 指定可能なキーは0〜255
	repeat strlen(s)
		code = peek(s, cnt) - key
		if code = 0 : continue             // 処理しない
		if code < 0 : code = code + 256    // 下限値を超えるなら上限値に戻る
		poke s, cnt, code
	loop
	return

#deffunc strdec var s, int key, local code
	if key >= 256 | key < 0 : return
	repeat strlen(s)
		code = peek(s, cnt) + key
		if code = 256 : continue           // 処理しない
		if code >= 256 : code = code - 256 // 上限値を超えるなら下限値に戻る
		poke s, cnt, code
	loop
	return
#global

	randomize
	k = rnd(200)
	s = "かいじゃりすいぎょのすいぎょうまつ"
	strenc s, k // 暗号化
	mes s
	strdec s, k // 復号化
	mes s