MD5算法在PB中的实现

    技术2022-05-20  29

    开发者在线 Builder.com.cn 更新时间:2008-03-28作者:MIS/ERP开发 来源:

           MD5算法自从1991开发出来以后广泛用于数字签名和加密解密领域。目前使用PB外的语言可以较为简单地实现了MD5加密,使用PB来实现的比较鲜见,这可能有如下两方面的原因:一,PB在位运算方面未提供直接使用的函数,要实现位运算比较麻烦;二,在PB(PB10之前的版本)中无法直接获取字符的unicode值。如果能够攻破这两个难点,在熟悉MD5算法之后应该比较容易地在PB中实现MD5加密。        PB虽然未提供位运算方面直接使用的函数,但如果了解位运算的法则,同样可以实现位运算。不论是二元运算还是一元运算,参与运算的表达式都以补码方法表示,其结果也以补码表示。通用的做法是创建一个专门用于位运算的对象,使其实现进制之间的转化、位运算、求反、求补等功能,然后在加密时调用。关于根据原码求其反码、补码的运算法则可以参考相关的计算机书籍。        在PB中虽然无法直接获取字符的unicode值(据说PB10有ASCW函数可以实现),但调用WINAPI可以实现,这个函数就是MultiByteToWideChar(注意该函数在PB环境下区分大小写),可运行于Windows95及以后的Windows操作系统。顺便提一下,目前网上大多数MD5加密算法中只取字符的ASCII,因而对于非英文语言的字符加密支持不够。        以下是MD5算法在PB中实现的源代码,读者只需将其保存到sru格式的文件中然后导入到PB库文件中生成相应对象,然后依据PB的对象调用规则便可使用。由于作者水平有限,部分代码段未提供详细注释,敬请原谅。所有代码在PB8.0.3Build9704和Windows2000 AdvancedServer Service Pack4环境下运行正确。 限于篇幅,本文不给出MD5算法的加密原理,读者可查阅MD5算法的详细资料,如范本文件 http://www.ietf.org/rfc/rfc1321.txt 在实现时可参考PFC中pfc_n_cst_numerical对象提供的位运算函数及其它语言(如C/C++/Delphi/ASP/MSSQLSERVER2000)实现MD5加密的源代码。 一,nvo_numerical对象,提供位运算功能。 forward global type nvo_numerical from nonvisualobject end type end forward global type nvo_numerical from nonvisualobject autoinstantiate end type   forward prototypes public function string of_binary (unsignedlong aul_decimal) public function string of_binary (long al_decimal) public function unsignedlong of_binarytodecimalunsigned (string as_binary) public function long of_decimal (string as_binary) public function string of_bitwisenot (string as_bitvalue) public function string of_bitwisefill (string as_bitvalue) public function long of_bitwiseand (long al_value1, long al_value2) public function long of_bitwiseor (long al_value1, long al_value2) public function long of_bitwisexor (long al_value1, long al_value2) end prototypes   public function string of_binary (unsignedlong aul_decimal); /******************************************************************* 函数名称:of_binary() 参数:     aul_decimal unsignedlong 数字 返回值: string 二进制字符 功能描述:将数字转为二进制字符 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ string      ls_binary=''   //检查参数 If IsNull(aul_decimal) Then        SetNull(ls_binary)        Return ls_binary End If   Do        ls_binary = string(mod(aul_decimal, 2)) + ls_binary        aul_decimal = aul_decimal /2 Loop Until aul_decimal= 0   Return ls_binary end function   public function string of_binary (long al_decimal); /******************************************************************* 函数名称:of_binary() 参数:     al_decimal long 数字 返回值: string 二进制字符 功能描述:将数字转为二进制字符 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer li_remainder string ls_return='',ls_null ulong ll_temp   //检查参数 if isnull(al_decimal) then        setnull(ls_null)        return ls_null end if   //处理零 if al_decimal = 0 then        return '0' end if   //处理负数 if al_decimal< 0 then        ll_temp = abs(al_decimal)//取绝对值        //负数的二进制码为其绝对值的二进制码前加负号        return '-' + this.of_binary(ll_temp)//取绝对值的二进制码 end if   do until al_decimal= 0        li_remainder = mod(al_decimal, 2)        al_decimal = al_decimal /2            ls_return = string(li_remainder) + ls_return loop   return ls_return end function   public function unsignedlong of_binarytodecimalunsigned (string as_binary);/******************************************************************* 函数名称:of_binarytodecimalunsigned() 参数:     as_binary string 二进制值 返回值: unsignedlong 无符号位十进制值 功能描述:二进制值转成无符号位十进制 创建人:  康剑民 创建日期:2004-05-23(第一版) 版本号:    v1.0.0 *******************************************************************/ integer    li_cnt long        ll_len,ll_null long        ll_decimal=0   //检查参数 If IsNull(as_binary) then        SetNull(ll_null)              Return ll_null End If   ll_len = lenw(as_binary)   For li_cnt = 1 to ll_len        //只允许出现0或1        If (Not midw(as_binary,li_cnt,1)='1') AND (Not midw(as_binary,li_cnt,1)='0') Then               Return -1        End If        if midw(as_binary,li_cnt,1) = '1' then               ll_decimal = ll_decimal + (2 ^ (ll_len - li_cnt))        end if Next   Return ll_decimal end function   public function long of_decimal (string as_binary); /******************************************************************* 函数名称:of_decimal() 参数:     as_binary 二进制值 返回值: long 十进制值 功能描述:将二进制值转十进制 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer    li_cnt long        ll_len,ll_null char        lch_char[] long        ll_decimal=0   //检查参数 if isnull(as_binary) then        setnull(ll_null)        return ll_null end if   ll_len = lenw(as_binary) for li_cnt = 1 to ll_len        //只允许存在0和1字符        if (not midw(as_binary,li_cnt,1)='1') and (not midw(as_binary,li_cnt,1)='0') then               return -1        end if        if midw(as_binary,li_cnt,1) = '1' then               ll_decimal = ll_decimal + (2 ^ (ll_len - li_cnt))        end if next   return ll_decimal end function   public function string of_bitwisenot (string as_bitvalue); /******************************************************************* 函数名称:of_bitwisenot() 参数:     as_bitvalue string 二进制值 返回值: string 反码 功能描述:求二进制反码 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer            li_cnt, li_count long               ll_result string             ls_value, ls_result   //检查参数 if isnull(as_bitvalue) then        setnull(ls_result)        return ls_result end if   li_cnt = lenw(as_bitvalue) //将0变为1,1变为0 for li_count = 1 to li_cnt        if midw(as_bitvalue, li_count, 1) = '0' then               ls_result = ls_result + '1'        else               ls_result = ls_result + '0'        end if end for        return ls_result   end function   public function string of_bitwisefill (string as_bitvalue); /******************************************************************* 函数名称:of_bitwisefill() 参数:     as_bitvalue string 二进制值 返回值: string 补码 功能描述:求二进制补码(要求前四位为符号位,1111表示负数,0000表示正数) 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer            li_cnt, li_count,li_pos long               ll_result string             ls_value, ls_result boolean lb_exit=false   //检查参数 if isnull(as_bitvalue) then        setnull(ls_result)        return ls_result end if //正数的补码为其本身 if leftw(as_bitvalue,4) = '0000' then        return as_bitvalue else        //负数的补码为反码加1        as_bitvalue = midw(as_bitvalue,5,lenw(as_bitvalue))        //求反码        ls_result = this.of_bitwisenot(as_bitvalue)           //低位加1        li_pos = lastpos(ls_result,'0')        if li_pos = 0 then               ls_result = fill('0',li_count)        else               ls_result = leftw(ls_result,li_pos - 1) + '1' + fill('0',lenw(ls_result) - li_pos)        end if        return fill('1',4) + fill('0',ceiling(lenw(ls_result) / 4) * 4 - lenw(ls_result)) + ls_result end if   end function   public function long of_bitwiseand (long al_value1, long al_value2); /******************************************************************* 函数名称:of_bitwiseand() 参数:     al_value1 long 值1                       al_value2 long 值2 返回值: long 按位与运算后的结果 功能描述:按位与运算 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer            li_cnt,li_len long               ll_result string            ls_bitvalue1,ls_bitvalue2,ls_return,ls_sign   //检查参数 if isnull(al_value1) or isnull(al_value2) then        setnull(ll_result)        return ll_result end if   ls_bitvalue1 = this.of_binary(al_value1)//取值1的二进制值 ls_bitvalue2 = this.of_binary(al_value2)//取值2的二进制值 //删除符号位 if leftw(ls_bitvalue1,1) = '-' then        ls_bitvalue1 = midw(ls_bitvalue1,2,lenw(ls_bitvalue1)) end if if leftw(ls_bitvalue2,1) = '-' then        ls_bitvalue2 = midw(ls_bitvalue2,2,lenw(ls_bitvalue2)) end if //取参与运算的二进制值长度 li_len = max(lenw(ls_bitvalue1),lenw(ls_bitvalue2)) li_len = ceiling(li_len / 4) * 4 //补位 ls_bitvalue1 = fill('0',li_len - lenw(ls_bitvalue1)) + ls_bitvalue1 ls_bitvalue2 = fill('0',li_len - lenw(ls_bitvalue2)) + ls_bitvalue2 //加符号位 if al_value1 < 0 then        ls_bitvalue1 = fill('1',4) + ls_bitvalue1 else        ls_bitvalue1 = fill('0',4) + ls_bitvalue1 end if if al_value2 < 0 then        ls_bitvalue2 = fill('1',4) + ls_bitvalue2 else        ls_bitvalue2 = fill('0',4) + ls_bitvalue2 end if //取补码 ls_bitvalue1 = this.of_bitwisefill(ls_bitvalue1)//取值1的二进值补码 ls_bitvalue2 = this.of_bitwisefill(ls_bitvalue2)//取值2的二进值补码 //对应位与运算(参数运算的两元素以补码表示,运算结果也以补码表示;只有二者都为1时结果才为1否则为0) for li_cnt = 1 to li_len + 4        if midw(ls_bitvalue1,li_cnt,1) = '1' and midw(ls_bitvalue2,li_cnt,1) = '1' then               ls_return = ls_return + '1'        else               ls_return = ls_return + '0'        end if next //对结果取补码 ls_return = this.of_bitwisefill(ls_return) //取结果符号 if leftw(ls_return,4) = '1111' then        ls_sign = '-' else        ls_sign = '' end if ls_return = midw(ls_return,5,lenw(ls_return)) //将结果转为十进制 ll_result = this.of_binarytodecimalunsigned (ls_return) //结果加上符号 if ls_sign = '-' then ll_result = ll_result * (-1)   return ll_result   end function   public function long of_bitwiseor (long al_value1, long al_value2); /******************************************************************* 函数名称:of_bitwiseor() 参数:     al_value1 long 值1                       al_value1 long 值2 返回值: long 按位或运算结果 功能描述:按位或运算 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer            li_cnt,li_len long               ll_result string            ls_bitvalue1,ls_bitvalue2,ls_return,ls_sign   //检查参数 if isnull(al_value1) or isnull(al_value2) then        setnull(ll_result)        return ll_result end if   ls_bitvalue1 = this.of_binary(al_value1)//取值1的二进制值 ls_bitvalue2 = this.of_binary(al_value2)//取值2的二进制值   //删除符号位 if leftw(ls_bitvalue1,1) = '-' then        ls_bitvalue1 = midw(ls_bitvalue1,2,lenw(ls_bitvalue1)) end if if leftw(ls_bitvalue2,1) = '-' then        ls_bitvalue2 = midw(ls_bitvalue2,2,lenw(ls_bitvalue2)) end if //取参与运算的二进制值长度 li_len = max(lenw(ls_bitvalue1),lenw(ls_bitvalue2)) li_len = ceiling(li_len / 4) * 4 //补位 ls_bitvalue1 = fill('0',li_len - lenw(ls_bitvalue1)) + ls_bitvalue1 ls_bitvalue2 = fill('0',li_len - lenw(ls_bitvalue2)) + ls_bitvalue2 //加符号位 if al_value1 < 0 then        ls_bitvalue1 = fill('1',4) + ls_bitvalue1 else        ls_bitvalue1 = fill('0',4) + ls_bitvalue1 end if if al_value2 < 0 then        ls_bitvalue2 = fill('1',4) + ls_bitvalue2 else        ls_bitvalue2 = fill('0',4) + ls_bitvalue2 end if //取补码 ls_bitvalue1 = this.of_bitwisefill(ls_bitvalue1)//取值1的补码 ls_bitvalue2 = this.of_bitwisefill(ls_bitvalue2)//取值2的补码 //对应位或运算(参数运算的两元素以补码表示,运算结果也以补码表示;只要二者中有一个为1时结果为1否则为0) for li_cnt = 1 to li_len + 4        if midw(ls_bitvalue1,li_cnt,1) = '1' or midw(ls_bitvalue2,li_cnt,1) = '1' then               ls_return = ls_return + '1'        else               ls_return = ls_return + '0'        end if next //对结果取补码 ls_return = this.of_bitwisefill(ls_return) if leftw(ls_return,4) = '1111' then        ls_sign = '-' else        ls_sign = '' end if ls_return = midw(ls_return,5,lenw(ls_return)) //将结果转为十进制 ll_result = this.of_binarytodecimalunsigned (ls_return) //加上符号位 if ls_sign = '-' then ll_result = ll_result * (-1)   return ll_result     end function   public function long of_bitwisexor (long al_value1, long al_value2); /******************************************************************* 函数名称:of_bitwiseor() 参数:     al_value1 long 值1                       al_value1 long 值2 返回值: long 按位异或运算结果 功能描述:按位异或运算 创建人:  康剑民 创建日期:2004-05-23 版本号:    v1.0.0  *******************************************************************/ integer            li_cnt,li_len long               ll_result string            ls_bitvalue1,ls_bitvalue2,ls_return,ls_sign   //检查参数 if isnull(al_value1) or isnull(al_value2) then        setnull(ll_result)        return ll_result end if   ls_bitvalue1 = this.of_binary(al_value1)//取值1的二进制值 ls_bitvalue2 = this.of_binary(al_value2)//取值2的二进制值 //删除符号位 if leftw(ls_bitvalue1,1) = '-' then        ls_bitvalue1 = midw(ls_bitvalue1,2,lenw(ls_bitvalue1)) end if if leftw(ls_bitvalue2,1) = '-' then        ls_bitvalue2 = midw(ls_bitvalue2,2,lenw(ls_bitvalue2)) end if //取参与运算的二进制值长度 li_len = max(lenw(ls_bitvalue1),lenw(ls_bitvalue2)) li_len = ceiling(li_len / 4) * 4 //补位 ls_bitvalue1 = fill('0',li_len - lenw(ls_bitvalue1)) + ls_bitvalue1 ls_bitvalue2 = fill('0',li_len - lenw(ls_bitvalue2)) + ls_bitvalue2 //加符号位 if al_value1 < 0 then        ls_bitvalue1 = fill('1',4) + ls_bitvalue1 else        ls_bitvalue1 = fill('0',4) + ls_bitvalue1 end if if al_value2 < 0 then        ls_bitvalue2 = fill('1',4) + ls_bitvalue2 else        ls_bitvalue2 = fill('0',4) + ls_bitvalue2 end if //取补码 ls_bitvalue1 = this.of_bitwisefill(ls_bitvalue1)//取值1的补码 ls_bitvalue2 = this.of_bitwisefill(ls_bitvalue2)//取值2的补码 //对应位异或运算(参数运算的两元素以补码表示,运算结果也以补码表示;只有二者不相同时结果为1否则为0) for li_cnt = 1 to li_len + 4        if (midw(ls_bitvalue1,li_cnt,1) = '1' and midw(ls_bitvalue2,li_cnt,1) = '0') or &               (midw(ls_bitvalue1,li_cnt,1) = '0' and midw(ls_bitvalue2,li_cnt,1) = '1') then               ls_return = ls_return + '1'        else               ls_return = ls_return + '0'        end if next //对结果取补码 ls_return = this.of_bitwisefill(ls_return) if leftw(ls_return,4) = '1111' then        ls_sign = '-' else        ls_sign = '' end if ls_return = midw(ls_return,5,lenw(ls_return)) //将结果转为十进制 ll_result = this.of_binarytodecimalunsigned(ls_return) //加符号位 if ls_sign = '-' then ll_result = ll_result * (-1)   return ll_result   end function   on nvo_numerical.create call super::create triggerevent( this, "constructor" ) end on   on nvo_numerical.destroy triggerevent( this, "destructor" ) call super::destroy end on   二,       nvo_md5对象,提供字符加密功能。 forward global type nvo_md5 from nonvisualobject end type end forward   global type nvo_md5 from nonvisualobject autoinstantiate end type   type prototypes //ansi转为unicode function int MultiByteToWideChar(uint codepage, ulong dwflags, ref string lpmultibytestr, int cchmultibyte, ref long lpwidecharstr, int cchwidechar) library "kernel32.dll" end prototypes type variables nvo_numerical inv_numerical//数字服务对象 end variables   forward prototypes private function long of_addunsigned (readonly long al_x, readonly long al_y) private function long of_converttowordarray (readonly string as_origmess, ref long al_word[]) public function string of_encrypt (readonly string as_origmess) private function long of_f (readonly long al_x, readonly long al_y, readonly long al_z) private function long of_ff (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac) private function long of_g (readonly long al_x, readonly long al_y, readonly long al_z) private function long of_gg (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac) private function long of_h (readonly long al_x, readonly long al_y, readonly long al_z) private function long of_hh (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac) private function long of_i (readonly long al_x, readonly long al_y, readonly long al_z) private function long of_ii (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac) private function string of_wordtohex (readonly long al_value) private function long of_rshift (readonly long al_oldvalue, readonly long al_shiftbits) private function long of_rotateleft (readonly long al_oldvalue, readonly long al_shiftbits) private function long of_monbits (readonly long al_oldvalue) private function long of_m2power (readonly long al_oldvalue) private function long of_lshift (readonly long al_oldvalue, readonly long al_shiftbits) private function long of_getunicode (string as_char) end prototypes   private function long of_addunsigned (readonly long al_x, readonly long al_y); /******************************************************************* 函数名称:of_addunsigned() 参数:     al_x long 值1                       al_y long 值2 返回值: long 运算结果 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24(第一版) 版本号:    v1.0.0 *******************************************************************/ return al_x + al_y end function   private function long of_converttowordarray (readonly string as_origmess, ref long al_word[]); /******************************************************************* 函数名称:of_converttowordarray() 参数:     as_origmess string 原文本                       al_word[] ref long 转换后的数组 返回值: long 是否成功(1/-1) 功能描述:将字符装入数组并进行位填充 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ long ll_lenofmess,ll_wordarraylen,ll_posofword,ll_posofmess,ll_countofword long i,ll_temp,ll_word_list[],ll_word_unicode string ls_return,ls_char   ll_lenofmess = lenw(as_origmess) ll_wordarraylen = (integer((ll_lenofmess + 8) / 64) + 1) * 16 ll_countofword = 0 for i = 1 to ll_wordarraylen        ll_word_list[i] = 0 next   ll_posofmess = 0 ll_posofword = 0 ll_countofword = 0 do while ll_posofmess < ll_lenofmess        ls_char = midw(as_origmess,ll_posofmess + 1,1)              ll_countofword = integer(ll_posofmess / 4)        ll_posofword = mod(ll_posofmess,4)        if ll_countofword + 1 > 0 and ll_countofword + 1 <= upperbound(ll_word_list) then               ll_word_unicode = this.of_getunicode(ls_char)//取字符的unicode值               ll_word_list[ll_countofword + 1] = inv_numerical.of_bitwiseor(ll_word_list[ll_countofword + 1],this.of_lshift(ll_word_unicode,ll_posofword * 8))        end if        ll_posofmess ++ loop   ll_countofword = integer(ll_posofmess / 4) ll_posofword = mod(ll_posofmess,4) if ll_countofword + 1 > 0 and ll_countofword + 1 <= upperbound(ll_word_list) then        ll_word_list[ll_countofword + 1] = inv_numerical.of_bitwiseor(ll_word_list[ll_countofword + 1],this.of_lshift(128,ll_posofword * 8)) end if   if ll_wordarraylen - 2 + 1 > 0 and ll_wordarraylen - 2 + 1 <= upperbound(ll_word_list) then        ll_word_list[ll_wordarraylen - 2 + 1] = inv_numerical.of_bitwiseor(ll_word_list[ll_wordarraylen - 2 + 1],this.of_lshift(ll_lenofmess,3)) end if   if ll_wordarraylen - 1 + 1 > 0 and ll_wordarraylen - 1 + 1 <= upperbound(ll_word_list) then        ll_word_list[ll_wordarraylen - 1 + 1] = inv_numerical.of_bitwiseor(ll_word_list[ll_wordarraylen - 1 + 1],this.of_rshift(ll_lenofmess,29)) end if   al_word = ll_word_list   return 1 end function public function string of_encrypt (readonly string as_origmess); /******************************************************************* 函数名称:of_encrypt() 参数:     as_origmess string 原文本 返回值: string 加密后文本 功能描述:md5加密 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ long ll_word_list[16]= long ll_a,ll_b,ll_c,ll_d,ll_aa,ll_bb,ll_cc,ll_dd,ll_temp[] string ls_return='' long ll_wordarraycount,ll_wordarraylen   //初始化核心变量 ll_a = 1732584193 ll_b = -271733879 ll_c = -1732584194 ll_d = 271733878   //将字符装入数组并进行位填充 this.of_converttowordarray(as_origmess,ll_temp) ll_wordarraycount = 0 ll_wordarraylen = (long((lenw(as_origmess) + 8) / 64) + 1) * 16   do while ll_wordarraycount < ll_wordarraylen        ll_aa = ll_a        ll_bb = ll_b        ll_cc = ll_c        ll_dd = ll_d              ll_wordarraycount = ll_wordarraycount + 1        //第一轮运算        if ll_wordarraycount + 0 > 0 and ll_wordarraycount + 0 <= upperbound(ll_temp) then               ll_a = this.of_ff(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 0],ll_word_list[1],-680876936)        end if             if ll_wordarraycount + 1 > 0 and ll_wordarraycount + 1 <= upperbound(ll_temp) then               ll_d = this.of_ff(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 1],ll_word_list[2],-389564586)        end if        if ll_wordarraycount + 2 > 0 and ll_wordarraycount + 2 <= upperbound(ll_temp) then               ll_c = this.of_ff(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 2],ll_word_list[3],606105819)        end if        if ll_wordarraycount + 3 > 0 and ll_wordarraycount + 3 <= upperbound(ll_temp) then               ll_b = this.of_ff(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 3],ll_word_list[4],-1044525330)        end if        if ll_wordarraycount + 4 > 0 and ll_wordarraycount + 4 <= upperbound(ll_temp) then               ll_a = this.of_ff(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 4],ll_word_list[1],-176418897)        end if        if ll_wordarraycount + 5 > 0 and ll_wordarraycount + 5 <= upperbound(ll_temp) then               ll_d = this.of_ff(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 5],ll_word_list[2],1200080426)        end if        if ll_wordarraycount + 6 > 0 and ll_wordarraycount + 6 <= upperbound(ll_temp) then               ll_c = this.of_ff(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 6],ll_word_list[3],-1473231341)        end if        if ll_wordarraycount + 7 > 0 and ll_wordarraycount + 7 <= upperbound(ll_temp) then               ll_b = this.of_ff(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 7],ll_word_list[4],-45705983)        end if        if ll_wordarraycount + 8 > 0 and ll_wordarraycount + 8 <= upperbound(ll_temp) then               ll_a = this.of_ff(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 8],ll_word_list[1],1770035416)        end if        if ll_wordarraycount + 9 > 0 and ll_wordarraycount + 9 <= upperbound(ll_temp) then               ll_d = this.of_ff(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 9],ll_word_list[2],-1958414417)        end if        if ll_wordarraycount + 10 > 0 and ll_wordarraycount + 10 <= upperbound(ll_temp) then               ll_c = this.of_ff(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 10],ll_word_list[3],-42063)        end if        if ll_wordarraycount + 11 > 0 and ll_wordarraycount + 11 <= upperbound(ll_temp) then               ll_b = this.of_ff(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 11],ll_word_list[4],-1990404162)        end if        if ll_wordarraycount + 12 > 0 and ll_wordarraycount + 12 <= upperbound(ll_temp) then               ll_a = this.of_ff(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 12],ll_word_list[1],1804603682)        end if        if ll_wordarraycount + 13 > 0 and ll_wordarraycount + 13 <= upperbound(ll_temp) then               ll_d = this.of_ff(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 13],ll_word_list[2],-40341101)        end if        if ll_wordarraycount + 14 > 0 and ll_wordarraycount + 14 <= upperbound(ll_temp) then               ll_c = this.of_ff(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 14],ll_word_list[3],-1502002290)        end if        if ll_wordarraycount + 15 > 0 and ll_wordarraycount + 15 <= upperbound(ll_temp) then               ll_b = this.of_ff(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 15],ll_word_list[4],1236535329)        end if        //第二轮运算        if ll_wordarraycount + 1 > 0 and ll_wordarraycount + 1 <= upperbound(ll_temp) then               ll_a = this.of_gg(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 1],ll_word_list[5],-165796510)        end if        if ll_wordarraycount + 6 > 0 and ll_wordarraycount + 6 <= upperbound(ll_temp) then               ll_d = this.of_gg(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 6],ll_word_list[6],-1069501632)        end if        if ll_wordarraycount + 11 > 0 and ll_wordarraycount + 11 <= upperbound(ll_temp) then               ll_c = this.of_gg(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 11],ll_word_list[7],643717713)        end if        if ll_wordarraycount + 0 > 0 and ll_wordarraycount + 0 <= upperbound(ll_temp) then               ll_b = this.of_gg(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 0],ll_word_list[8],-373897302)        end if        if ll_wordarraycount + 5 > 0 and ll_wordarraycount + 5 <= upperbound(ll_temp) then               ll_a = this.of_gg(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 5],ll_word_list[5],-701558691)        end if        if ll_wordarraycount + 10 > 0 and ll_wordarraycount + 10 <= upperbound(ll_temp) then               ll_d = this.of_gg(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 10],ll_word_list[6],38016083)        end if        if ll_wordarraycount + 15 > 0 and ll_wordarraycount + 15 <= upperbound(ll_temp) then               ll_c = this.of_gg(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 15],ll_word_list[7],-660478335)        end if        if ll_wordarraycount + 4 > 0 and ll_wordarraycount + 4 <= upperbound(ll_temp) then               ll_b = this.of_gg(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 4],ll_word_list[8],-405537848)        end if        if ll_wordarraycount + 9 > 0 and ll_wordarraycount + 9 <= upperbound(ll_temp) then               ll_a = this.of_gg(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 9],ll_word_list[5],568446438)        end if        if ll_wordarraycount + 14 > 0 and ll_wordarraycount + 14 <= upperbound(ll_temp) then               ll_d = this.of_gg(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 14],ll_word_list[6],-1019803690)        end if        if ll_wordarraycount + 3 > 0 and ll_wordarraycount + 3 <= upperbound(ll_temp) then               ll_c = this.of_gg(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 3],ll_word_list[7],-187363961)        end if        if ll_wordarraycount + 8 > 0 and ll_wordarraycount + 8 <= upperbound(ll_temp) then               ll_b = this.of_gg(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 8],ll_word_list[8],1163531501)        end if        if ll_wordarraycount + 13 > 0 and ll_wordarraycount + 13 <= upperbound(ll_temp) then               ll_a = this.of_gg(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 13],ll_word_list[5],-1444681467)        end if        if ll_wordarraycount + 2 > 0 and ll_wordarraycount + 2 <= upperbound(ll_temp) then               ll_d = this.of_gg(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 2],ll_word_list[6],-51403784)        end if        if ll_wordarraycount + 7 > 0 and ll_wordarraycount + 7 <= upperbound(ll_temp) then               ll_c = this.of_gg(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 7],ll_word_list[7],1735328473)        end if        if ll_wordarraycount + 12 > 0 and ll_wordarraycount + 12 <= upperbound(ll_temp) then               ll_b = this.of_gg(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 12],ll_word_list[8],-1926607734)        end if        //第三轮运算        if ll_wordarraycount + 5 > 0 and ll_wordarraycount + 5 <= upperbound(ll_temp) then               ll_a = this.of_hh(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 5],ll_word_list[9],-378558)        end if        if ll_wordarraycount + 8 > 0 and ll_wordarraycount + 8 <= upperbound(ll_temp) then               ll_d = this.of_hh(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 8],ll_word_list[10],-2022574463)        end if        if ll_wordarraycount + 11 > 0 and ll_wordarraycount + 11 <= upperbound(ll_temp) then               ll_c = this.of_hh(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 11],ll_word_list[11],1839030562)        end if        if ll_wordarraycount + 14 > 0 and ll_wordarraycount + 14 <= upperbound(ll_temp) then               ll_b = this.of_hh(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 14],ll_word_list[12],-35309556)        end if        if ll_wordarraycount + 1 > 0 and ll_wordarraycount + 1 <= upperbound(ll_temp) then               ll_a = this.of_hh(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 1],ll_word_list[9],-1530992060)        end if        if ll_wordarraycount + 4 > 0 and ll_wordarraycount + 4 <= upperbound(ll_temp) then               ll_d = this.of_hh(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 4],ll_word_list[10],1272893353)        end if        if ll_wordarraycount + 7 > 0 and ll_wordarraycount + 7 <= upperbound(ll_temp) then               ll_c = this.of_hh(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 7],ll_word_list[11],-155497632)        end if        if ll_wordarraycount + 10 > 0 and ll_wordarraycount + 10 <= upperbound(ll_temp) then               ll_b = this.of_hh(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 10],ll_word_list[12],-1094730640)        end if        if ll_wordarraycount + 13 > 0 and ll_wordarraycount + 13 <= upperbound(ll_temp) then               ll_a = this.of_hh(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 13],ll_word_list[9],681279174)        end if        if ll_wordarraycount + 0 > 0 and ll_wordarraycount + 0 <= upperbound(ll_temp) then               ll_d = this.of_hh(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 0],ll_word_list[10],-358537222)        end if        if ll_wordarraycount + 3 > 0 and ll_wordarraycount + 3 <= upperbound(ll_temp) then               ll_c = this.of_hh(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 3],ll_word_list[11],-722521979)        end if        if ll_wordarraycount + 6 > 0 and ll_wordarraycount + 6 <= upperbound(ll_temp) then               ll_b = this.of_hh(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 6],ll_word_list[12],76029189)        end if        if ll_wordarraycount + 9 > 0 and ll_wordarraycount + 9 <= upperbound(ll_temp) then               ll_a = this.of_hh(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 9],ll_word_list[9],-640364487)        end if        if ll_wordarraycount + 12 > 0 and ll_wordarraycount + 12 <= upperbound(ll_temp) then               ll_d = this.of_hh(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 12],ll_word_list[10],-421815835)        end if        if ll_wordarraycount + 15 > 0 and ll_wordarraycount + 15 <= upperbound(ll_temp) then               ll_c = this.of_hh(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 15],ll_word_list[11],530742520)        end if        if ll_wordarraycount + 2 > 0 and ll_wordarraycount + 2 <= upperbound(ll_temp) then               ll_b = this.of_hh(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 2],ll_word_list[12],-995338651)        end if        //第四轮运算        if ll_wordarraycount + 0 > 0 and ll_wordarraycount + 0 <= upperbound(ll_temp) then               ll_a = this.of_ii(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 0],ll_word_list[13],-198630844)        end if        if ll_wordarraycount + 7 > 0 and ll_wordarraycount + 7 <= upperbound(ll_temp) then               ll_d = this.of_ii(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 7],ll_word_list[14],1126891415)        end if        if ll_wordarraycount + 14 > 0 and ll_wordarraycount + 14 <= upperbound(ll_temp) then               ll_c = this.of_ii(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 14],ll_word_list[15],-1416354905)        end if        if ll_wordarraycount + 5 > 0 and ll_wordarraycount + 5 <= upperbound(ll_temp) then               ll_b = this.of_ii(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 5],ll_word_list[16],-57434055)        end if        if ll_wordarraycount + 12 > 0 and ll_wordarraycount + 12 <= upperbound(ll_temp) then               ll_a = this.of_ii(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 12],ll_word_list[13],1700485571)        end if        if ll_wordarraycount + 3 > 0 and ll_wordarraycount + 3 <= upperbound(ll_temp) then               ll_d = this.of_ii(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 3],ll_word_list[14],-1894986606)        end if        if ll_wordarraycount + 10 > 0 and ll_wordarraycount + 10 <= upperbound(ll_temp) then               ll_c = this.of_ii(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 10],ll_word_list[15],-1051523)        end if        if ll_wordarraycount + 1 > 0 and ll_wordarraycount + 1 <= upperbound(ll_temp) then               ll_b = this.of_ii(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 1],ll_word_list[16],-2054922799)        end if        if ll_wordarraycount + 8 > 0 and ll_wordarraycount + 8 <= upperbound(ll_temp) then               ll_a = this.of_ii(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 8],ll_word_list[13],1873313359)        end if        if ll_wordarraycount + 15 > 0 and ll_wordarraycount + 15 <= upperbound(ll_temp) then               ll_d = this.of_ii(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 15],ll_word_list[14],-30611744)        end if        if ll_wordarraycount + 6 > 0 and ll_wordarraycount + 6 <= upperbound(ll_temp) then               ll_c = this.of_ii(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 6],ll_word_list[15],-1560198380)        end if        if ll_wordarraycount + 13 > 0 and ll_wordarraycount + 13 <= upperbound(ll_temp) then               ll_b = this.of_ii(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 13],ll_word_list[16],1309151649)        end if        if ll_wordarraycount + 4 > 0 and ll_wordarraycount + 4 <= upperbound(ll_temp) then               ll_a = this.of_ii(ll_a,ll_b,ll_c,ll_d,ll_temp[ll_wordarraycount + 4],ll_word_list[13],-145523070)        end if        if ll_wordarraycount + 11 > 0 and ll_wordarraycount + 11 <= upperbound(ll_temp) then               ll_d = this.of_ii(ll_d,ll_a,ll_b,ll_c,ll_temp[ll_wordarraycount + 11],ll_word_list[14],-1120210379)        end if        if ll_wordarraycount + 2 > 0 and ll_wordarraycount + 2 <= upperbound(ll_temp) then               ll_c = this.of_ii(ll_c,ll_d,ll_a,ll_b,ll_temp[ll_wordarraycount + 2],ll_word_list[15],718787259)        end if        if ll_wordarraycount + 9 > 0 and ll_wordarraycount + 9 <= upperbound(ll_temp) then               ll_b = this.of_ii(ll_b,ll_c,ll_d,ll_a,ll_temp[ll_wordarraycount + 9],ll_word_list[16],-343485551)        end if        //中间结果向右位移        ll_a = this.of_addunsigned(ll_a,ll_aa)        ll_b = this.of_addunsigned(ll_b,ll_bb)        ll_c = this.of_addunsigned(ll_c,ll_cc)        ll_d = this.of_addunsigned(ll_d,ll_dd)          ll_wordarraycount = ll_wordarraycount + 16 - 1 loop   //生成128位散列值 ls_return = lower(this.of_wordtohex(ll_a) + this.of_wordtohex(ll_b) + this.of_wordtohex(ll_c) + this.of_wordtohex(ll_d))   return ls_return end function   private function long of_f (readonly long al_x, readonly long al_y, readonly long al_z); /******************************************************************* 函数名称:of_f() 参数:     al_x long 值1                       al_y long 值2                       al_z long 值3 返回值: long 位运算结果 功能描述:md5加密时的位运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ return inv_numerical.of_bitwiseor(inv_numerical.of_bitwiseand(al_x,al_y),inv_numerical.of_bitwiseand((al_x + 1) * (-1),al_z)) end function   private function long of_ff (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac);/******************************************************************* 函数名称:of_ff() 参数:     al_a long 值1                       al_b long 值2                       al_c long 值3                       al_d long 值4                       al_x long 值5                       al_s long 值6                       al_ac long 值7 返回值: long 运算结果 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ long ll_return   ll_return = this.of_f(al_b,al_c,al_d) ll_return = this.of_addunsigned(ll_return,al_x) ll_return = this.of_addunsigned(ll_return,al_ac) ll_return = this.of_addunsigned(al_a,ll_return) ll_return = this.of_rotateleft(ll_return,al_s) ll_return = this.of_addunsigned(ll_return,al_b)   return ll_return end function   private function long of_g (readonly long al_x, readonly long al_y, readonly long al_z); /******************************************************************* 函数名称:of_g() 参数:     al_x long 值1                       al_y long 值2                       al_z long 值3 返回值: long 位运算结果 功能描述:md5加密时的位运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ return inv_numerical.of_bitwiseor(inv_numerical.of_bitwiseand(al_x,al_z),inv_numerical.of_bitwiseand(al_y,(al_z + 1) * (-1))) end function   private function long of_gg (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac); /******************************************************************* 函数名称:of_gg() 参数:     al_a long 值1                       al_b long 值2                       al_c long 值3                       al_d long 值4                       al_x long 值5                       al_s long 值6                       al_ac long 值7 返回值: long 运算结果 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ long ll_return   ll_return = this.of_g(al_b,al_c,al_d) ll_return = this.of_addunsigned(ll_return,al_x) ll_return = this.of_addunsigned(ll_return,al_ac) ll_return = this.of_addunsigned(al_a,ll_return) ll_return = this.of_rotateleft(ll_return,al_s) ll_return = this.of_addunsigned(ll_return,al_b)   return ll_return end function   private function long of_h (readonly long al_x, readonly long al_y, readonly long al_z); /******************************************************************* 函数名称:of_h() 参数:     al_x long 值1                       al_y long 值2                       al_z long 值3 返回值: long 位运算结果 功能描述:md5加密时的位运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ return inv_numerical.of_bitwisexor(inv_numerical.of_bitwisexor(al_x,al_y),al_z) end function   private function long of_hh (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac);/******************************************************************* 函数名称:of_hh() 参数:     al_a long 值1                       al_b long 值2                       al_c long 值3                       al_d long 值4                       al_x long 值5                       al_s long 值6                       al_ac long 值7 返回值: long 运算结果 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ long ll_return   ll_return = this.of_h(al_b,al_c,al_d) ll_return = this.of_addunsigned(ll_return,al_x) ll_return = this.of_addunsigned(ll_return,al_ac) ll_return = this.of_addunsigned(al_a,ll_return) ll_return = this.of_rotateleft(ll_return,al_s) ll_return = this.of_addunsigned(ll_return,al_b)   return ll_return end function   private function long of_i (readonly long al_x, readonly long al_y, readonly long al_z); /******************************************************************* 函数名称:of_i() 参数:     al_x long 值1                       al_y long 值2                       al_z long 值3 返回值: long 位运算结果 功能描述:md5加密时的位运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ return inv_numerical.of_bitwisexor(al_y,inv_numerical.of_bitwiseor(al_x,(al_z + 1) * (-1))) end function   private function long of_ii (readonly long al_a, readonly long al_b, readonly long al_c, readonly long al_d, readonly long al_x, readonly long al_s, readonly long al_ac); /******************************************************************* 函数名称:of_ii() 参数:     al_a long 值1                       al_b long 值2                       al_c long 值3                       al_d long 值4                       al_x long 值5                       al_s long 值6                       al_ac long 值7 返回值: long 运算结果 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ long ll_return   ll_return = this.of_i(al_b,al_c,al_d) ll_return = this.of_addunsigned(ll_return,al_x) ll_return = this.of_addunsigned(ll_return,al_ac) ll_return = this.of_addunsigned(al_a,ll_return) ll_return = this.of_rotateleft(ll_return,al_s) ll_return = this.of_addunsigned(ll_return,al_b)   return ll_return end function   private function string of_wordtohex (readonly long al_value); /******************************************************************* 函数名称:of_wordtohex() 参数:     al_value long 原值 返回值: string 转化为十六进制后的值 功能描述:将数字转为十六进制值 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ string ls_return,ls_temp long ll_temp,ll_count   ls_return = '' ll_count = 0 do while ll_count < 4        ll_temp = inv_numerical.of_bitwiseand(this.of_rshift(al_value,ll_count * 8),255)        choose case integer(ll_temp / 16)        case 0 to 9               ls_temp = string(integer(ll_temp / 16))        case 10               ls_temp = 'a'        case 11               ls_temp = 'b'        case 12               ls_temp = 'c'        case 13               ls_temp = 'd'        case 14               ls_temp = 'e'        case 15               ls_temp = 'f'        case else               ls_temp = ''        end choose        ls_return = ls_return + ls_temp        choose case mod(ll_temp,16)        case 0 to 9               ls_temp = string(mod(ll_temp,16))        case 10               ls_temp = 'a'        case 11               ls_temp = 'b'        case 12               ls_temp = 'c'        case 13               ls_temp = 'd'        case 14               ls_temp = 'e'        case 15               ls_temp = 'f'        case else               ls_temp = ''        end choose        ls_return = ls_return + ls_temp        ll_count = ll_count + 1 loop   return ls_return end function   private function long of_rshift (readonly long al_oldvalue, readonly long al_shiftbits); /******************************************************************* 函数名称:of_rshift() 参数:     al_oldvalue long 原值                       al_shiftbits long 右移位数 返回值: long 右移指定位数后的值 功能描述:数值按位右移 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ ulong ll_return,ll_pos string ls_value   //转成二进制 ls_value = inv_numerical.of_binary(al_oldvalue)   if al_oldvalue < 0 then           ls_value = midw(ls_value,2,lenw(ls_value))        ls_value = inv_numerical.of_bitwisenot(ls_value)        //低位加1        ll_pos = lastpos(ls_value,'0')        if ll_pos = 0 then               ls_value = fill('0',lenw(ls_value))        else               ls_value = leftw(ls_value,ll_pos - 1) + '1' + fill('0',lenw(ls_value) - ll_pos)        end if        ls_value = fill('1',32 - lenw(ls_value)) + ls_value        ll_return = inv_numerical.of_decimal(ls_value) else        ll_return = al_oldvalue end if   ll_return = long(ll_return / this.of_m2power(al_shiftbits)) //转成二进制 ls_value = inv_numerical.of_binary(ll_return) if ll_return < 0 then        ls_value = midw(ls_value,2,lenw(ls_value))        ls_value = inv_numerical.of_bitwisenot(ls_value)        //低位加1        ll_pos = lastpos(ls_value,'0')        if ll_pos = 0 then               ls_value = fill('0',lenw(ls_value))        else               ls_value = leftw(ls_value,ll_pos - 1) + '1' + fill('0',lenw(ls_value) - ll_pos)        end if        ls_value = fill('1',32 - lenw(ls_value)) + ls_value        ll_return = inv_numerical.of_decimal(ls_value) end if ll_return = inv_numerical.of_bitwiseand(ll_return,-1)   return ll_return end function   private function long of_rotateleft (readonly long al_oldvalue, readonly long al_shiftbits); /******************************************************************* 函数名称:of_rotateleft() 参数:     al_oldvalue long 原值                       al_shiftbits long 左移位数 返回值: long 数据左移指定位数后的值 功能描述:数据左移指定位数 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ return inv_numerical.of_bitwiseor(this.of_lshift(al_oldvalue,al_shiftbits),this.of_rshift(al_oldvalue,32 - al_shiftbits)) end function   private function long of_monbits (readonly long al_oldvalue); /******************************************************************* 函数名称:of_monbits() 参数:     al_oldvalue long 原值 返回值: long 新值 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ if al_oldvalue >= 0 and al_oldvalue <= 30 then        return 2^(al_oldvalue + 1) - 1 else        return 0 end if end function   private function long of_m2power (readonly long al_oldvalue); /******************************************************************* 函数名称:of_m2power() 参数:     al_oldvalue long 原值 返回值: long 新值 功能描述:md5加密时的运算之一 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ if al_oldvalue >= 0 and al_oldvalue <= 30 then        return 2^al_oldvalue else        return 0 end if end function   private function long of_lshift (readonly long al_oldvalue, readonly long al_shiftbits); /******************************************************************* 函数名称:of_lshift() 参数:     al_oldvalue long 原值                       al_shiftbits long 左移位数 返回值: long 左移指定位数后的值 功能描述:数值按位左移 创建人:  康剑民 创建日期:2004-05-24 版本号:     v1.0.0 *******************************************************************/ ulong ll_return,ll_pos string ls_value   //转成二进制 ls_value = inv_numerical.of_binary(al_oldvalue) if al_oldvalue < 0 then           ls_value = midw(ls_value,2,lenw(ls_value))        ls_value = inv_numerical.of_bitwisenot(ls_value)        //低位加1        ll_pos = lastpos(ls_value,'0')        if ll_pos = 0 then               ls_value = fill('0',lenw(ls_value))        else               ls_value = leftw(ls_value,ll_pos - 1) + '1' + fill('0',lenw(ls_value) - ll_pos)        end if        ls_value = fill('1',32 - lenw(ls_value)) + ls_value        ll_return = inv_numerical.of_decimal(ls_value) else        ll_return = al_oldvalue end if   ll_return = ll_return * this.of_m2power(al_shiftbits) ll_return = inv_numerical.of_bitwiseand(ll_return,-1)   return ll_return end function   private function integer of_getunicode (string as_char); /******************************************************************* 函数名称:of_getunicode() 参数:     as_char string 字符 返回值: long unicode编码 功能描述:取字符的unicode编码 创建人:  康剑民 创建日期:2004-05-24(第一版) 版本号:     v1.0.0 *******************************************************************/ long ll_len_old,ll_len_new long ll_return   ll_len_old = len(as_char) ll_len_new = 2 * ll_len_old MultiByteToWideChar(0, 0, as_char, ll_len_old, ll_return, ll_len_new) if ll_return < 0 then ll_return = 65536 – abs(ll_return) return ll_return   end function on nvo_md5.create call super::create triggerevent( this, "constructor" ) end on   on nvo_md5.destroy triggerevent( this, "destructor" ) call super::destroy end on     以下是调用nvo_md5中of_encrypt()的测试结果: 参数1:’’ 结果1:d41d8cd98f00b204e9800998ecf8427e 参数2:’a’ 结果2:0cc175b9c0f1b6a831c399e269772661 参数3:’abc’ 结果3:900150983cd24fb0d6963f7d28e17f72 参数4:’ab cd’ 结果4:04a7d98b199aaaac0b3bebeae31e2bfc 参数5:’1’ 结果5:c4ca4238a0b923820dcc509a6f75849b 参数6:’1234567890’ 结果6:e807f1fcf82d132f9bb018ca6738a19f 参数7:’请’ 结果7:06a4c398f66e05c94159cfeb601e185b 参数8:’請’ 结果8:e11b4b598f8c28ee1b159cc218c7c059 参数9:’中国’ 结果9:4c9370f4ddb0ff4862701ee019a58b46 参数10:’中国 china 086’ 结果10:7b3104a9188e89f5c13de67c180a5f28  

    最新回复(0)