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 만들기

[PHP] Proxy 서버를 이용해서 원격 웹서버 내용 갖고 오기

이씨플라자는 중문으로 서비스되는 이씨플라자 중문 사이트가 따로 있고, 대부분의 사용자는 중국업체들이다. 서버는 현재 국내 KTNET IDC에 있다. 요즘 알 수 없는 이유(?)로 중국에서 이씨플라자 중문 사이트에 접속하는데 장애가 많이 발생해서, 이를 탐지하는 프로그램을 만들어야만 했다. 중국사용자 환경에서 접속을 테스트해야 하니깐 중국내 공개된 proxy 서버를 이용하기로 했다.

전에 올린 “MSXML2.ServerXMLHTTP 사용하여 원격 웹서버 내용 갖고 오기” 포스트에서 사용한 MSXML2.ServerXMLHTTP 컴포넌트를 사용하려고 했는데 허걱.. 이 컴포넌트는 Proxy 서버를 지정할 수 있는 방법을 제공하지 않는 것이다. 별 수 없이 막강한 함수를 갖고 있는 php를 좀 뒤져봤다. 역시 여기에는 해결책이 있었다.

Proxy 서버를 이용해서 http 통신을 하는 get_contents 라는 함수를 하나 만들어서 사용했다. 혹시나 Proxy 서버를 사용할 필요가 있으신 분들은 참고하시기를.

function get_contents($url, $proxy = "") {
    //이 부분은 반드시 필요하지는 않지만,
    //User-Agent를 체크하는 사이트가 있다면 필요함.
    $header = "User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.1;+SV1;)";

    if (empty($proxy)) {
        // proxy를 사용하지 않음
        $opts = array(
            'http' => array(
                'request_fulluri' => true,
                'header' => $header
            ),
        );
    } else {
        // proxy를 사용함
        $opts = array(
            'http' => array(
                'proxy' => 'tcp://'.$proxy,
                'request_fulluri' => true,
                'header' => $header
            ),
        );
    }

    $context = stream_context_create($opts);
    $html = file_get_contents($url, false, $context);
    $html;
}