2014 년정보보호졸업작품보고서 파일유출방지시스템 지도교수님 : 양환석교수님 팀명 : LKC Security 팀원 : 이호영, 김상우, 최유택 2014. 5 중부대학교정보보호학과
목 차 1. 프로젝트설명 1 2. 연구계획 1 2.1 연구목적 1 2.2 연구방법 2 2.3 연구개요 2 2.4 연구구성도 3 3. 연구프로그램구축 5 3.1 주요소스 5 3.2 실행결과 8 4. 연구결과 12 4.1 전체소스 12 5. 결론 29 6. 참고문헌 29 7. Program PPT 30
1. 프로젝트설명 Program 은 API로구현한다. Program 은사용자 Login 시 Log가 Server 에자동저장이되고, 파일암호화, 복호화할수있는프로그램이실행된다. 프로그램은일반사용자와관리자로나뉘는데일반사용자는자신을인증할수있는아이디와비밀번호를만들어암호화복호화를할수있다. 이와반면관리자는프로그램에서암호화또는복호화된문서에대한권한을가질수없고, 관리자는사용자가 Login 하였을때의 IP와시간이저장되는 Log 기록관리와사용자아이디와패스워드를생성하여주고, 암 복호화기록을관리한다. 일반사용자는자신이암호화, 또는복호화할텍스트문서를불러와일을처리하고자신이편집한문서를저장한다. 이때중앙의서버로파일을암호화하였을때, 파일을복호화하였을때사용기록을저장하여혹여중요한파일이유출이되었을때어떤사용자가사용중일때파일이유출되었는지파악하는데시간을줄일수있습니다. 2. 연구계획 2.1 연구목적 최근들어, 정보통신의비약적발달로비밀수준의정보들이컴퓨터에저장되어네트워크혹은저장매체를통하여불법적으로정보를탈취, 변조또는소유자의실수에의하여비밀정보가누출되는등의보안문제가심각해지고있다. 따라서컴퓨터보안을위하여운영체제상에서의보안을강화할시제작비용과, 새로운파일암호시스템을개발해야하는복잡한단계를거쳐야한다. 이러한점을착안하여보안성이강화된암호화운영체재를개발하지않고도컴퓨터시스템에서사용자가비밀정보를사용할때프로그램을사용하여쉽게암 복호화하여비밀정보가누출이되더라도유출된정보를해독하는데많은시간과어려움을갖게하여정보를보호하는데의의를두었습니다. 또한관리자를두어일반사용자가 Log 기록에쉽게접근할수없도록하고, 일반사용자의아이디와패스워드를생성, 관리한다. - 1 -
2.2 연구방법 암호기법을사용하여사용자가자신이작성한파일이유출되더라도복호화를하기어렵게 한다. 그리고사용자의정보와파일의암 & 복호화된정보를서버에기록함으로써유출에대한 추적및관리를강화한다. API : 프로그램또는애플리케이션이운영체제에어떤처리를위해서호출할수있는서브루틴또는함수의집합이다. 윈도우 API의경우 C, C++, 파스칼등과같은언어에서윈도우를만들고, 파일을여는것과같은처리를할수있도록 1,000여개이상의함수로구성되어있다. 명령어의집합으로애플리케이션프로그램에서오퍼레이팅시스템의기본적인기능을사용할필요가있을때에여기에서명령어를호출한다. 이명령어는 MS-DOS 에서말하면시스템콜에해당한다. 이 API를확실히정하고범용성을갖게하면주변기기의인터페이스를용이하게사용할수있으며, 애플리케이션프로그램의개발이나호환성의면에서개선된다. MYSQL : 표준데이터베이스질의언어인 SQL(Structured Query Language) 을사용하는개방소스의관계형데이터베이스관리시스템 (RDBMS). 매우빠르고, 유연하며, 사용하기쉬운특징이있다. 다중사용자, 다중쓰레드를지원하고, C, C++, Eiffel, 자바, 펄, PHP, Python 스크립트등을위한응용프로그램인터페이스 (API) 를제공한다. 유닉스나리눅스, 윈도운영체제등에서사용할수있다. 상호연동이잘되면서도오픈소스로개발되는무료프로그램이어서홈페이지나쇼핑몰등일반적인웹개발에널리이용되고있다. 2.3 연구개요 이번프로젝트의목적은 Application Program Interface(API) 의동작원리를이해하고, API를구현하는것이다. 사용자와 Log 기록을저장하는 Server 를 MYSQL 을사용하여 API와 MYSQL 사이에연동하는관계를배우고익히는데목적을두었다. 또한 Complier 는 Microsoft VIsual Studio 2010 프로그램을사용하였다. 프로그램은일반사용자와관리자 Mod로나뉘어실행되고, 사용자가프로그램에로그인또는프로그램실행시 Server 에저장하기로한다. - 2 -
2.4 연구구성도 전체 Program 구성 - 3 -
File 암호화 Program 설계 File 복호화 Program 설계 - 4 -
3. 연구프로그램구축 3.1 주요소스 로그인부분 // 로그인함수 BOOL CALLBACK login(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { int i=0,num; char qstr[500]=""; switch(imessage) { case WM_COMMAND: switch(wparam) { case IDOK: strcmp(row[1],row_pw))==0) { query_stat = mysql_query(conn, "select *from login"); RES = mysql_store_result(conn); num = mysql_num_fields(res); GetDlgItemText(hDlg,IDC_ID,row_id,sizeof(row_id)); GetDlgItemText(hDlg,IDC_PW,row_pw,sizeof(row_pw)); while(row = mysql_fetch_row(res)) { if(i==0) { if((strcmp(row[0],row_id) MessageBox(hDlg," 로그인성공 "," 로그인성공 ",MB_OK); i=1; MessageBox(hDlg," 로그인실패 "," 로그인실패 ",MB_OK); return 2; EndDialog(hDlg,IDOK); case IDCANCEL: EndDialog(hDlg,IDCANCEL); exit(1); - 5 -
암호화부분 // 암호화버튼 case ID_BUT1: bsave = TRUE; if(bstart == TRUE) { // 그래도 NULL 문자이면 for(i=0;i<lstrlen(encry);i++) { if(encry[i] + EnterKey + i == NULL) Encry[i] = Encry[i] - EnterKey; else Encry[i] = Encry[i] + EnterKey + i; if(encry[i] == NULL) Encry[i] += count; //count( 사용자정의 ) 로더해버림 (250 미만의수 ) //for 문. SetWindowText(c4,Encry); MessageBox(hWnd," 정상적으로암호화되었습니다. Save 할파일명을입력하세요."," 알림 ",MB_OK); if(bsave == TRUE) { DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,File_Name); hfile1=createfile(savefile,generic_write,0,null,create_always,file_attribute_ NORMAL,NULL); WriteFile(hFile1,Encry,lstrlen(Encry),&dwWrite,NULL); CloseHandle(hFile1); strcpy(enc,"insert into enc values ('"); strcat(enc,ip); strcat(enc,"','"); strcat(enc,time); strcat(enc,"','"); strcat(enc,savefile); strcat(enc,"')"); mysql_query(conn,enc); else MessageBox(hWnd," 암호문이없습니다."," 오류 ",MB_OK); else MessageBox(hWnd," 암호화할파일을열어주세요."," 오류 ",MB_OK); bstart = FALSE; - 6 -
복호화부분 // 복호화버튼 // 암호화텍스트얻어옴 // 복호화작업시작 case ID_BUT2: GetWindowText(c4,Arr,30000); for(i=lstrlen(encry) -1;i>-1;i--) { if((2*(enterkey)) + i + Encry[i] == NULL) Arr[i] += EnterKey; else Arr[i] = Encry[i]-i-EnterKey; // 문자열출력 if(encry[i]-count==null && Arr[i] -i -(2*EnterKey) == NULL) { Arr[i] -= count; //Encry 에서 count 을빼면 NULL 이되는문자를 SetWindowText(c3,Arr); MessageBox(hWnd," 정상적으로복호화되었습니다. Save 할파일명 을입력하세요."," 알림 ",MB_OK); if(bsave == TRUE) { DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,File_Name); hfile2=createfile(savefile,generic_write,0,null,create_always,file_attribute_ NORMAL,NULL); WriteFile(hFile2,Arr,lstrlen(Arr),&dwWrite,NULL); CloseHandle(hFile2); strcpy(enc,"insert into ddec values ('"); strcat(enc,ip); strcat(enc,"','"); strcat(enc,time); strcat(enc,"','"); strcat(enc,savefile); strcat(enc,"')"); mysql_query(conn,enc); else MessageBox(hWnd," 복호화할파일을열어주세요."," 오류 ",MB_OK); bstart = FALSE; - 7 -
3.2 실행결과 로그인화면 - 사용자는자신의 ID 와패스워드로접속이가능하다. 암 & 복호화화면 - 사용자는파일을선택하여암 & 복호화를진행할수있다. - 8 -
관리자화면 - 관리자는사용자관리및로그기록을볼수있다. 사용자추가화면 - 관리자가일반사용자를추가할수있다. - 9 -
사용자삭제화면 - 사용하지않는사용자를삭제할수있다. 로그인기록화면 - 모든사용자의로그인한 IP 와시간, ID 를확인이가능하다. - 10 -
복호화로그화면 - 복호화를한사용자의 IP 와시간, 저장한파일이름을확인이가능하다. 암호화로그화면 - 암호화를한사용자의 IP 와시간, 저장한파일이름을확인이가능하다. - 11 -
4. 연구결과 4.1 전체소스 Password code.cpp #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #include <windows.h> #include <mysql.h> #include "resource.h" #include <time.h> #define MYSQL_HOST "10.26.0.48" #define MYSQL_ID "root" #define MYSQL_PW "12345" #define MYSQL_DB "lkc" LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE g_hinst; HWND hwndmain; HWND c1,c2,c3,c4,c5,c6,c7,c12; LPCTSTR lpszclass=text("lkc"); HBRUSH hbrushedit; HFONT hfontedit,hfonteditt; enum {ID_BUT1 = 20, ID_BUT2,ID_BUT3; // 암 & 복호화 static int EnterKey=1; static int count=1; TCHAR str[300]=" 암호화, 복호화할파일을열어주세요."; TCHAR Encry[30000]; // 암호화텍스트 TCHAR Arr[30000]=""; // 복호화텍스트 TCHAR SaveFile[200]=""; // 저장파일이름 BOOL bstart = FALSE; BOOL bsave = FALSE; // 서버 MYSQL mysql,*conn; MYSQL_RES* RES; - 12 -
MYSQL_ROW ROW; int query_stat; char row_id[40]={null; char row_pw[40]={null; char *ip=""; // 윈도우프로그램의시작점 ( 윈도우메인 ) int APIENTRY WinMain(HINSTANCE hinstance,hinstance hprevinstance,lpstr lpszcmdparam, int ncmdshow) { HWND hwnd; MSG Message; WNDCLASS WndClass; g_hinst=hinstance; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=CreateSolidBrush(RGB(121,170,255)); WndClass.hCursor=LoadCursor(hInstance,IDC_ARROW); WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName=lpszClass; WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1); WndClass.style=CS_HREDRAW CS_VREDRAW; RegisterClass(&WndClass); // 등록된윈도우클래스로윈도우를생성한다. h W n d = C r e a t e W i n d o w ( l p s z C l a s s, l p s z C l a s s, W S _ S Y S M E N U WS_MINIMIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,800,550, NULL,(HMENU)NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow); // 메세지루프 while(getmessage(&message,null,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); return (int)message.wparam; // 사용방법부분 BOOL CALLBACK ProgramInfo(HWND hdlg,uint imessage,wparam wparam,lparam lparam) { switch(imessage) { - 13 -
case WM_INITDIALOG: case WM_COMMAND: switch(loword(wparam)) { case IDOK: EndDialog(hDlg,IDOK); case IDCANCEL: EndDialog(hDlg,IDCANCEL); // 만든이부분 BOOL CALLBACK Maker(HWND hdlg,uint imessage,wparam wparam,lparam lparam) { switch(imessage) { case WM_INITDIALOG: case WM_COMMAND: switch(loword(wparam)) { case IDOK: EndDialog(hDlg,IDOK); case IDCANCEL: EndDialog(hDlg,IDCANCEL); //IP 부분 char *GetIPGET() { WSADATA wdata; WSAStartup(MAKEWORD(2,2), &wdata); char hostname[255],ipaddr[50]; struct in_addr addr; PHOSTENT h; - 14 -
memset(hostname,0,sizeof(hostname)); memset(ipaddr,0,sizeof(ipaddr)); h = gethostbyname(hostname); //memcpy(&addr, h->h_addr_list[0], sizeof(struct in_addr)); memcpy(&addr, h -> h_addr, sizeof(struct in_addr)); return inet_ntoa(addr); // 파일이름설정부분 BOOL CALLBACK File_Name(HWND hdlg,uint imessage,wparam wparam,lparam lparam) { switch(imessage) { case WM_INITDIALOG: case WM_COMMAND: switch(wparam) { case IDOK: GetDlgItemText(hDlg,IDC_EDIT1,SaveFile,sizeof(SaveFile)); bsave = FALSE; EndDialog(hDlg,IDOK); case IDCANCEL: EndDialog(hDlg,IDCANCEL); bsave = TRUE; // 로그인함수 BOOL CALLBACK login(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { int i=0,num; char qstr[500]=""; switch(imessage) { case WM_COMMAND: switch(wparam) { case IDOK: query_stat = mysql_query(conn, "select *from login"); RES = mysql_store_result(conn); num = mysql_num_fields(res); GetDlgItemText(hDlg,IDC_ID,row_id,sizeof(row_id)); GetDlgItemText(hDlg,IDC_PW,row_pw,sizeof(row_pw)); - 15 -
while(row = mysql_fetch_row(res)) { if((strcmp(row[0],row_id) strcmp(row[1],row_pw))==0) { MessageBox(hDlg," 로그인성공 "," 로그인성공 ",MB_OK); i=1; if(i==0) { MessageBox(hDlg," 로그인실패 "," 로그인실패 ",MB_OK); return 2; EndDialog(hDlg,IDOK); case IDCANCEL: EndDialog(hDlg,IDCANCEL); exit(1); LRESULT CALLBACK WndProc(HWND hwnd, UINT imessage, WPARAM wparam, LPARAM lparam) { //HDC hdc; //PAINTSTRUCT ps; OPENFILENAME OFN; TCHAR lpstrfile[max_path]=""; TCHAR *staticword1=" 원문텍스트 "; TCHAR *staticword2=" 암호화텍스트 "; HWND hmdlg1 = NULL, hmdlg2 = NULL; DWORD dwread,dwwrite; HANDLE hfile1 = NULL; HANDLE hfile2 = NULL; TCHAR buf[30000] =""; int i=0; char enc[200]="", dec[200]="", log[200]=""; time_t etime; time(&etime); char *time; time=ctime(&etime); static HWND help; - 16 -
switch(imessage) { case WM_CREATE: ip=getipget(); //MessageBox(hWnd,ip," 알림 ",MB_OK); mysql_init(&mysql); conn = mysql_real_connect(&mysql, MYSQL_HOST, MYSQL_ID, MYSQL_PW, MYSQL_DB, 0, 0, 0); hwndmain = hwnd; ShowWindow(c12,SW_SHOW); start : i = DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG3),hWnd,login); if(i==2) goto start; else { strcpy(log,"insert into login_log values ('"); strcat(log,ip); strcat(log,"','"); strcat(log,time); strcat(log,"','"); strcat(log,row_id); strcat(log,"')"); mysql_query(conn,log); if((strcmp(row_id,"root") strcmp(row_pw,"12345"))==0) { ::ShellExecute(::GetDesktopWindow(), "open", "admin.exe", 0, 0, SW_SHOWNORMAL); //exe파일실행 exit(1); // 버튼 c1 = CreateWindow(TEXT("button"),TEXT(" 암호화 (Encryption)"), WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 214,10,150,40,hWnd,(HMENU)ID_BUT1,g_hInst,NULL); c2 = CreateWindow(TEXT("button"),TEXT(" 복호화 (Decryption)"), WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 600,10,150,40,hWnd,(HMENU)ID_BUT2,g_hInst,NULL); // 에디터창 c3 = CreateWindow(TEXT("edit"),str, WS_CHILD ES_MULTILINE WS_VISIBLE WS_VSCROLL WS_HSCROLL WS_BORDER,11,60,370,380,hWnd,(HMENU)0,g_hInst,NULL); c4 = CreateWindow(TEXT("edit"),NULL, WS_CHILD ES_MULTILINE WS_VISIBLE WS_HSCROLL WS_VSCROLL WS_BORDER,400,60,370,380,hWnd,(HMENU)3,g_hInst,NULL); // 텍스트이름 c5 = CreateWindow(TEXT("static"),staticWord1,WS_CHILD WS_BORDER WS_VISIBLE,11,43,76,17,hWnd,(HMENU)-1,g_hInst,NULL); c6 = CreateWindow(TEXT("static"),staticWord2,WS_CHILD WS_BORDER - 17 -
WS_VISIBLE,400,43,88,17,hWnd,(HMENU)-1,g_hInst,NULL); c7 = CreateWindow(TEXT("button"),TEXT(" 화면초기화 "), WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 600,450,150,30,hWnd,(HMENU)ID_BUT3,g_hInst,NULL); hbrushedit = CreateSolidBrush(RGB(0,0,0)); hfontedit = CreateFont(13,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,VARIABLE_PITCH,TEXT(" 평문 ")); hfonteditt = CreateFont(10,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,VARIABLE_PITCH,TEXT(" 궁서 ")); SendMessage(c5,WM_SETFONT,(WPARAM)hFontEdit,MAKELPARAM(FALSE,0)); SendMessage(c6,WM_SETFONT,(WPARAM)hFontEdit,MAKELPARAM(FALSE,0)); SendMessage(c7,WM_SETFONT,(WPARAM)hFontEdit,MAKELPARAM(FALSE,0)); SetFocus(c3); case WM_COMMAND: switch(loword(wparam)) { // 암호화할파일열기 case ID_MENU_1: SetWindowText (GetDlgItem (hwnd, 0),""); // 화면초기화 SetWindowText (GetDlgItem (hwnd, 3),""); // 화면초기화 memset(&ofn,0,sizeof(openfilename)); OFN.lStructSize = sizeof(openfilename); OFN.lpstrTitle = " 암호화할파일열기 "; OFN.hwndOwner = hwnd; OFN.lpstrFilter = TEXT(" 텍스트문서 (*.txt)\0*.txt"); OFN.lpstrFile = lpstrfile; OFN.nMaxFile =MAX_PATH; GetOpenFileName(&OFN); hfile1 = CreateFile(OFN.lpstrFile,GENERIC_READ GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL); if(hfile1!= INVALID_HANDLE_VALUE) { ReadFile(hFile1,buf,sizeof(buf),&dwRead,NULL); CloseHandle(hFile1); SetWindowText(c3,buf); bstart = TRUE; GetWindowText(c3,Encry,30000); case ID_MENU_ProgramInfo: MessageBox(hWnd,"ASCII 코드를이용한치환암호기법을사용한프로그램입니다.\n*** 암호화방법 ***\n1. 원문 TEXT파일을불러옵니다.\n2. 암호화버튼을누릅니다.\n*** 복호화방법 ***\n1. 암호화 TEXT파일을불러옵니다.\n2. 복호화버튼을눌러원문텍 - 18 -
스트로변환시킵니다. "," 사용방법 ",MB_OK); // 복호화할파일열기 case ID_MENU_2: SetWindowText (GetDlgItem (hwnd, 0),""); // 화면초기화 SetWindowText (GetDlgItem (hwnd, 3),""); // 화면초기화 memset(&ofn,0,sizeof(openfilename)); OFN.lStructSize = sizeof(openfilename); OFN.lpstrTitle = " 복호화할파일열기 "; OFN.hwndOwner = hwnd; OFN.lpstrFilter = TEXT(" 텍스트문서 (*.txt)\0*.txt"); OFN.lpstrFile = lpstrfile; OFN.nMaxFile = MAX_PATH; GetOpenFileName(&OFN); h F i l e 2 = C r e a t e F i l e ( O F N. l p s t r F i l e, G E N E R I C _ R E A D GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hfile1!= INVALID_HANDLE_VALUE) { ReadFile(hFile2,buf,sizeof(buf),&dwRead,NULL); CloseHandle(hFile2); SetWindowText(c4,buf); GetWindowText(c4,Encry,30000); bsave = TRUE; // 화면클리어 case ID_BUT3: SetWindowText (GetDlgItem (hwnd, 0),""); SetWindowText (GetDlgItem (hwnd, 3),""); // 창종료 case ID_MENU_EXIT: DestroyWindow(hWnd); // 만든이 case ID_MENU_Maker: if(!iswindow(hmdlg1)) { hmdlg1= CreateDialog(g_hInst,MAKEINTRESOURCE(IDD_DIALOG2),hWnd,Maker); ShowWindow(hMDlg1,SW_SHOW); // 암호화버튼 case ID_BUT1: bsave = TRUE; - 19 -
if(bstart == TRUE) { for(i=0;i<lstrlen(encry);i++) { if(encry[i] + EnterKey + i == NULL) Encry[i] = Encry[i] - EnterKey; else Encry[i] = Encry[i] + EnterKey + i; if(encry[i] == NULL) // 그래도 NULL문자이면 Encry[i] += count; //count( 사용자정의 ) 로더해버림 (250미만의수 ) //for문. SetWindowText(c4,Encry); MessageBox(hWnd," 정상적으로암호화되었습니다. Save 할파일명을입력하세요."," 알림 ",MB_OK); if(bsave == TRUE) { DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,File_Name); hfile1=createfile(savefile,generic_write,0,null,create_always,file_attribute_norma L,NULL); WriteFile(hFile1,Encry,lstrlen(Encry),&dwWrite,NULL); CloseHandle(hFile1); strcpy(enc,"insert into enc values ('"); strcat(enc,ip); strcat(enc,"','"); strcat(enc,time); strcat(enc,"','"); strcat(enc,savefile); strcat(enc,"')"); mysql_query(conn,enc); else MessageBox(hWnd," 암호문이없습니다."," 오류 ",MB_OK); else MessageBox(hWnd," 암호화할파일을열어주세요."," 오류 ",MB_OK); bstart = FALSE; // 복호화버튼 case ID_BUT2: GetWindowText(c4,Arr,30000); // 암호화텍스트얻어옴 for(i=lstrlen(encry) -1;i>-1;i--) { // 복호화작업시작 - 20 -
if((2*(enterkey)) + i + Encry[i] == NULL) Arr[i] += EnterKey; else Arr[i] = Encry[i]-i-EnterKey; // 문자열출력 if(encry[i]-count==null && Arr[i] -i -(2*EnterKey) == NULL) { Arr[i] -= count; //Encry에서 count을빼면 NULL이되는문자를 SetWindowText(c3,Arr); MessageBox(hWnd," 정상적으로복호화되었습니다. Save할파일명을입력하세요."," 알림 ",MB_OK); if(bsave == TRUE) { DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,File_Name); hfile2=createfile(savefile,generic_write,0,null,create_always,file_attribute_norma L,NULL); WriteFile(hFile2,Arr,lstrlen(Arr),&dwWrite,NULL); CloseHandle(hFile2); strcpy(enc,"insert into ddec values ('"); strcat(enc,ip); strcat(enc,"','"); strcat(enc,time); strcat(enc,"','"); strcat(enc,savefile); strcat(enc,"')"); mysql_query(conn,enc); else MessageBox(hWnd," 복호화할파일을열어주세요."," 오류 ",MB_OK); bstart = FALSE; case WM_CTLCOLOREDIT: if((hwnd)lparam==c4) { SetTextColor((HDC)wParam,RGB(215,215,215)); SetBkColor((HDC)wParam,RGB(0,0,0)); return (LRESULT)hBrushEdit; case WM_DESTROY: DeleteObject(hBrushEdit); DeleteObject(hFontEdit); - 21 -
PostQuitMessage(0); mysql_close(conn); return(defwindowproc(hwnd,imessage,wparam,lparam)); admin.cpp #include <windows.h> #include "resource.h" #include <mysql.h> #define MYSQL_HOST "10.26.0.48" #define MYSQL_ID "root" #define MYSQL_PW "12345" #define MYSQL_DB "lkc" LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE g_hinst; HWND c1,c2,c3,c4,c5,c6; HWND hmdlg1 = NULL; LPSTR lpszclass="admin"; enum{id_but1 = 20,ID_BUT2,ID_BUT3,ID_BUT4,ID_BUT5,ID_BUT6; // 서버 MYSQL *conn, mysql; MYSQL_RES* RES; MYSQL_ROW ROW; int query_stat; char row_id[40]={null; char row_pw[40]={null; // 윈도우프로그램의시작점 ( 윈도우메인 ) int APIENTRY WinMain(HINSTANCE hinstance,hinstance hprevinstance,lpstr lpszcmdparam,int ncmdshow) { HWND hwnd; // 메세지를받을윈도우핸들 MSG Message; WNDCLASS WndClass; g_hinst=hinstance; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=CreateSolidBrush(RGB(121,170,255)); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); WndClass.hInstance=hInstance; - 22 -
WndClass.lpfnWndProc=WndProc; WndClass.lpszClassName=lpszClass; WndClass.lpszMenuName=NULL; WndClass.style=CS_HREDRAW CS_VREDRAW; RegisterClass(&WndClass); // 등록된윈도우클래스로윈도우를생성한다 hwnd=createwindow(lpszclass,lpszclass,ws_sysmenu WS_MINIMIZEBOX, 450,450,400,200,NULL,(HMENU)NULL,hInstance,NULL); ShowWindow(hWnd,nCmdShow); // 윈도우를보여준다. while(getmessage(&message,0,0,0)) { TranslateMessage(&Message); DispatchMessage(&Message); return (int)message.wparam; //ID,passwd 확인하는부분 BOOL CALLBACK add(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { switch(imessage){ case WM_COMMAND: switch(loword(wparam)){ case IDOK: query_stat = mysql_query(conn, "select *from login"); RES = mysql_store_result(conn); ROW = mysql_fetch_row(res); GetDlgItemText(hDlg,IDC_ID,row_id,sizeof(row_id)); GetDlgItemText(hDlg,IDC_PW,row_pw,sizeof(row_pw)); EndDialog(hDlg,IDOK); case IDCANCEL: EndDialog(hDlg,IDD_DIALOG1); // 사용자삭제하는부분 BOOL CALLBACK del(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { switch(imessage){ case WM_COMMAND: switch(loword(wparam)){ case IDOK: query_stat = mysql_query(conn, "select *from login"); RES = mysql_store_result(conn); ROW = mysql_fetch_row(res); GetDlgItemText(hDlg,IDC_DEL,row_id,sizeof(row_id)); - 23 -
case IDCANCEL: EndDialog(hDlg,IDD_DIALOG2); // 사용자목록부분 BOOL CALLBACK llist(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { int num; int i=0,j=0; char qstr[50000]=""; switch(imessage){ case WM_INITDIALOG: query_stat = mysql_query(conn, "select *from login"); RES = mysql_store_result(conn); num = mysql_num_fields(res); strcat(qstr," ID Passwd "); strcat(qstr,"\r\n"); strcat(qstr,"\r\n"); while ((ROW = mysql_fetch_row(res))) { for(j=0;j<num;j++){ strcat(qstr,row[j]); strcat(qstr," "); strcat(qstr,"\r\n"); SetDlgItemText(hDlg,IDC_LLIST,qstr); case WM_COMMAND: switch(loword(wparam)){ case IDCANCEL: EndDialog(hDlg,IDD_DIALOG3); // 사용자기록부분 BOOL CALLBACK llog(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { int num; int i=0,j=0; char qstr[50000]=""; switch(imessage){ - 24 -
case WM_INITDIALOG: query_stat = mysql_query(conn, "select *from login_log"); RES = mysql_store_result(conn); num = mysql_num_fields(res); strcat(qstr," IP Time ID "); strcat(qstr,"\r\n"); strcat(qstr,"\r\n"); while ((ROW = mysql_fetch_row(res))) { for(j=0;j<num;j++){ strcat(qstr,row[j]); strcat(qstr," "); strcat(qstr,"\r\n"); SetDlgItemText(hDlg,IDC_LLIST,qstr); case WM_COMMAND: switch(loword(wparam)){ case IDCANCEL: EndDialog(hDlg,IDD_DIALOG3); // 암호화기록부분 BOOL CALLBACK enc1(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { int num; int i=0,j=0; char qstr[50000]=""; switch(imessage){ case WM_INITDIALOG: query_stat = mysql_query(conn, "select *from enc"); RES = mysql_store_result(conn); num = mysql_num_fields(res); strcat(qstr," IP Time File "); strcat(qstr,"\r\n"); strcat(qstr,"\r\n"); while ((ROW = mysql_fetch_row(res))) { for(j=0;j<num;j++){ strcat(qstr,row[j]); strcat(qstr," "); strcat(qstr,"\r\n"); - 25 -
SetDlgItemText(hDlg,IDC_ENC1,qstr); case WM_COMMAND: switch(loword(wparam)){ case IDCANCEL: EndDialog(hDlg,IDD_DIALOG4); // 복호화기록부분 BOOL CALLBACK dec(hwnd hdlg,uint imessage,wparam wparam,lparam lparam) { int num; int i=0,j=0; char qstr[50000]=""; switch(imessage){ case WM_INITDIALOG: query_stat = mysql_query(conn, "select *from ddec"); RES = mysql_store_result(conn); num = mysql_num_fields(res); strcat(qstr," IP Time File "); strcat(qstr,"\r\n"); strcat(qstr,"\r\n"); while ((ROW = mysql_fetch_row(res))) { for(j=0;j<num;j++){ strcat(qstr,row[j]); strcat(qstr," "); strcat(qstr,"\r\n"); SetDlgItemText(hDlg,IDC_DEC1,qstr); case WM_COMMAND: switch(loword(wparam)){ case IDCANCEL: EndDialog(hDlg,IDD_DIALOG5); LRESULT CALLBACK WndProc(HWND hwnd,uint imessage,wparam wparam,lparam lparam) { - 26 -
char add1[200]=""; char del1[200]=""; switch(imessage) { case WM_CREATE: mysql_init(&mysql); // mysql 초기화 conn = mysql_real_connect(&mysql, MYSQL_HOST, MYSQL_ID, MYSQL_PW, MYSQL_DB, 3306, (char *)NULL, 0); // 서버연결 c1 = CreateWindow(TEXT("button"),TEXT(" 사용자추가 "),WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 30,35,100,34,hWnd,(HMENU)ID_BUT1,g_hInst,NULL); c2 = CreateWindow(TEXT("button"),TEXT(" 사용자삭제 "),WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 150,35,100,34,hWnd,(HMENU)ID_BUT2,g_hInst,NULL); c3 = CreateWindow(TEXT("button"),TEXT(" 사용자목록 "),WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 270,35,100,34,hWnd,(HMENU)ID_BUT3,g_hInst,NULL); c6 = CreateWindow(TEXT("button"),TEXT(" 사용자기록 "),WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 30,100,100,34,hWnd,(HMENU)ID_BUT6,g_hInst,NULL); c4 = CreateWindow(TEXT("button"),TEXT(" 암호화기록 "),WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 150,100,100,34,hWnd,(HMENU)ID_BUT4,g_hInst,NULL); c5 = CreateWindow(TEXT("button"),TEXT(" 복호화기록 "),WS_CHILD WS_VISIBLE WS_BORDER BS_PUSHBUTTON, 270,100,100,34,hWnd,(HMENU)ID_BUT5,g_hInst,NULL); case WM_COMMAND: switch(loword(wparam)) { case ID_BUT1: DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,add); if(row_id!=null){ strcpy(add1,"insert into login(id,pw) values ('"); strcat(add1,row_id); strcat(add1,"','"); strcat(add1,row_pw); strcat(add1,"')"); mysql_query(conn,add1); MessageBox(hWnd," 사용자가 추가 되었습니다."," 성 공 ",MB_OK); else MessageBox(hWnd," 아이디를 입력하세요."," 성공 ",MB_OK); case ID_BUT2: DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG2),hWnd,del); - 27 -
strcpy(del1,"delete from login where id='"); strcat(del1,row_id); strcat(del1,"'"); mysql_query(conn,del1); MessageBox(hWnd," 사용자가삭제되었습니다."," 성공 ",MB_OK); case ID_BUT3: DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG3),hWnd,llist); case ID_BUT4: DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG4),hWnd,enc1); case ID_BUT5: DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG5),hWnd,dec); case ID_BUT6: DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG6),hWnd,llog); case WM_DESTROY: PostQuitMessage(0); mysql_close(conn); return(defwindowproc(hwnd,imessage,wparam,lparam)); - 28 -
5. 결론 암호기법을사용하여사용자가자신이작성한파일을암호화하여안전하게저장할수있다. 저장한파일은유출되더라도암호화에사용된키값을모르기때문에복호화를하기어렵다. 또한자신이필요할때마다복호화를하여파일을열고수정이가능하다. 그리고사용자의로그인한기록과파일을암 & 복호화한기록이서버에기록되어관리자가확인이가능해파일유출에대해추적및관리가유용하다. 이번프로젝트는 MYSQL 을 Database 로사용하는프로그램을구현하였다. Database 를선정하는과정중 Micrisoft 에서나온 MSSQL 과운영체제에직접연동하여사용할수있는 ODBC 를알게되었는데 MYSQL 과같은비슷하지만다른점들이있었다. 따라서이번프로젝트를향후보완, 발전시킨다면사용하였던 MYSQL 이아닌 MicroSoft 에서나온모든프로그램과연동이되는 MSSQL 이나 ODBC 를사용하여다양한 Database 를배워보아야겠다. 또한 API를이용하여프로젝트활성창을작성하였는데프로젝트를진행하면서공부한 API를이용하여좀더심화된 MFC까지개인능력을향상시키고이를바탕으로 MFC 대한이해도를높여활용가능한 Program Language 를넓혀야겠다고생각했다. 6. 참고문헌 - 윈도우즈 API 정복 1 2 ( 김상형지음 / 한빛미디어 ) - MySQL의사용, 관리, 프로그래밍을위한완벽가이드 ( 폴드보이 / 지앤선 ) - 데이타베이스시스템 = Database system : 설계, 구축및관리 ( 김성언 / 학현사 ) - 네이버지식백과 http://terms.naver.com/ - MYSQL http://dev.mysql.com/downloads/connector/cpp/ - 29 -
7. Program PPT - 30 -
- 31 -
- 32 -
- 33 -
- 34 -
- 35 -
- 36 -
- 37 -
- 38 -