⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nvo_md5.sru

📁 在powerbuilder 7.0中实现md5的算法
💻 SRU
📖 第 1 页 / 共 3 页
字号:
$PBExportHeader$nvo_md5.sru
$PBExportComments$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_getunicode (string as_char)
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 long of_lshift (readonly long al_oldvalue, readonly long al_shiftbits)
private function long of_m2power (readonly long al_oldvalue)
private function long of_monbits (readonly long al_oldvalue)
private function long of_rotateleft (readonly long al_oldvalue, readonly long al_shiftbits)
private function long of_rshift (readonly long al_oldvalue, readonly long al_shiftbits)
private function string of_wordtohex (readonly long al_value)
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加密时的运算之一
*******************************************************************/
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)
功能描述:将字符装入数组并进行位填充
*******************************************************************/
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加密
*******************************************************************/
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -