MD5算法在PB中的实现(转载自 - 阿多米 - 博客园)

注:转载请写明出处。本文转载自--阿多米,原链接:http://www.cnblogs.com/zzjder/archive/2008/10/23/1317505.html

  目的是防止原链接失效,好文章要保存起来。

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]={7,12,17,22,5,9,14,20,4,11,16,23,6,10,15,21}

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

时间: 2024-10-13 06:40:32

MD5算法在PB中的实现(转载自 - 阿多米 - 博客园)的相关文章

HTML中META属性详解 转载自 hero_213的博客

HTML中META属性详解 meta是html语言head区的一个辅助性标签.几乎所有的网页里,我们可以看到类似下面这段的html代码: <head> <meta   http-equiv= "content-Type "   content= "text/html;   charset=gb2312 "> </head>         也许你认为这些代码可有可无.其实如果你能够用好meta标签,会给你带来意想不到的效果,例如加

【转载】国内网站博客数据统计选免费Google Analytics还是百度统计

[转载]国内网站博客数据统计选免费Google Analytics还是百度统计 Google Analytics谷歌统计是我用的第一个网站统计工具,当然现在也一直在用.Google Analytics凭借其强大的功能和超强的稳定性.快速的反应能力.广泛的数据应用功能,受到了广大站长的追捧. 使用Google Analytics的站长们应该不在少数吧,每天登录Google Analytics免费网站上查看网站的流量也是我们这些站长们必须做的事情,认真分析Google Analytics当中的数据信

VS建立的Winform程序中连接Oracle数据库能正常运行在Web中却不能正常连接运行可能原因(本文来自博客园深蓝居)

我们平时使用的都是32位的机器进行开发,装的都是32位的软件,但是我们的服务器一般都是64位的,所以有时也需要在64位的环境下装一个VS调试程序.最近遇到的一个问题就是一个同事换了一个电脑,用的是X64的Windows 2008作为操作系统,要进行Oracle的数据库连接,所以也装了64位的Oracle客户端.如果是控制应用项目或者WinForm项目可以正常连接Oracle,但是Web项目在程序中打开Oracle连接时,系统抛出了异常: 尝试加载 Oracle 客户端库时引发 BadImageF

C#项目中使用 Selenium + PhantomJS 模拟登录博客园

Selenium selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium PhantomJS PhantomJS是一个基于webkit的javascript API.它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码.任何你可以在基于webkit浏览器做的事情,它都能做到.它不仅是个隐形的浏览器,提供了诸如CSS选择器.支持Web标准.DOM操作.JSON.html5.Canvas.SVG等,同时也提供了

C# 中使用System.Net.Http.HttpClient 模拟登录博客园 (GET/POST)

一. System.Net.Http.HttpClient简介 System.Net.Http 是微软.net4.5中推出的HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容: 1. 用户通过 HTTP 使用现代化的 Web Service 的客户端组件: 2. 能够同时在客户端与服务端同时使用的 HTTP 组件(比如处理 HTTP 标头和消息), 为客户端和服务端提供一致的编程模型. 个人看来是抄袭apache http client ,目前网上用的

黄聪:博客园的积分和排名算法探讨,积分是怎么计算的?(转)

我们先来看看现行规则,用公式表示为:-------------------------------------------------------------------BlogScore = BeRead + 10 * BeComment + 50 * CommentBlogScore:博客积分BeRead:个人博客所有随笔和文章的阅读数之和BeComment:个人博客被评论总数Comment: 个人所发表的评论总数---------------------------------------

运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中

原文地址:运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中 依赖包: 1.jieba 2.pymongo 3.HTMLParser # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ from HTMLParser import HTMLParser import re import time from datetime import date im

在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能

本篇随笔介绍在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能,首先对Quartz.NET进行一个简单的介绍和代码分析,掌握对作业调度的处理,然后对博客园RSS内容的处理如何获取,并结合微信消息的群发接口进行内容的发送,从而构建了一个在Web应用中利用作业调度来进行消息发送的业务模型. Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)

C#控制台基础 正则表达式,regex,webclient下载博客园网页中的一张图片

1 网页图 这网页就一张图片,新手入门,找个简单一些的. 2 代码 1 正则表达式,regex,webclient下载博客园网页中的一张图片 2 3 4 using System; 5 using System.Collections.Generic; 6 using System.IO; 7 using System.Linq; 8 using System.Net; 9 using System.Text; 10 using System.Text.RegularExpressions; 1