ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DES 암호화/복호화
    C++ Builder/기타자료 2019. 1. 14. 10:50
    [767] 문자열을 암호화 하자! (DES 암호화/복호화)
    이점한 [redyouth] 21699 읽음    2008-04-24 17:02
    McbDES.zip 45.7KB 압축파일중 McbDES2.hpp 만 있음 됩니다. ^^;
    요즘 옥션이니 하나로텔레콤이니 개인정보 유출로 말이 많죠 ? 그래서 그런지 저의 돈줄이신 국내굴지(?)의 
    K모 회사에서 엄청나게 보안성을 강조하며 귀찮게 하더라구요. 평소 희박한 보안 의식에 젖어 코딩 했었는데 
    본의 아니게 암/복호화 소스를 뒤져 보던 중 쓸만한 소스를 찾은것 같아 또 허접한 팁으로 올려봅니다. 

    암복호화가 공부 하면 꽤 깊이 있는 분야라는건 다들 아실테고.. 그렇다고 시간 내서 공부는 하기 싫고 당장 
    코딩에는 적용하고 싶다하실때는(앗 찔림.. 저의 이야기) 이 팁을 활용해 보아요 ^^; 

    보통 패스워드 같은 경우는 해시암호화(sha1 또는 sha256)을 사용합니다. 이같은 경우는 단방향 암호화로 복호화는 
    불가능한 암호화 방식이죠. 그래서 관리자도 암호화된 패스워드는 알수가 없답니다. 그런데 이번 옥션건 처럼 
    말 많은 주민번호나 이메일, 전화번호등과 같이 개인정보는 필요에따라 복호화 해서 보여줘야 할데가 있죠 이럴때 
    DES니 AES니 뭐 초급단계인 Base64 같은 암호화를 씁니다. Base64야 널리 알려진 방식이고 암호화라기 보다 
    HTTP통신을 위한 꼼수 정도로 사용되고 키가 없기때문에 금방 풀려 버리죠. 그래서 암호화 키를 알지 못하면 풀기 
    힘든 DES니 AES가 나왔습니다. 여기에 포함 된 소스에 쓰이는 키는 unsigned char 8자리로 총 64bit 키를 갖는 
    암호화 방식입니다. 소스에 있는 키는 원하시는 키로 바꾸셔서 사용 하시는게 좋겠죠. 물론 8자리... 

    출처는 코드구루입니다. 
    http://www.codeguru.com/cpp/misc/misc/cryptoapi/article.php/c8195/#more 
    Triple DES 암/복화화 소스 이고 ECB랑 CBC 모드만을 지원한다고 합니다. 


    첨부되어 있는 압축 파일중 McbDES2.hpp를 프로젝트 폴더에 넣어 두고 include만 하면 끝나죠. 

    참고 하시라고 빌더에서 쓰기 쉽게 제가 AnsiString으로 사용 할 수 있게 함수로 만들어 봤습니다. 
    밑의 함수 예제 소스 참조 하세요. ^^; 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    //---------------------------------------------------------------------------
    #include "McbDES2.hpp"
    #include <stdio.h>
     
    #include <vcl.h>
    #pragma hdrstop
     
    //---------------------------------------------------------------------------
    #pragma argsused
     
    // 암호화에 쓰일 키값 정의
    unsigned char * lpKey1 = (unsigned char*)"72201513";
    unsigned char * lpKey2 = (unsigned char*)"94528010";
     
    //---------------------------------------------------------------------------
    // 암호화(DES) 하는 함수
    AnsiString EncodeDES( AnsiString Value )
    {
        AnsiString _result;
     
        McbDES desEncrypt;
     
        desEncrypt.McbSetKey1(lpKey1);
        desEncrypt.McbSetKey2(lpKey2);
     
        if ( desEncrypt.McbEncrypt( Value.c_str() ) )
        {
            int bSiz =  desEncrypt.McbGetPlainTextSize();
            _result.SetLength( bSiz );
            memcpy( _result.c_str(), desEncrypt.McbGetPlainText(), bSiz );
        }
     
        return _result;  // 암호화가 실패하면 공백("") 리턴
    }
     
    //---------------------------------------------------------------------------
    // 복호화(DES) 하는 함수
    AnsiString DecodeDES( AnsiString Value )
    {
        AnsiString _result;
     
        McbDES desDecrypt;
     
        desDecrypt.McbSetKey1(lpKey1);
        desDecrypt.McbSetKey2(lpKey2);
     
        if ( desDecrypt.McbDecrypt( Value.c_str(), Value.Length() ) )
        {
            int bSiz =  desDecrypt.McbGetPlainTextSize();
            _result.SetLength( bSiz );
            memcpy( _result.c_str(), desDecrypt.McbGetPlainText(), bSiz );
        }
     
        return _result;  // 복호화가 실패하면 공백("") 리턴
    }
    </vcl.h></stdio.h>


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //---------------------------------------------------------------------------
    // 이건 위의 함수를 사용 하는 예제입니다.
    int main(int argc, char* argv[])
    {
       AnsiString strEncode = EncodeDES( "Hello World!" );
     
       if ( strEncode.Length() > 0 )
       {
          printf("암호화 된 문자 (%d) bytes: %s \n", strEncode.Length(), strEncode.c_str() );
     
          AnsiString strDecode = DecodeDES( strEncode );
          printf("복호화 된 문자 (%d) bytes: %s \n", strDecode.Length(), strDecode.c_str());
       }
     
        return 0;
    }
    //---------------------------------------------------------------------------


    1
    2
    3
    4
    5
    <실행 결과>
    D:\Test>Test.exe
    암호화 된 문자 (24) bytes: ?pq槨軋?}配 r?뾘&??
    복호화 된 문자 (12) bytes: Hello World!
    D:\Test>


    위 소스 보시면 아시겠지만 lpKey1, lpKey2의 암호화 키를 바꿔버리면 그 누구도 알 수 없는 자신만의 
    암호키로 암호화 하게 되니 쉽게 타인은 쉽게 해독하기 힘들게 되죠. 
    이제 다시는 옥션 같이 멍청한 일을 당하지 맙시당 ㅡ.ㅡ; 어떻게 그 큰 회사가 개인정보를 암호화 하지 
    않다니 ... 
    물론 요즘 좋은 DBMS들이 암호화 지원 하지만 저는 소켓통신 사용 할때도 이 암호화를 사용하니 
    보안관리자 잔소리 듣지 않아서 행복 하더군요.. ㅡ.ㅡ; 

    조그만 도움이라도 되었으면 좋겠네요 ^^; 

    //---------------------- 
    ※ PS : 혹시 이정도 암호화로 부족하신분은 DES보다 훨~신 강력한 AES 암호화를 구현 해보시기를 .. 

    ㅁ AES(Advanced Encryption Standard)의 개발 배경 
        - DES의 경우 5년마다 안정성 평가를 받아왔다고 하더군요. 그런데 컴퓨터의 속도와 기법들의 발전으로 이제는 그 암호가 뚫리는데 불과 몇시간 안걸리게 되었다고 하네요. 그래서 그걸 대신하게 된 알고리즘이 AES입니다. 

    AES 관련 참고 사이트 
    http://blog.naver.com/shieldguy?Redirect=Log&logNo=80016753301 
    http://hostap.epitest.fi/wpa_supplicant/devel/aes_8c.html 
    http://blog.naver.com/tkdgjs99?Redirect=Log&logNo=110030390419



    출처: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=767 

     

    728x90

    댓글

Designed by Tistory.