HSP Tips / HSPモジュール

hsphash


説明

 独自のアルゴリズムによりhspの実行ファイルからhashを出力します。
好きに改変して使用していただいてかまいません。
 また,MD5などのハッシュアルゴリズムは出力することができないため注意してください。暗号化モジュールでキーとして利用します。



スクリプト

#module
#deffunc hsphash_keygen array _key, var _randomize, var _keystr, local s1, local s2, local s3, local s4, local s5
s1 = _keystr			//キーの文字列が代入される
s2 = strlen(s1)			//キーの文字数が代入される
_randomize = 1
randomize s2			//乱数の初期化
repeat
		if rnd(2):s5=1:else:s5=-1						//ランダムに入れ替える
        s3 = strf("%d", cnt)
        if instr(s3, 0, "3")!-1{
	        	//繰り返し回数に3が付く場合実行
                _key(cnt)=-rnd(33)*s5^rnd(s2)
                if _key(cnt) == 0 : _key(cnt) = 1
                continue
        }
        if cnt\5=0{
	        	//5の倍数の場合実行
                _key(cnt)=-rnd(55)*s5^rnd(s2)
                if _key(cnt) == 0 : _key(cnt) = 1
                continue
        }
        _key(cnt)=peek(s1, s4)*s5^rnd(s2)				//キー配列
        if _key(cnt) == 0 : _key(cnt) = 1
        _randomize+=rnd(_key(cnt)*_key(cnt))+1			//乱数初期化用数値
        s4++											//キーの位置のカウント
        if s4 = s2+1 : break							//キーの最後まで行ったらループを抜ける
loop
return _randomize
#global


#module
#deffunc hsphash var _hash, str _name, str _hashkey, int _hashsize, int _through, local s1, local s2, local s3, local s4, local s5, local s6, local s7, local size, local data, local x1, local r1, local r2, local r3, local r4, local r5

if _hashkey != ""{
	r3 = _hashkey
	hsphash_keygen r1, r2, r3
	r4 = length(r1)
}
sdim _hash,_hashsize+1
exist _name
if strsize == -1 : return 0
size = strsize
sdim data, size
//bload _name, data, size, 0
s2 = 10+size-0x00026030
sdim s1, s2
sdim s3, s2
bload _name, s3, 2, 0x000240C9
memcpy s1, s3, 2, 0, 0
bload _name, s3, 4, 0x000240CC
memcpy s1, s3, 4, 2, 0
bload _name, s3, 4, 0x00026024
memcpy s1, s3, 4, 6, 0
bload _name, s3, size - 0x00026030, 0x00026030
memcpy s1, s3, size - 0x00026030, 10, 0

randomize size+r2
s3 = double(0)
x1 = 255.0 / double(_hashsize)
if _through>0{
	s2/=_through
	s7 = _through
}else{
	s7 = 1
}

repeat _hashsize
	repeat s2
		s4 = peek(s1, cnt * s7)
		if (s4 >= s3)&(s4 < s3+x1){
			s5+=rnd(limit(s4, 1, 255)) + rnd(r1(r5)) + rnd(r2)
			if r4 != 0 : r5++
			if r5 == r4 : r5 =0
		}
	loop
	s3 += x1
	poke _hash, cnt, s5
	s6 = peek(_hash, cnt)
	s5 = 0
loop

//アスキーコード変換
repeat _hashsize
	s1 = peek(_hash, cnt)
	hcnt = cnt
	
	
	if (s1>=0)&(s1<=41){
		//数字
		s2 = double(0)
		s3 = 4.2
		repeat 10
			if (s1>=s2)&(s1<s2+s3){
				poke _hash, hcnt, 0x30 + cnt
				break
			}
			s2 += s3
		loop
	}else:if ((s1>=42)&(s1<=148)){
		//アルファベット大文字
		s2 = double(42)
		s3 = 4.115385
		repeat 26
			if (s1>=s2)&(s1<s2+s3){
				poke _hash, hcnt, 0x41 + cnt
				break
			}
			s2 += s3
			
		loop
	}else:if ((s1>=149)&(s1<=255)){
		//アルファベット小文字
		s2 = double(149)
		s3 = 4.115385
		repeat 26
			if (s1>=s2)&(s1<s2+s3){
				poke _hash, hcnt, 0x61 + cnt
				break
			}
			s2 += s3
			
		loop
	}

loop

return 1

#global



#if 0
sysfont 17
hsphash hash, "hsptmp.exe","Akicansoft2009", 20
mes hash
gsel 0,1
stop

#endif