MD5算法在PB中的实现

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值