// The MD5 Message-Digest Algorithm : RFC1321 /* RFC1321のMD5ハッシュを求めるモジュールです. HSPだけで書いてるので,低速で使い物にはならないかも…. ・md5_init モジュールを初期化します ・md5_data p1,len,offset データを渡します. p1のoffsetバイト目から,長さlenのデータのMD5ハッシュを求めます. 複数回に分けて呼び出してもOKです. ・md5_finish p1 今までに渡したデータのMD5ハッシュを得ます. vp1で指定した変数に128ビットのデータが書き込まれます. この命令を使ったあとは,自動的にmd5_initが実行されます. ・md5_str p1,p2 p2で渡されたmd5の128ビットデータを16進数文字列に変換して,p1に代入します. // sample md5test.as #include "md5mod.as" mes "MD5 test suite:" sdim data,128,8 data.0="","a","abc","message digest","abcdefghijklmnopqrstuvwxyz" data.5="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" data.6="12345678901234567890123456789012345678901234567890123456789012345678901234567890" repeat 7 md5_init strlen l,data.cnt md5_data data.cnt,l md5_finish md5 md5_str s,md5 mes "MD5 (\""+ data.cnt +"\") = "+s loop stop */ #module "md5" // シフトする値 #define S11 7 #define S12 12 #define S13 17 #define S14 22 #define S21 5 #define S22 9 #define S23 14 #define S24 20 #define S31 4 #define S32 11 #define S33 16 #define S34 23 #define S41 6 #define S42 10 #define S43 15 #define S44 21 #define ctype MD5F(%1,%2,%3) %1&%2 | (-1^%1 & %3) ;(x & y) | (~x & z) #define ctype MD5G(%1,%2,%3) %1&%3 | (-1^%3 & %2) ;(x & z) | (y & ~z) #define ctype MD5H(%1,%2,%3) %1^%2^%3 ;x ^ y ^ z #define ctype MD5I(%1,%2,%3) -1^%3|%1^%2 ;y ^ (x | ~z) #define ctype rotate_left(%1,%2) %1<<%2 | (%1 >> (32-%2) & (1<<%2-1)) #deffunc md5_init // 初期化 md5_d.0=0x67452301 md5_d.1=0xefcdab89 md5_d.2=0x98badcfe md5_d.3=0x10325476 len=0 p=0 return #deffunc md5_data val,int,int mref _dat,24 mref _len,1 mref _ofs,2 len+=_len if 64-p>_len { memcpy dat,_dat,_len,p,_ofs p=p+len&63 return } _p=_ofs if p { _p=64-p+_ofs memcpy dat,_dat,_p,p gosub block } repeat _len>>6 memcpy dat,_dat,64,0,_p _p+=64 gosub block loop p=_len-_p+_ofs if p :memcpy dat,_dat,p,0,_p return #deffunc md5_finish val mref _v,16 poke dat,p,0x80 memset dat,0,64-p-1,p+1 if p>54 { gosub block memset dat,0,56 } l=len<<3 h=len>>29 memcpy dat,l,4,56 memcpy dat,h,4,60 gosub block memcpy _v,md5_d,16 md5_init return #deffunc md5_str val,val mref _s,24 mref _v,17 _s="" repeat 16 peek c,_v,cnt a=c str a,18 _s+=a loop return *block a=md5_d.0 b=md5_d.1 c=md5_d.2 d=md5_d.3 ;repeat 16 ; mes ""+cnt+":"+dat.cnt ;loop /* Round 1 */ a= MD5F(b,c,d) + a + dat.0 + 0xd76aa478 a=rotate_left(a,S11) + b d= MD5F(a,b,c) + d + dat.1 + 0xe8c7b756 d=rotate_left(d,S12) + a c= MD5F(d,a,b) + c + dat.2 + 0x242070db c=rotate_left(c,S13) + d b= MD5F(c,d,a) + b + dat.3 + 0xc1bdceee b=rotate_left(b,S14) + c a= MD5F(b,c,d) + a + dat.4 + 0xf57c0faf a=rotate_left(a,S11) + b d= MD5F(a,b,c) + d + dat.5 + 0x4787c62a d=rotate_left(d,S12) + a c= MD5F(d,a,b) + c + dat.6 + 0xa8304613 c=rotate_left(c,S13) + d b= MD5F(c,d,a) + b + dat.7 + 0xfd469501 b=rotate_left(b,S14) + c a= MD5F(b,c,d) + a + dat.8 + 0x698098d8 a=rotate_left(a,S11) + b d= MD5F(a,b,c) + d + dat.9 + 0x8b44f7af d=rotate_left(d,S12) + a c= MD5F(d,a,b) + c + dat.10+ 0xffff5bb1 c=rotate_left(c,S13) + d b= MD5F(c,d,a) + b + dat.11+ 0x895cd7be b=rotate_left(b,S14) + c a= MD5F(b,c,d) + a + dat.12+ 0x6b901122 a=rotate_left(a,S11) + b d= MD5F(a,b,c) + d + dat.13+ 0xfd987193 d=rotate_left(d,S12) + a c= MD5F(d,a,b) + c + dat.14+ 0xa679438e c=rotate_left(c,S13) + d b= MD5F(c,d,a) + b + dat.15+ 0x49b40821 b=rotate_left(b,S14) + c /* Round 2 */ a= MD5G(b,c,d) + a + dat.1 + 0xf61e2562 a=rotate_left(a,S21) + b d= MD5G(a,b,c) + d + dat.6 + 0xc040b340 d=rotate_left(d,S22) + a c= MD5G(d,a,b) + c + dat.11+ 0x265e5a51 c=rotate_left(c,S23) + d b= MD5G(c,d,a) + b + dat.0 + 0xe9b6c7aa b=rotate_left(b,S24) + c a= MD5G(b,c,d) + a + dat.5 + 0xd62f105d a=rotate_left(a,S21) + b d= MD5G(a,b,c) + d + dat.10+ 0x2441453 d=rotate_left(d,S22) + a c= MD5G(d,a,b) + c + dat.15+ 0xd8a1e681 c=rotate_left(c,S23) + d b= MD5G(c,d,a) + b + dat.4 + 0xe7d3fbc8 b=rotate_left(b,S24) + c a= MD5G(b,c,d) + a + dat.9 + 0x21e1cde6 a=rotate_left(a,S21) + b d= MD5G(a,b,c) + d + dat.14+ 0xc33707d6 d=rotate_left(d,S22) + a c= MD5G(d,a,b) + c + dat.3 + 0xf4d50d87 c=rotate_left(c,S23) + d b= MD5G(c,d,a) + b + dat.8 + 0x455a14ed b=rotate_left(b,S24) + c a= MD5G(b,c,d) + a + dat.13+ 0xa9e3e905 a=rotate_left(a,S21) + b d= MD5G(a,b,c) + d + dat.2 + 0xfcefa3f8 d=rotate_left(d,S22) + a c= MD5G(d,a,b) + c + dat.7 + 0x676f02d9 c=rotate_left(c,S23) + d b= MD5G(c,d,a) + b + dat.12+ 0x8d2a4c8a b=rotate_left(b,S24) + c /* Round 3 */ a= MD5H(b,c,d) + a + dat.5 + 0xfffa3942 a=rotate_left(a,S31) + b d= MD5H(a,b,c) + d + dat.8 + 0x8771f681 d=rotate_left(d,S32) + a c= MD5H(d,a,b) + c + dat.11+ 0x6d9d6122 c=rotate_left(c,S33) + d b= MD5H(c,d,a) + b + dat.14+ 0xfde5380c b=rotate_left(b,S34) + c a= MD5H(b,c,d) + a + dat.1 + 0xa4beea44 a=rotate_left(a,S31) + b d= MD5H(a,b,c) + d + dat.4 + 0x4bdecfa9 d=rotate_left(d,S32) + a c= MD5H(d,a,b) + c + dat.7 + 0xf6bb4b60 c=rotate_left(c,S33) + d b= MD5H(c,d,a) + b + dat.10+ 0xbebfbc70 b=rotate_left(b,S34) + c a= MD5H(b,c,d) + a + dat.13+ 0x289b7ec6 a=rotate_left(a,S31) + b d= MD5H(a,b,c) + d + dat.0 + 0xeaa127fa d=rotate_left(d,S32) + a c= MD5H(d,a,b) + c + dat.3 + 0xd4ef3085 c=rotate_left(c,S33) + d b= MD5H(c,d,a) + b + dat.6 + 0x4881d05 b=rotate_left(b,S34) + c a= MD5H(b,c,d) + a + dat.9 + 0xd9d4d039 a=rotate_left(a,S31) + b d= MD5H(a,b,c) + d + dat.12+ 0xe6db99e5 d=rotate_left(d,S32) + a c= MD5H(d,a,b) + c + dat.15+ 0x1fa27cf8 c=rotate_left(c,S33) + d b= MD5H(c,d,a) + b + dat.2 + 0xc4ac5665 b=rotate_left(b,S34) + c /* Round 4 */ a= MD5I(b,c,d) + a + dat.0 + 0xf4292244 a=rotate_left(a,S41) + b d= MD5I(a,b,c) + d + dat.7 + 0x432aff97 d=rotate_left(d,S42) + a c= MD5I(d,a,b) + c + dat.14+ 0xab9423a7 c=rotate_left(c,S43) + d b= MD5I(c,d,a) + b + dat.5 + 0xfc93a039 b=rotate_left(b,S44) + c a= MD5I(b,c,d) + a + dat.12+ 0x655b59c3 a=rotate_left(a,S41) + b d= MD5I(a,b,c) + d + dat.3 + 0x8f0ccc92 d=rotate_left(d,S42) + a c= MD5I(d,a,b) + c + dat.10+ 0xffeff47d c=rotate_left(c,S43) + d b= MD5I(c,d,a) + b + dat.1 + 0x85845dd1 b=rotate_left(b,S44) + c a= MD5I(b,c,d) + a + dat.8 + 0x6fa87e4f a=rotate_left(a,S41) + b d= MD5I(a,b,c) + d + dat.15+ 0xfe2ce6e0 d=rotate_left(d,S42) + a c= MD5I(d,a,b) + c + dat.6 + 0xa3014314 c=rotate_left(c,S43) + d b= MD5I(c,d,a) + b + dat.13+ 0x4e0811a1 b=rotate_left(b,S44) + c a= MD5I(b,c,d) + a + dat.4 + 0xf7537e82 a=rotate_left(a,S41) + b d= MD5I(a,b,c) + d + dat.11+ 0xbd3af235 d=rotate_left(d,S42) + a c= MD5I(d,a,b) + c + dat.2 + 0x2ad7d2bb c=rotate_left(c,S43) + d b= MD5I(c,d,a) + b + dat.9 + 0xeb86d391 b=rotate_left(b,S44) + c md5_d.0+=a md5_d.1+=b md5_d.2+=c md5_d.3+=d return #global