用ASP实现对数据的加密
学校买了北森的职业规划测评系统,我作为“程序员”来做程序接口。官方提供了asp,asp.net,php,jsp的接口,但asp程序却需要安装组件(其他的都不需要),让人感到很郁闷,于是打算用asp实现组件的功能。
费了一下午 + 一晚上才写了以下代码( 但实际上存在BUG,出错原因会在文后说明 )
<!--#include file ="md5.asp" -->
<%
Function hmac(data,key)
dim ipad,opad,k_ipad,k_opad,i
for i = 1 to ( 64 - len(key) )
key = key & chr(&H00)
next
'Response.Write(len(key))
ipad = "6666666666666666666666666666666666666666666666666666666666666666"
opad = "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
k_ipad = strXor(ipad,key ) 'key Xor ipad
k_opad = strXor(opad,key ) 'key Xor opad
hmac =md5( k_opad & pack( md5( k_ipad & data ) ) )
End Function
Function strXor(strdata,strkey)
Dim strChar, iKeyChar, iStringChar, i,iCryptChar
for i = 1 to Len(strdata)
iKeyChar = Asc(mid(strkey,i,1))
iStringChar = Asc(mid(strdata,i,1))
iCryptChar = iKeyChar Xor iStringChar
strXor = strXor & Chr(iCryptChar)
next
End Function
'没用用的函数 只是性质相近 学习而用 by y9902
Function ShowHex(data)
dim i
dim ch
l=lenB(data)
for i = 1 to l
ch=midB(data,i,1)
h=trim(hex(ascB(ch)))
if len(h)=1 then
h="0"+h
end if
ShowHex = ShowHex + h+" "
next
end Function 

Function strtoHex(achar)
if Asc(achar) < 58 then
strtoHex = Asc(achar) - 48
else
strtoHex = Asc(achar) - 87
end if
End Function
Function pack(amd5)
dim i,n
dim abyte,hsum,lsum
n = len(amd5)/2
for i = 0 to n - 1
hsum = strtoHex(mid(amd5,2*i + 1,1)) * 16 + strtoHex(mid(amd5,2*i + 2,1))
if hsum > 127 and i < n - 1 then
i = i + 1
'Response.write(mid(amd5,2*i + 1,1) & mid(amd5,2*i + 2,1) )
lsum = strtoHex(mid(amd5,2*i + 1,1)) * 16 + strtoHex(mid(amd5,2*i + 2,1))
pack = pack & chr(hsum * 256 + lsum )
else
'Response.write(mid(amd5,2*i + 1,1) & mid(amd5,2*i + 2,1) )
pack = pack & chrw(hsum)
end if
next
End Function


Response.Write(md5(hmac("testdata","029a1228ea025cf897fe305715f3b794")))
%>BUG出错原因:
有的字符是双字节的,比如“陈”的16进制代码是0xB3 0xC2 。当第一个字节的数值大于 127 时,则表明此字符是双字节的;如果第一个字节小于 127 ,则说明此字符串为单字节字符,其后的字节仍然遵循此规律。
而字符串加密的过程中,需要把字符以16进制的格式压入新的字符串,这样就可能会发生最后的一个字节大于127,但其后无字节进行匹配的情况,比如chr(&HC4)是不能输出任何字符的。而其他语言提供直接操作的函数(比如php的函数是pack)。
浙公网安备 33010602011771号