关于of_compute函数写的程序看不懂它的逻辑?
各位兄弟,我有个程序...其中的zmother06.dll文件大小是286780字节,也就是说下面的FileLength('D\zmsoft\zmother06.dll')将返回286780,下面的of_compute函数程序能帮注释下意思吗,真的看不懂呀,有劳各位兄弟了程序如下:
Return of_compute(String(FileLength('D\zmsoft\zmother06.dll')))//这个返回值是来判断系统文件是不是非法的
其中的上面的of_compute函数程序如下:
public string of_compute
value string as_password
ulong m[], lv
long ll_len, ll_full
long i, j, k
/*首先需要对信息进行填充,使其字节长度对512求余的结果等于448。
因此,信息的字节长度(bits length)将被扩展至n*512+448,即n*64+56个字节(bytes),
n为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,
直到满足上面的条件时才停止用0对信息的填充。
然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。
经过这两步的处理,现在的信息字节长度=n*512+448+64=(n+1)*512,即长度恰好是512的整数倍。
*/
ll_len = len(as_password)
ll_full = long(ll_len / MD5_BYTESIZE) * MD5_BYTESIZE + MD5_BYTESIZE
k = mod(ll_len,MD5_BYTESIZE)
if k > 56 then ll_full += MD5_BYTESIZE
if k <> 56 then as_password = as_password + char(128)
m[ll_full / 4 - 1] = BitShl( ll_len, 3)
m[ll_full / 4] = BitShr( ll_len, 29)
//
k = 1
ll_len = len(as_password)
for i = 1 to ll_len
m[k] = BitShl(asc(mid(as_password,i,1)),j) + m[k]
j += 8
if j = 32 then
k ++
j = 0
end if
next
//
ulong a, b, c, d, aa, bb, cc, dd
k = 1
a = CAA; b = CBB; c = CCC; d = CDD
for i = 1 to ll_full / MD5_BYTESIZE
aa = a; bb = b; cc = c; dd = d;
ff(a,b,c,d,m[k + 0], 7,CF0);
ff(d,a,b,c,m[k + 1], 12,CF1);
ff(c,d,a,b,m[k + 2], 17,CF2);
ff(b,c,d,a,m[k + 3], 22,CF3);
ff(a,b,c,d,m[k + 4], 7,CF4);
ff(d,a,b,c,m[k + 5], 12,CF5);
ff(c,d,a,b,m[k + 6], 17,CF6);
ff(b,c,d,a,m[k + 7], 22,CF7);
ff(a,b,c,d,m[k + 8], 7,CF8);
ff(d,a,b,c,m[k + 9], 12,CF9);
ff(c,d,a,b,m[k + 10],17,CF10);
ff(b,c,d,a,m[k + 11],22,CF11);
ff(a,b,c,d,m[k + 12], 7,CF12);
ff(d,a,b,c,m[k + 13],12,CF13);
ff(c,d,a,b,m[k + 14],17,CF14);
ff(b,c,d,a,m[k + 15],22,CF15);
//second round
gg(a,b,c,d,m[k + 1], 5,CG0);
gg(d,a,b,c,m[k + 6], 9,CG1);
gg(c,d,a,b,m[k + 11],14,CG2);
gg(b,c,d,a,m[k + 0], 20,CG3);
gg(a,b,c,d,m[k + 5], 5,CG4);
gg(d,a,b,c,m[k + 10], 9,CG5);
gg(c,d,a,b,m[k + 15],14,CG6);
gg(b,c,d,a,m[k + 4], 20,CG7);
gg(a,b,c,d,m[k + 9], 5,CG8);
gg(d,a,b,c,m[k + 14], 9,CG9);
gg(c,d,a,b,m[k + 3], 14,CG10);
gg(b,c,d,a,m[k + 8], 20,CG11);
gg(a,b,c,d,m[k + 13], 5,CG12);
gg(d,a,b,c,m[k + 2], 9,CG13);
gg(c,d,a,b,m[k + 7], 14,CG14);
gg(b,c,d,a,m[k + 12],20,CG15);
// 第三轮
hh(a,b,c,d,m[k + 5], 4,CH0);
hh(d,a,b,c,m[k + 8], 11,CH1);
hh(c,d,a,b,m[k + 11],16,CH2);
hh(b,c,d,a,m[k + 14],23,CH3);
hh(a,b,c,d,m[k + 1], 4,CH4);
hh(d,a,b,c,m[k + 4], 11,CH5);
hh(c,d,a,b,m[k + 7], 16,CH6);
hh(b,c,d,a,m[k + 10],23,CH7);
hh(a,b,c,d,m[k + 13], 4,CH8);
hh(d,a,b,c,m[k + 0], 11,CH9);
hh(c,d,a,b,m[k + 3], 16,CH10);
hh(b,c,d,a,m[k + 6], 23,CH11);
hh(a,b,c,d,m[k + 9], 4,CH12);
hh(d,a,b,c,m[k + 12],11,CH13);
hh(c,d,a,b,m[k + 15],16,CH14);
hh(b,c,d,a,m[k + 2], 23,CH15);
// 第四轮
ii(a,b,c,d,m[k + 0], 6,CI0);
ii(d,a,b,c,m[k + 7], 10,CI1);
ii(c,d,a,b,m[k + 14],15,CI2);
ii(b,c,d,a,m[k + 5], 21,CI3);
ii(a,b,c,d,m[k + 12], 6,CI4);
ii(d,a,b,c,m[k + 3], 10,CI5);
ii(c,d,a,b,m[k + 10],15,CI6);
ii(b,c,d,a,m[k + 1], 21,CI7);
ii(a,b,c,d,m[k + 8], 6,CI8);
ii(d,a,b,c,m[k + 15],10,CI9);
ii(c,d,a,b,m[k + 6], 15,CI10);
ii(b,c,d,a,m[k + 13],21,CI11);
ii(a,b,c,d,m[k + 4], 6,CI12);
ii(d,a,b,c,m[k + 11],10,CI13);
ii(c,d,a,b,m[k + 2], 15,CI14);
ii(b,c,d,a,m[k + 9], 21,CI15);
a += aa; b += bb; c += cc; d += dd
k += 16
next
return lower(pof_hex(a) + pof_hex(b) + pof_hex(c) + pof_hex(d))