SEED는 정보통신 및 정보보호의 비밀성 서비스를 제공하기 위하여 한국정보보호 진흥원이 주관이 되어 1998년 개발, 공개하여 한국 표준 암호 방식으로 선정한 128비트 블록 암호 방식입니다. SEED는 암호 방식의 입력으로 평문 128비트와 암호화 키 128비트가 입력되어 128비트의 암호문을 출력합니다.

일단 SEED 관련 소스나 정보를 얻기 위해서 한국정보보호진흥원(http://www.kisa.or.kr)에 접속하여 소스를 신청(http://seed.kisa.or.kr/kor/seed/request01.jsp) 하실수 있습니다.

신청을 하게되면 신청이메일주소로 소스가 오게 됩니다.

압축을 풀면 소스코드 메뉴얼과 소스들이 나옵니다.
그대로 사용하시면 되는데

문제는 CBC 가 아닌가합니다. 인터넷에도 소스도 별로 없고 이론적 설명뿐이고 실제 개발과정에서 참고 할만할게 별로 없었습니다. 이것은 의외로 구글링을 통한 외국사이트도 마찮가지였습니다.

일단 CBC의 알고리즘과 기본이론은 지겹도록 봐서 알겁니다.
(솔찍히 저역시 처음엔 그것만 아무리봐도 이해가잘 안되는부분이 많았습니다. 소스코드는 어디에 있는지....ㅜㅜ)

CBC 모드 암호화 의사코드

어쩌라고......

일단 내용은 이렇습니다.(긴말 필요없다 . 당장 소스코드를 내놓아라~!)
먼저 비밀키를 가지고 라운드키를 생성합니다.
SeedRoundKey(dwRoundKey, (BYTE *)cKeyValue) 함수입니다.
P는 원문이고 C는 암호화된문입니다.(P1,P2 ....과 C1,C2 등은 각블럭들....)
일단 버퍼에서 SEEDBLOCKSIZE(16) 만큼을 가져와서(P1) 그전 암호화된 C블럭과
(^) 연산을 하게 됩니다. 처음엔 InitVecter 값이 들어가게 됩니다.
그래서 나온 I블록(inputBlock)을 SEED 로 암호화합니다.
SeedEncrypt(inputBlock, dwRoundKey) 함수입니다.

그래서 나온 O 블록을 C에 차곡차곡 쌓으면 됩니다.(C1,C2,C3.........)

CBC 모드 복호화 의사코드


이번엔 복호화 입니다.
일단 라운드키 생성을 먼저 하시고,
암호화된 C블럭(암호화된)을 복호화합니다.
SeedDecrypt(inputBlock, dwRoundKey) 함수입니다.
그렇게 해서 나온 O블럭을 그전 C블럭(처음엔 InitVecter)과 (^) 연산합니다.
그결과 값이바로 P블럭(원문)입니다.

이제 기다리시던 소스를 공개하겠습니다. 원래알고리즘과 다소 다른부분이 있습니다.
소스에는 pkcs5 이슈도 포함되어있지만 설명은 생략하겠습니다.




마지막으로 운영체제가 64bit일경우 KISA의 소스 그대로 사용하시면
라운드키가 매번 다르게 생성되는 것을 발견할수있습니다.
이유는
SEED_KISA.h 의 내용중
/******************************* Type Definitions *****************************/

// If your machine uses different data types, you must change them to proper ones.
#ifndef TYPE_DEFINITION
    #define TYPE_DEFINITION
    #if defined(__alpha)
        typedef unsigned int        DWORD;        // unsigned 4-byte data type
        typedef unsigned short      WORD;        // unsigned 2-byte data type
       
    #else
        typedef unsigned long int   DWORD;        // unsigned 4-byte data type
        typedef unsigned short int  WORD;        // unsigned 2-byte data type
    #endif
    typedef unsigned char           BYTE;        // unsigned 1-byte data type
#endif

구문이 있는데 64bit 에서는 자료형 크기가 달라 생기는 현상입니다.
운영체제나 상황에 따라 여러가지 해결방법이 있는데 저는
typedef int32_t        DWORD;        // unsigned 4-byte data type
typedef int16_t     WORD;        // unsigned 2-byte data type
이렇게 수정하여 해결하였습니다.
단...이것은 여러가지 환경에 따라 달라질수있기때문에 여러분이 직접 각 자료형을 대입해보고
선택해야됩니다.

Posted by 빨강토끼
,
TCHAR tstr[10];
swprintf_s(tstr,sizeof(tstr),_T("\"%s\""),CA2W(tmp));

이렇게 하면 나중에 문제가 생깁니다.
왜냐면 sizeof 반환값이 20을 리턴합니다.

swprintf_s(tstr,sizeof(tstr)/sizeof(TCHAR),_T("\"%s\""),CA2W(tmp));
이거나
swprintf_s(tstr, _countof(tstr),_T("\"%s\""),CA2W(tmp));

이렇게 사용해야됩니다.

좀더 자세한 내용은 네이버군에게....^^
낚시아님...
Posted by 빨강토끼
,

ASCII Code

프로그래밍/C++ 2009. 12. 10. 09:16
Posted by 빨강토끼
,
put_MessageDrain 메서드는, 비디오 윈도우로부터 마우스 메시지와 키보드 메시지를 받아들이는 윈도우를 지정합니다.

DirectShow 를 사용한 화면에서 마우스나 키보드 이벤트가 발생시
즉 재생되고 있는 영상위에서 마우스 이벤트가 발생하거나,
사용자가 키보드입력 등을 할경우
기본적으로 이벤트는 자신의 부모 스래드(핸들)에게 이벤트를 전달합니다.
하지만 영상을 생성한(비디오윈도우를 생성한) 핸들이 아니고,
다른곳(다른윈도우 등)에서 이벤트를 받고자할경우.

put_MessageDrain 메서드를 사용하면됩니다.

CComQIPtr<IVideoWindow, &IID_IVideoWindow> pWindow = m_pGB;
    if(!pWindow)
    {
        Error(TEXT("Could not get video window interface"));
        return hr;
    }

    // set up the preview window to be in our dialog
    // instead of floating popup
    //
    RECT rc;
    ::GetWindowRect(hwndPreview, &rc);

    hr = pWindow->put_Owner((OAHWND) hwndPreview);
    hr = pWindow->put_Left(iX);
    hr = pWindow->put_Top(iY);
    hr = pWindow->put_Width(iWidth);
    hr = pWindow->put_Height(iHeight);
    hr = pWindow->put_Visible(OATRUE);
    hr = pWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
    hr = pWindow->put_MessageDrain((OAHWND)hwndPreview); // 이벤트를 전달할 핸들
Posted by 빨강토끼
,
c:\program files\microsoft sdks\windows\v6.0a\include\qedit.h(498) : fatal error C1083: Cannot open include file: 'dxtrans.h': No such file or directory

vs2008 에서 DirectShow 작업을 할때 상기와 같은 에러가 나면서 컴파일이 안되었습니다.
이유는 dxtrans.h 를 찾을 수 없다는 것입니다.

예전에는 DirectShow 가 DirectX SDK안에 있었는데 언제부터인가 플랫폼 SDK로 옮겨져서
DirectShow 을 이용한 개발을 위해서 별도로 DirectX SDK를 설치하지 않아도 되는듯 합니다.

아무튼...

qedit.h 를 include 하기 전에 아래와 같은 코드를 삽입하면 해결됩니다.

#pragma include_alias( "dxtrans.h", "qedit.h" )

#define __IDxtCompositor_INTERFACE_DEFINED__

#define __IDxtAlphaSetter_INTERFACE_DEFINED__

#define __IDxtJpeg_INTERFACE_DEFINED__

#define __IDxtKey_INTERFACE_DEFINED__

#include <qedit.h>


Posted by 빨강토끼
,
Posted by 빨강토끼
,
ProjectName.exp :
warning LNK4070: /OUT:ProjectName.dll directive in .EXP differs from output filename "ProjectNameD.dll"; ignoring directive

원인 :
상기 경고는 DLL ProjectSetting 에서 Output file name 을 바꾸면 나타나는 현상입니다.
( ProjectName.dll -> ProjectD.dll )
.def 파일의 내용중에 아래 와 같이 ProjectName.dll 로 되어있어서
.exp 파일과 결과물이 달라서 발생하는 현상입니다.

해결방법 :
ProjectName.def 파일을 하나 복사해서 아래와 같이 수정합니다.
-----------------------------------------------------------------------------------
LIBRARY : ProjectName
----------------------------------------------------------------------------------
항목을
----------------------------------------------------------------------------------
LIBRARY : ProjectNameD
----------------------------------------------------------------------------------
이렇게 수정합니다.

그리고 Project Setting -> Link -> Category:General -> Project Options : /def:ProjectNameD.def
로 수정하시면 됩니다.
Posted by 빨강토끼
,
다이얼로그에서 타이틀바를 제거 하기위해서 함참동안 해매였습니다.
사실전에 알고있었는데 기억이 잘안나서 고생을 했습니다.
그래서 제 블로그에 기록해 놓을려구요.

먼저 다이얼로그의 속성에서 Border 를 None으로 바꾸고
(Title bar 와 System menu 가 언체크됩니다.)

그리고 소스상의 OnInitDialog() 에서
아래를 추가합니다.

    // 작업표시줄에 표시하고자 하는 문자열 지정.
    SetWindowText("title);
   
    // WS_SYSMENU 스타일을 추가한다.
    ModifyStyle(0, WS_SYSMENU | WS_MINIMIZEBOX,0);

위내용은 삽입하는 이유는
1.작업표시중에 Title 를 추가
2.종료기능을 위하여 WS_SYSMENU 를 추가 (작업표시줄에서 마우스오른쪽버튼)
3.최소화기능을 위하여 WS_MINIMIZEBOX 를 추가 (작업표시줄에서 마우스오른쪽버튼)
Posted by 빨강토끼
,
http://www.telnet.or.kr/sec_directx/
한글이라서 좋아요^^
Posted by 빨강토끼
,
로그를 보니 이글에 대한 검색이 많더군요.
그래서 기존의 VB(비베)에 C++ 관련 정보도 추가해보았습니다.

------------------------------------------------------------

오늘 이것때문에 시간을 너무 많이 소비하였다.
사실 알고보면 이것때문에 오히려 개발시간이 단축된건 사실이다.
인터넷 요기조기를 돌아보고 삽질을 한결과 알아낸 사실 몇가지를 기록하겠습니다.

일단 findwindow 가 머냐면...
여러가지 용도로 쓰겠지만
제가 사용한 목적은 특정 프로그램이 실행중인가를 알아내기 위해서입니다.
가령 B 라는 프로그램이 실행중인지 아닌지 A라는 프로그램이 알아내기 위해서입니다.
이것또한 자세히 들어가보면 저는 한프로그램에서 (VB) shell 명령어로
두 프로그램을 실행시키는데 순차적으로 실행이 되어야됩니다.

나중에 해당기능이 완성되면 별도의 글로 정리를 하겠지만
카트라이더 처럼 런처를 만들려고 합니다.
일단 프로그램이 설치되어있는가 확인후 만일 없거나 버젼이 다른경우
설치프로그램을 다운로드하고 설치를 한후에
프로그램을 실행시키는 방식입니다.

서론이 넘길었군요.
머 아는것도 별로 없는게 말만 많았습니다.

일단 vb에서 findwindow를 사용하기 위해서는 API를 선언해야합니다.



Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

그리고 해당 프로그램의 class 명이나 caption 값을 알아야하는데
어떻게 하느냐면. caption는 의외로 간단합니다.
프로그램을 실행시키면 가장상단에 있는것 있죠?
브라우져를 예로 들면 <title>...</title> 부분입니다.
그런데 class 명을 알고 싶거나 caption 값이 이상하게 안된다? 하면
C++ 를 깔면 같이 깔리는 spy++ 이라는 프로그램을 실행시킨후에
Ctrl + F 를 누른후 + 라로 마치 과녁같이 생긴것을 해당프로그램에
드래그 드롭을 하면 관련정보가 주르륵 나옵니다.

여기서....

제가 가장 시간을 잡아먹은 부분입니다.

Dim lngHwnd As Long '프로세스 확인

Private Sub Form_load()
  lngHwnd = FindWindow(vbNullString, "Sample App")
  'MsgBox lngHwnd
  If lngHwnd = 0 Then
  Timer1.Enabled = False
  executeFcs
  Else
  chkInstall
  End If
End Sub

위에 코드중에서 이부분

lngHwnd = FindWindow(vbNullString, "Sample App")

첫번째인자가 Class명입니다.
두번째인자가 caption값이구요...

class 명을 모르면 vbNullString 이런식으로 넣으면 되구요
반대인경우에는 caption 값에 vbNullString 를 넣는 식으로
하시면 됩니다.

정상적으로 다른 프로그램이 실행중이면 Hwnd 값이 나오고
실행중이 아니면 0 이 반환됩니다.

그런데 왜 시간을 소비했냐면 물론 전제적으로 프로그램이 잘안되서
이것저것 만지다보니 이렇게도 해보고 저렇게도 해보다가
코드가 뒤죽박죽....머이런 식이었습니다.

C++ 에서는

HWND hWnd;

hWnd = FindWindow( NULL,"Sample App");
위의 설명과 똑같이
첫번째 인자는 클래스이름이고
두번째 인자는 윈도우이름입니다(caption).

if(hWnd)
{
    SetForegroundWindow((HWND)(((DWORD)hWnd) | 0x01));
    return 0;
}

위에 코드는 클래스이름 또는 윈도우 제목이 일치하는 윈도우를 찻았다면
SetForegroundWindow 함수를 사용하여 그 윈도우가 활성 윈도우가 되게 하는 코드입니다.

그럼....오늘도 행복한 프로그래밍 하세요.
저도 행복한 프로그래밍을 하도록 노력하겠습니다.^^;
Posted by 빨강토끼
,