説明
独自のアルゴリズムにより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