暗号化する2



暗号化する」で簡単な暗号化をやりました。
しかしあれは本当に初歩的なもので、初心者が使うような手法です。
そこでほんの少しだけレベルアップしてみましょう。

連結

前の方法では1バイト1バイト別々に処理をしていました。
これを複数のバイトデータを組み合わせて暗号化します。
どういうことかというと、つまり、1バイトをその隣の1バイトをキーにして暗号化するということです。
これを1バイト1バイトそれぞれ処理していくと、全てのバイトデータが関連付けられます。
もちろん隣でなくてもかまいませんし、2つでなくても結構です。
こうすれば、暗号化したデータの1バイトを書き換えられたとき他のバイトデータも変化してしまうので迂闊に書き換えられなくなります。
以下は、隣のバイトデータを足して暗号化する命令です。

#module

#deffunc combine val,int
	mref data,24	;元データが格納された文字列型変数
	mref size,1	;データバイト数

	repeat size - 1
		peek code1,data,cnt	;1バイト取得
		peek code2,data,cnt + 1	;となりの1バイト取得
		poke data,cnt,code1 + code2	;となりの数を足した数で書き込み
	loop

	;最後の1バイトの処理
	peek code1,data,size - 1	;1バイト取得
	peek code2,data,0	;1バイト目から取得
	poke data,size - 1,code1 + code2	;となりの数を足した数で書き込み
return

#deffunc divide val,int
	mref data,24	;元データが格納された文字列型変数
	mref size,1	;データバイト数

	;最後の1バイトの処理
	peek code1,data,size - 1	;1バイト取得
	peek code2,data,0	;1バイト目から取得
	poke data,size - 1,code1 - code2	;となりの数を引いた数で書き込み

	;2バイト目以降
	c = size - 2	;後ろから初めに向かって複合していくためのcntの代わり
	repeat size - 1
		peek code1,data,c	;1バイト取得
		peek code2,data,c + 1	;となりの1バイト取得
		poke data,c,code1 - code2	;となりの数を引いた数で書き込み
		c--
	loop
return

#global

1番端っこは反対側の1バイトを使用するので他とは別に処理しています。
これは足しているだけなので実際にはもう少し演算を工夫しましょう。
XOR演算との組み合わせでも充分いけると思います。
足し算だけでは途中に0があると関連付けがストップしてしまいますので。

ビットシフト

今度はバイト単位ではなく、ビット単位で暗号化してみましょう。
ビットシフト演算子「<<,>>」ってありますよね? あれはひとつの数値にしか効きませんが、これをデータ全体にかけます。
言葉で言えば簡単ですが実際にやってみると結構大変です。
ずらしたビットの分1バイトを二つに分けて別々のバイトデータへ組み込みます。
以下がビットシフト命令です。

#module

#deffunc bitshift val,int,int
	mref data,24	;元データが格納された文字列型変数
	mref size,1	;データバイト数
	mref shift,2	;ビットシフト数

	shiftbyte = shift / 8	;シフトするバイト数
	shiftbit = shift \ 8	;隣のバイトへずれるビット数

	sdim data2,size	;ビットシフトを実行する変数

	repeat size
		if shiftbit >= 0 {
			byte2 = cnt - shiftbyte + size \ size	;+size\sizeとしておくと0〜sizeをはみ出さない
			byte1 = byte2 - 1 + size \ size
		} else {
			byte1 = cnt - shiftbyte + size \ size
			byte2 = byte1 + 1 + size \ size
		}

		peek code1,data,byte1
		peek code2,data,byte2

		if shiftbit >= 0 {
			code3 = (code1 >> (8 - shiftbit)) | (code2 \ (1 << (8 - shiftbit)) << shiftbit)
		} else {
			shiftbit2 = -shiftbit
			code3 = (code1 >> shiftbit2) | (code2 \ (1 << shiftbit2) << (8 + shiftbit))
		}
		poke data2,cnt,code3
	loop

	memcpy data,data2,size	;元データを書き換え
return

#global

演算部分にコメント入ってませんが、説明が難しいのです。(泣
処理の流れは、1バイト1バイトチェックしていき、その1バイトに入るべき数値を他のバイトからもらってきます。
bitshift命令の第3引数がシフトするビット数です。正の数で右に、負の数で左へシフトします。 8(絶対値)ビット以上を指定した場合はそのバイト分ずれます。
ここに8の倍数を指定しても1バイトずれるだけなので無意味です。

上の2種類の暗号化命令を使用したサンプルです。

;上記命令は各自でくっつけてください

	dialog "*",16
	if stat = 0 : end
	exist refstr
	size = strsize
	sdim data,strsize
	bload refstr,data

	combine data,size
	bitshift data,size,10
	bsave "暗号化ファイル.txt",data

	bitshift data,size,-10
	divide data,size
	bsave "複合化ファイル.txt",data
	stop

divide命令、combine命令は逆にしても一緒です。全く逆の処理をしているわけですから。
bitshift命令はまあ右に10ビットずらしたのなら左へ10ビットずらして戻せば良いだけです。

これでそこそこ複雑な暗号化になったのではないかと思います。
これまでにやった暗号化はファイルサイズを変えずに処理するものです。
もちろんこれ以外にも方法はたくさんあると思いますが、ファイルサイズが増えてもよいものならもっとたくさんの方法があるでしょう。
暗号化は基本的に独自のものを使うべきなのですから自分で考えてやってみてください。


前へ 戻る