用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"+
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*+ 1,1)) * 16 + strtoHex(mid(amd5,2*+ 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*+ 1,1)) * 16 + strtoHex(mid(amd5,2*+ 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)。
posted @ 2005-12-02 21:03  y9902  阅读(597)  评论(0)    收藏  举报