..FILE:사용 설명서.txt### N8연결성 탐색 알고리즘 ###과 목 : 영상처리교수님 : 이규원 교수님학 과 : 컴퓨터통신전자공학부학 번 : 9684044이 름 : 육현수N8연결성 탐색 알고리즘 사용 설명서..@ 메뉴 @# File- New : 빈 영역의 이미지를 만든다..크기는 8x8, 16x16, 32x32, 64x64 중 선택- Open : 파일로 저장된 이미지 데이타를 불러온다.- Save : 화면에 만든 이미지를 파일로 저장한다.- Clear : 화면이 지우거나, 점들로 가득 채운다.- Exit : 프로그램을 종료한다.# Basic- N8연결성 : N8방식으로 이웃점들을 탐색하여 결과를 보여준다..- N8연결성(Demo) : N8방식으로 이웃점들을 탐색하고,어떻게 탐색을 했는가를 화면에 보여준다..- Default Image : N8방식에 쓸 수 있는 기본 이미지를 불러온다.단, 같은 폴더에 Default??.txt 파일이 존재해야 한다.# Help- Help : 간단한 설명이 나온다.- About : 제작자 설명이 나온다.@ 클라이언트 영역 @N8연결성(Demo)를 선택해 시연중이 아니라면 언제든지..마우스 왼쪽 버튼으로 점을 찍을 수 있고, 마우스 오른쪽 버튼으로 점을 지울 수 있습니다.그리고, 만들어진 이미지를 Save메뉴를 이용해 저장도 할 수 있습니다.@ 데모 시연 @Basic / N8연결성(Demo)를 눌러 어떻게 탐색 되었는지를 보여줍니다.. (보여주기 속도 선택)시연중 시연을 마치려면 마우스 오른쪽 클릭을 누르면 됩니다.* 주의 데모는 127x127이하의 이미지 크기와 127개 이하의 오브젝트를 갖는 이미지에서만보여주기가 가능합니다..@ 이미지 화일 구조 @EX) Default16.txt16 : 이미지의 X축 길이입니다.16 : 이미지의 Y축 길이입니다.0000000000010000 : 0번째 라인0000010000100000 : 1번째 라인*************011 :0**************************10000///BOOL CConnectivity::GetPixel(int &x, int &y, int tIndex){if(tIndex=dwLastIndex) return FALSE;x=pwListX[tIndex];y=pwListY[tIndex];return TRUE;}//////////////////////////////////////////////////// 해당점이 몇번 오브젝트인지를 반환// 반환 : FALSE -> 오브젝트 탐색 이전..// 이미지를 벗어난 좌표값// TRUE -> 반환 성공//////////////////////////////////////////////////BOOL CConnectivity::CheckPixel(int &tObject, int x, int y){int tOffset;if(pdwListObject == NULL) return FALSE;if(x=wSizeX || y=wSizeY) return FALSE;tOffset=(wSizeX*y)+x;if(pdwIndexMatrix[tOffset]==0) return FALSE;tObject=pdwListObject[tOffset];return TRUE;}////////////////////////////////////////////////////////////////////////// 시연을 위해 만들어진 멤버들... DEMO DEMO DEMO DEMO DEMO DEMO //////////////////////////////////////////////////////////////////////////// CSqList 클래스는 외부에서 초기화 되어 있어야 한다..int CConnectivity::StartDemo(CSqList *DEMO,short x, short y,unsigned char *Image){int tIndex,to;Empty();wSizeX=x;wSizeY=y;dwObjectNumber=0;dwLastIndex=1; // 주의 : 0번은 쓰지 않음...tIndex=x*ort,unsigned char*); // 오브젝트 탐색 루틴void RasterScanDemo(CSqList *,unsigned char*); // 레스트 스캔 루틴(데모)BOOL SearchDemo(CSqList*,short,short,unsigned char*); // 오브젝트 탐색 루틴(데모)};#endif..FILE:Default16.txt161600000*************00*************0001*************01*************0**************************11*************0000*************110001**************************1*************00110000*************0**************************1*************1111100000*************0..FILE:Default32.txt3232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*************000000000000000000*************000111000000000000*************0001100000000000000*************011000000000000000*************001*************000*************0*************00000*************110000000000000**************************0000**************************00000*************0*************00000*************0*************00000*************00*************0000*************000*************000*************00000000000000000000000000000*************0000*************000000000000000000000000000000000000*************0*************011000000000000000000000000000*************0111100*************0110000000000000000000000000000*************000111*************0110000000000000000000000000000000*************0011*************01000000000000000000000000000000000*************00*************010000000000000000000000000000000000*************00*************0000000000000000000000000000000000000**************************000000000000000000000000000000000000000000000000*************000000000000000000000000000000000000000000000000000*************0000000000000000000000000000000000000000000000000000*************000000000000000000000000000000000000000000000000000*************00000000000000000000000000000000000000000000000000*************000000000000000000000000000000000000000000000000000*************000000000000000000000000000000000000000000000000000*************0000000000000000000000000000000000000000000000000 내부라면 Offset을 반환한다..if(CheckBlock(tOffset,x,y)){// 이미지에 점이 있는 위치라면 점을 제거한다..if(IMAGE[tOffset] == 1){IMAGE[tOffset]=0;ObjectImage[tOffset]=10;InvalidateRect(hWnd, NULL, FALSE);}}break;case WM_MOUSEMOVE: // 마우스를 움직였다면..if(TimerFlag) break; // 타이머가 작동중이라면 작동 안함// 움직인 위치를 받아온다..x=LOWORD(lParam);y=HIWORD(lParam);// 마우스를 움직인 곳이 이미지 내부라면...if(CheckBlock(tOffset,x,y)){switch(wParam){case MK_LBUTTON: // 왼쪽 버튼을 누른상태로 이동중이라면// 주석은 LBUTTONDOWN과 동일.. 0 -> 1if(IMAGE[tOffset] == 0){IMAGE[tOffset]=1;ObjectImage[tOffset]=11;InvalidateRect(hWnd, NULL, FALSE);}else if(ObjectImage[tOffset] != 11){ObjectImage[tOffset]=11;InvalidateRect(hWnd, NULL, FALSE);}break;case MK_RBUTTON: // 오른쪽 버튼을 누른상태로 이동중이라면..// 주석은 RBUTTONDOWN과 동일.. 1 -> 0if(IMAGE[tOffset] == 1){IMAGE[tOffset]=0;ObjectImage[tOffset]=10;InvalidateRect(hWnd, NULL, FALSE);}break;}}break;// 종료 메시지 처리부분case WM_DESTROY:// 타이머가 동작중이었다면 타이머 제거..if(TimerFlag) KillTimer(hWnd,IDT_DEMO);Remove(); // 클래스 및 변수 제거PostQuitMessage(0);return FALSE;}return DefWindi
단순DES 알고리즘9684044 / 육현수1. 문 제Simple DES를 프로그램으로 구현하라.2. 문제 정의/분석? S-DES의 암호 알고리즘은 8비트의 평문 블록과 10비트의 키를 입력으로 취하여 8비트의 암호문 블록을 출력한다.? S-DES의 복호 알고리즘은 8비트의 암호문 블록과 그 암호문 생성에 사용되었던 10비트 키를 입력으로 취하여 원래의 8비트 평문 블록을 출력으로 생성한다.? S-DES를 암호화 알고리즘을 구현하기 위해서는 대략 아래와 같은 함수들이 있어야 한다.? 초기순열(IP) : 데이터 내부의 비트들의 순서를 바꾼다.? fk : 순열과 치환을 포함하고 키 입력에 의존한다.? SW : 데이터의 두 절반 부분을 상호 교환하는 간단한 순열 함수? 역순열 함수(IP-1) : 초기순열의 역3. 알고리즘에 대한 설명? 서브키 생성 알고리즘1) 10비트의 키를 입력받아, 초기순열에 넣어 자리배치를 바꾼다.P10 (k1,k2,k3,k4,k5,k6,k7,k8,k9,k10) = (k3,k5,k2,k7,k4,k10,k1,k9,k8,k6)2) 10비트의 키를 상위 5비트와 하위 5비트로 나누어 각각을 왼쪽으로 Rotate 한다.3) 10비트 중 8비트만을 골라서 치환한다.P8 (6,3,7,4,8,5,10,9)4) P8로 치환한 값을 서브키(K1)로 한다.5) 2)번에서 생성된 결과를 상위 5비트와 하위 5비트로 나누어 각각을 왼쪽으로 2비트만큼 Rotate 한다.6) 10비트 중 8비트만을 골라서 치환한다. (P8)7) P8로 치환된 두 번째 값을 서브키(K2)로 한다.? 암호화 알고리즘1) 8비트의 데이터를 초기순열(IP)에 넣어 자리를 바꾼다.IP (2,6,3,1,4,8,5,7)2) 함수 fk에 넣는다.(1) 8비트중 상위 4비트, 하위 4비트로 나눈다.(2) 상위 4비트를 확장순열 한다.E/P (4,1,2,3,2,3,4,1)(3) 확장순열 결과와 K1을 XOR연산한다.(4) 다시, 상위 4비트와 하위 4비트로 나누어 S-Box의 S0, S1에 넣는다.① S-Box는 입력된 4비트중 1번째와 4번째 비트는 S박스의 행 번호를 표시하기 위한 2비트 숫자로 취급, 2번째와 3번째 비트는 S박스의 열을 표시하기 위한 2비트 숫자로서 취급한다.S0 =S1 =② S0은 하위, S1은 상위 비트에 적용한다.(5) S-Box에서 나온 4비트와 (1)번의 하위 4비트를 XOR연산한다.3) fk에서 나온 8비트를 스위치 함수에 넣어 상위 4비트와 하위 4비트를 바꾼다.4) fk함수에 다시 8비트 값을 넣는다. (단, 이번엔 서브키(K2)를 적용한다.)5) fk에서 나온 8비트를 역순열(IP-1) 해주면 암호화가 완료된다.IP-1 (4,1,3,5,7,2,8,6)? 복호화 알고리즘1) 암호문 8비트를 초기 순열(IP) 처리해준다.2) fk함수에 넣는다. (서브키 K2로 해준다.)3) 스위치 함수에 넣어 상위 4비트와 하위 4비트를 바꾼다.4) fk함수에 넣는다. (서브키 K1으로 해준다.)5) 역순열(IP-1)을 해주면 평문이 만들어진다.4. Flow Chart? 암호화? 복호화초기순열(IP)fk함수(k1)상위 4비트와하위 4비트를 바꿈fk함수(k2)역순열(IP-1)모든 문자열 변환YesNo시 작종 료초기순열(IP)fk함수(k2)상위 4비트와하위 4비트를 바꿈fk함수(k1)역순열(IP-1)모든 문자열 변환YesNo시 작종 료5. 데이터 구조? Main1) 사용한 변수char InText[101]: 사용자에게서 입력받은 문장을 저장하는 변수char EncText[101]: 입력한 변수를 암호화한 데이터를 저장하는 변수char OutText[101]: 암호화된 데이터를 평문으로 바꾼 문장을 저장하는 변수2) 사용한 함수void MakeBin(char *Out, char *In, int Size)입력한 문자들의 바이너리 값으로 보여주기 위해 만든 함수? CSDes 클래스1) 멤버변수short Key1: 서브키(K1)을 저장한다.short Key2: 서브키(K2)를 저장한다.bool KEY_SET: 키를 설정해 주었는지를 기억한다.2) 멤버함수void SetKey(short Key)? 암호화 혹은 복호화 할 때 쓰일 킷값을 설정할 때 쓴다.charEncryption(char Data)boolEncryption(char *Out, char *In, int Size)? 암호화 해주는 멤버로 위의 것은 한 문자단위, 아랫것은 문자열 단위로 암호화 한다.charDecryption(char Data)boolDecryption(char *Out, char *In, int Size)? 복호화 해주는 멤버로 위의 것은 한 문자단위, 아랫것은 문자열 단위로 복호화 한다.shortKeyIP(short Key)? 키의 초기 순열 멤버shortLeftShift1(short Key)? 키를 상위 5비트, 하위 5비트 각각 왼쪽으로 시프트(Rotate)해주는 멤버shortKeyTransPosition(short Key)? 키를 치환해주는 멤버shortDataIP(short Data)? 데이터의 초기순열(IP)를 처리해준다.shortFunctionK(short Data, short Key)? fk함수로 한 문자와 서브키를 받아 처리한다.shortExPermutation(short Data)? 확장/순열 멤버이다..shortS_Box(short Data)? S-Box를 구현한 멤버voidS_BoxSlice(short &s1, short &s2, short sData)? S-Box 내부에서 4비트를 행과 열로 나눠주는 멤버shortS_BoxSub1(short Data)? S-Box 내부에서 하위 4비트를 처리하는 S0shortS_BoxSub2(short Data)? S-Box 내부에서 상위 4비트를 처리하는 S1shortDataIP_1(short Data)? 역순열 멤버(IP-1)shortDataSwitch(short Data)? 상위 4비트와 하위 4비트를 바꿔주는 스위치 기능 멤버6. 출력값그림1) 프로그램 실행의 초기상태 그림2) 평문과 키를 입력한다.그림3) ‘암호문 생성’버튼을 누르면 화면 가운데 있는 암호문 창에 암호화된 문장이 뜬다. 그림4) 암호해독을 위해서는 암호화 했을 때 썼던 키와 동일한 키를 입력해주고 ‘암호문 해독’버튼을 누르면 된다.그림5) ‘암호문 해독’버튼을 누르면 키가 정확하다면 암호문을 정확히 평문으로 바꿔서 보여준다. 그림6) 암호문이 틀렸을 경우는 이상한 문자들로 출력되어 알아볼 수 없다.7. 소스? CSDes 클래스////////////////////////////////////////////////////////////// 심플데스를 구현한 클래스...// 제작자 : 컴퓨터공학전공 / 9684044 / 육현수////////////////////////////////////////////////////////////#ifndef__SIMPLE_DES_CLASS__#define__SIMPLE_DES_CLASS__#include////////////////////////#include"Flags.h"// 비트 단위 처리를 하기위한 클래스..// 영상처리 레포트에 썼던 것을 그대로 옮겨 왔음..class CSDes:private CFlags{private:shortKey1;// K1 값을 저장shortKey2;// K2 값을 저장.boolKEY_SET;// Key값이 입력 되었는지를 저장public:CSDes();CSDes(shortKey);//~CSDes();voidSetKey(short Key);// 키를 정의함// 암호문 생성용 멤버charEncryption(char Data);boolEncryption(char *Out, char *In, int Size);// 평문 생성용 멤버charDecryption(char Data);boolDecryption(char *Out, char *In, int Size);protected:shortKeyIP(short Key);// 키의 초기 순열shortLeftShift1(short Key);// 왼쪽 시프트shortKeyTransPosition(short Key);// 키 치환shortDataIP(short Data);// 데이터 초기 순열shortFunctionK(short Data, short Key);// fk 함수shortExPermutation(short Data);// 확장/순열 함수shortS_Box(short Data);// S-BOXvoidS_BoxSlice(short &s1, short &s2, short sData);// 행,열 구해주는 함수shortS_BoxSub1(short Data);// S0shortS_BoxSub2(short Data);// S1shortDataIP_1(short Data);// 역순열shortDataSwitch(short Data);// 스위치};#endif// 생성자.. 클래스 초기화CSDes::CSDes(){Key1=0;Key2=0;KEY_SET=false;}// 생성자.. 클래스 초기화.. 키값을 받는다..CSDes::CSDes(short Key){SetKey(Key);}// 키값을 받아 k1, k2를 생성한다.void CSDes::SetKey(short Key){shortTempK1, TempK2;TempK1=KeyIP(Key);// 자리바꿈TempK2=LeftShift1(TempK1);// 왼쪽으로 한번 자리옮김Key1=KeyTransPosition(TempK2);// 키 치환 (10bit -> 8Bit)TempK2=LeftShift1(LeftShift1(TempK2));// 왼쪽으로 두번 자리옮김Key2=KeyTransPosition(TempK2);// 키 치환 (10Bit -> 8Bit)KEY_SET=true;}// 키의 초기순열short CSDes::KeyIP(short Key){static short KEY_PMT[10]={2,4,1,6,3,9,0,8,7,5};// 자리바꿈 위치shorttKey=0;for(int i=0;i