王朝网络
分享
 
 
 

MD5算法在PB中的实现

王朝other·作者佚名  2006-06-27
宽屏版  字体: |||超大  

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

写作日期:2004-06-02

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有