C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[767] 문자열을 암호화 하자! (DES 암호화/복호화)
이점한 [redyouth] 27275 읽음    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으로 사용 할 수 있게 함수로 만들어 봤습니다.
밑의 함수 예제 소스 참조 하세요. ^^;

 
//---------------------------------------------------------------------------
#include "McbDES2.hpp"
#include 

#include 
#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;  // 복호화가 실패하면 공백("") 리턴
}


 
//---------------------------------------------------------------------------
// 이건 위의 함수를 사용 하는 예제입니다.
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;
}
//---------------------------------------------------------------------------


<실행 결과>
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
xiles [xiles]   2008-04-25 12:22 X
좋은 정보 감사합니다!!
허정주 [tinydew4]   2008-05-14 13:15 X
키를 문자열로 넣어버리면... exe 파일 까면 나오지 않나요? ㄷㄷ
아제나 [azena]   2008-05-15 13:23 X
허정주님 말씀대로 키를 보호하는 다른 정책이 필요합니다 ㄷㄷ
게다가 키가 저렇게 짧으면 키 제네레이터를 돌려서 금방 풀려버리죠 ㄷㄷ
그래서 2-3가지의 암호화 방법을 동시에 적용하는 것이 좋은 것 같습니다.

+ -

관련 글 리스트
767 문자열을 암호화 하자! (DES 암호화/복호화) 이점한 27275 2008/04/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.