OASK问答系统整合UCenter所用的ASP版_authcode加密解密函数uc_authcode

OASK问答系统整合UCenter所用的ASP版_authcode加密解密函数uc_authcode
转载请注明出处 www.oask.com.cn

UCenter 的中文意思就是“用户中心”,其中的 U 代表 User 也代表 You ,取其中的含义就是“用户中心”,或者说“你(最终用户)的中心”。UCenter 是 Comsenz 旗下各个产品之间信息直接传递的一个桥梁,通过 UCenter 站长可以无缝整合 Comsenz 系列产品,实现用户的一站式登录以及社区其他数据的交互。UCenter 的出现极大地方便了各个不同网站程序之间的整合,所以,很多程序都已经开发了与其所对应的接口。

天津聚问网络(www.oask.com.cn)为了方便使用OASK问答系统的客户整合Discuz等程序,特此开发整合了UCenter接口(代码完全采用纯ASP),实现与所有支持 UCenter 的建站产品进行整合(包括最新版discuz!,UCenter Home ,SupeSite,帝国CMS,PHPcms,HDwiki,爱聚合,Feedig,PBdigg,Modoer,ECMall,SupeV,ECShop,ebcms等)通过UCenter进行整合。

目前有很多其他用ASP开发的网站程序也需要整合到UCenter中,但是由于 UCenter 是使用PHP开发的,很难移植到ASP下。据反映,其中最困难的就是接口所使用的加密解密函数 _authcode 。天津聚问网络为了帮助其他开发商或个人也能早日实现与UCenter的整合,现公开我们的 asp 版的 _authcode 函数 uc_authcode ,希望给需要的人带来便捷。

任何人可以免费在自己的产品里使用我们的代码,不过,为了尊重我们的付出,请保留代码中的说明,谢谢!
我们不接受有关UCenter整合的开发咨询,请见谅!您在整合开发过程中的问题请自行解决。

uc_authcode源代码下载

 

<!--#include file="php_MD5.asp"-->
<!--#include file="php_base64.asp"-->

<%
'OASK问答系统整合UCenter所用的ASP版_authcode加密解密函数uc_authcode
'软件主页: http://www.oask.com.cn
'源代码下载地址: http://www.oask.com.cn/uc_authcode.htm

'==================================================================================
'模块用途:OASK问答系统整合UCenter所用的ASP版_authcode加密解密函数uc_authcode
'其他应用:可用于所有要与UCenter进行整合的ASP程序中(本模块仅实现加密解密函数部分)
'软件名称:oASK问答系统(仿百度知道程序)
'官方站点:http://www.oask.com.cn
'版权所有:天津聚问网络
'郑重声明:
' ①、任何人可以免费在自己的产品里使用我们的代码
' ②、请保留上述信息,不影响软件运行速度
'==================================================================================

'函数测试,如果要测试加密解密,请取消下边这几行代码的注释
'==================================================================================
'Const Key="123456789"
'Dim Str1, Str2, Str3
'Str1="http:/www.xxx.com/xxxxxxxxxxxxx"
'Str2=uc_authcode(Str1,"",Key)
'Str3=uc_authcode(Str2,"DECODE",Key)
'response.write "加密前:" &Str1& "<br>加密后:" & Str2 & "<br>解密后:" & Str3

'函数说明:
'======================================================
'str 要加密或解密的字符串
'operation 操作:等于DECODE时是解密操作,否则是加密操作
'key 加密密匙,UC与应用程序所设置的相同的加密密匙字符串
function uc_authcode(ByVal str, ByVal operation, ByVal key)
uc_authcode = ""
if Len(str)<4 then Exit Function

Const ckey_length = 4
Dim keya, keyb, keyc, md5MT, cryptkey, key_length, string_length, box, rndkey, i, j, tmp, iTmp, tmpResult, a, x1, x2

key = Php_MD5(key)
keya = Php_MD5(Left(key, 16))
keyb = Php_MD5(Right(key, 16))
md5MT = Php_MD5(microtime())
if ckey_length > 0 then
if operation="DECODE" then
keyc = Left(str, ckey_length)
else
keyc = Right(md5MT, ckey_length)
end if
else
keyc = ""
end if

cryptkey = keya & Php_MD5(keya & keyc)
key_length = Len(cryptkey)

Redim box(255)
for i = 0 to 255
box(i) = i
next

Redim rndkey(255)
for i = 0 to 255
rndkey(i) = Asc(Mid(cryptkey, i Mod key_length + 1, 1))
next

j = 0
for i = 0 to 255
j = (j + box(i) + rndkey(i)) Mod 256
tmp = box(i)
box(i) = box(j)
box(j) = tmp
next

if operation="DECODE" then
tmp = Right(str, Len(str)-ckey_length)
tmpResult = php_Base64Decode(tmp)
string_length = UBound(tmpResult)+1

a = 0
j = 0
for i = 0 to string_length-1
a = (a + 1) Mod 256
j = (j + box(a)) Mod 256
tmp = box(a)
box(a) = box(j)
box(j) = tmp

x1 = tmpResult(i)
iTmp = (box(a) + box(j)) Mod 256
x2 = box(iTmp)
tmpResult(i) = x1 Xor x2
next

tmp = ""
for i=0 to 9
tmp = tmp & ChrB(tmpResult(i))
next
If IsNumeric(tmp) then iTmp = CLng(tmp) else iTmp = 0

x1 = ""
for i=10 to 25
x1 = x1 & Chr(tmpResult(i))
next

tmp = ""
for i=26 to UBound(tmpResult)
tmp = tmp & ChrB(tmpResult(i))
next
tmp = strAnsi2Unicode(tmp)
x2 = Left(Php_MD5(tmp & keyb), 16)

if (iTmp = 0 Or iTmp > php_time()) And (x1=x2) then
uc_authcode = tmp
else
uc_authcode = ""
end if

else
str = "0000000000" & Left(Php_MD5(str + keyb), 16) & str
str = strUnicode2Ansi(str)
string_length = LenB(str)
Redim tmpResult(string_length-1)

a = 0
j = 0
for i = 0 to string_length-1
a = (a + 1) Mod 256
j = (j + box(a)) Mod 256
tmp = box(a)
box(a) = box(j)
box(j) = tmp

x1 = AscB(MidB(str, i+1, 1))
iTmp = (box(a) + box(j)) Mod 256
x2 = box(iTmp)
tmpResult(i) = x1 Xor x2
next

uc_authcode = keyc & Replace(php_Base64Encode(tmpResult),"=","")
end if
end function

Const TimeZone=8 '服务器所在时区

function php_time()
php_time = dateadd("h", TimeZone*-1, now())
php_time = datediff("s", "1970-01-01 00:00:00", php_time)
end function

function microtime()
Dim sec, msec, i, s
sec = php_time()
msec = timer()*1000 Mod 1000
i = Max(0, 8-Len(Cstr(msec)))
s = String(i,"0")
microtime = "0." & msec & s & " " & sec
end function

Private Function Min(x,y)
if x<y then Min=x else Min=y
End Function

Private Function Max(x,y)
if x>y then Max=x else Max=y
End Function
%>