VBScript: URLEncode, URLDecode 함수

ASP에 URL을 인코딩하려면 Server 객체의 URLEncode 메쏘드를 사용하면 된다. 그럼 디코딩은 어떻게 하지? ASP환경이 아닌 환경- 예를 들면 도스창에서 VBScript로 스크립트를 짤 때 – 에서는 Server 객체가 제공이 안되는데 이곳에서는 인코딩이나 디코딩을 어떻게 해야 하는가?

여기에 대한 대안으로 사용할 수 있는 함수인 URLEncode, URLDecode를 소개한다.

Function URLEncode(sStr)  
    Dim i, acode

    URLEncode = sStr

    For i = Len(URLEncode) To 1 Step -1  
        acode = Asc(Mid(URLEncode, i, 1))  
        If (aCode >=48 And aCode <=57) Or (aCode >= 65 And aCode <=90) Or (aCode >= 97 And aCode <=122) Then  
        ' don't touch alphanumeric chars  
        Else  
            Select Case acode  
            Case 32  
                ' replace space with "+"  
                URLEncode = Left(URLEncode, i - 1) & "+" & Mid(URLEncode, i + 1)  
            Case Else  
                ' replace punctuation chars with "%hex"  
                URLEncode = Left(URLEncode, i - 1) & "%" & Hex(acode) & Mid(URLEncode, i + 1)  
            End Select  
        End If  
    Next  
End Function

Function URLDecode(sStr)  
    Dim sTemp, sChar, nLen  
    Dim nPos, sResult, sHex

    On Error Resume Next

    nLen = Len(sStr)

    sTemp = Replace(sStr, "+", " ")  
    For nPos = 1 To nLen  
        sChar = Mid(sTemp, nPos, 1)  
        If sChar = "%" Then  
            If nPos + 2 <= nLen Then  
                sHex = Mid(sTemp, nPos+1, 2)  
                If IsHexaString(sHex) Then  
                    sResult = sResult & Chr(CLng("&H" & sHex))  
                    nPos = nPos + 2  
                Else  
                    sResult = sResult & sChar  
                End If  
            Else  
                sResult = sResult & sChar  
            End If  
            Else  
            sResult = sResult & sChar  
        End If  
    Next

    If Err Then  
        LogError "URLDecode(" & sStr & "). " & Err.description  
    End If

    On Error GoTo 0

    URLDecode = sResult  
End Function

''  
' 문자열이 모두 16진수 문자열로 구성되어 있는지 점검  
' @param sStr 검사할 문자열  
' @return 모두 HEX String으로 이루어져 있으면 true, 아니면 false  
Function IsHexaString( sStr )  
    Dim nPos  
    Dim sChar  
    Dim bReturn

    bReturn = True  
    If sStr <> "" Then  
        For nPos = 1 To Len(sStr)  
            sChar = Mid( sStr, nPos, 1 )  
            If ( sChar < "a" OR sChar > "f" ) And ( sChar < "A" OR sChar > "F") And ( sChar < "0" OR sChar > "9") Then  
                bReturn = False  
            End If  
        Next  
    Else  
        bReturn = False  
    End If

    IsHexaString = bReturn  
End Function

SEED 암호화 컴포넌트 ECPlaza.Seed 소스 공개

한국정보진흥원(KISA)의 SEED 암호알고리즘을 ASP에서 사용하기 위해서 만든 ECPlaza.Seed 컴포넌트의 소스를 공개합니다. 이 컴포넌트는 ANSI X.923 패딩을 사용했고, BASE64 인코딩 절차를 한번 더 거쳤습니다.

사용법은 간단합니다.

ECPlazaSeed.dll을 다운로드 받은 다음 적당한 폴더에 복사한뒤 관리자 권한으로 도스창을 실행시켜서

regsvr32 ECPlazaSeed.dll

64bit OS에서는

c:\windows\syswow64\regsvr32 ECPlazaSeed.dll

을 하면 컴포넌트 등록이 끝납니다.

등록 확인은 테스트 스크립트를 다운 받아서

cscript test.vbs

64bit OS에서는

c:\windows\syswow64\cscript test.vbs

를 도스창에서 실행해서 오류가 발생하지 않으면 제대로 등록이 된 겁니다.

이 컴포넌트는 두개의 메쏘드를 제공합니다.

  • Encrypt(sPlainText, sKey)

    sPlainText 평서문을 sKey를 가지고 SEED 암호화 및 Base64 인코딩한 결과를 반환합니다. sKey는 반드시 16자리여야만 합니다.

  • Decrypt(sCipherText, sKey)

    sCipherText 암호문을 Base64 디코딩을 하고, SEED 복호화를 거쳐서 원 평서문을 반환합니다.

사용 예제

Dim oSeed
Dim encdata, decdata
Set oSeed = Server.CreateObject("ECPlaza.Seed")
encdata = oSeed.Encrypt(data, userkey)
decdata = oSeed.Decrypt(encdata, userkey)

소스를 컴파일 하기 위해서는 Visual C++ 6가 필요합니다. Visual Stuio .Net에서는 컴파일 해보지 않았습니다. 아마 컴파일이 안 될것 같습니다.

소스 다운로드

DLL 다운로드

테스트 스크립트 test.vbs

참고:

한국정보진흥원 SEED 알고리즘

SEED 알고리즘 – Java API
Seed알고리즘을 이용한 암호화 복호화 기능 수행하는 DLL 만들기

ASP: MSXML2.ServerXMLHTTP 사용하여 원격 웹서버 내용 갖고 오기

HTTP를 구현해 놓은 여러 컴포넌트들이 있지만 윈도우2000부터 기본으로 설치되는 MSXML2.ServerXMLHTTP 컴포넌트를 이용하여 원격 웹서버의 내용을 갖고 올수 있다.

가장 기본적인 방법은 다음과 같다.

<%  
sUrl = "http://www.ecplaza.net/"  
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")  
oHttp.Open "GET", sUrl, False  
oHttp.Send ""  
Response.Write oHttp.ResponseText  
Set oHttp = Nothing  
%>  

GET 방법으로 갖고 온 HTML을 화면에 출력하는 루틴이다. POST 방법으로도 요청할 수 있다.

<%  
sUrl = "http://river.ecplaza.net/form.asp"  
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")  
oHttp.Open "POST", sUrl, False  
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"  
oHttp.Send "subject=test&contents=message+body"  
Response.Write oHttp.ResponseText  
Set oHttp = Nothing  
%>  

오류 처리는 Send 메쏘드를 호출하기 전에  On Error Resume Next를 적어주고 오류발생 여부를 체크하면 된다.

<%  
sUrl = "http://river.ecplaza.net/form.asp"  
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")  
oHttp.Open "POST", sUrl, False  
oHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

On Error Resume Next

oHttp.Send "subject=test&contents=message+body"  
If Err Then  
Response.Write "Error:" & oHttp.ParseError.URL & "<br>" & _  
oHttp.ParseError.Reason  
Else  
Response.Write oHttp.ResponseText  
End If  
Set oHttp = Nothing  
%>