암호화 기본 내용

AES는 암호화 복호화 과정에서 동일한 키를 사용하는 대칭 키 알고리즘이다.

 

대칭 키 암호는 암호화 알고리즘의 한 종류로, 암호화와 복호화에 같은 암호 키를 쓰는 알고리즘을 의미한다.

대칭 키 암호에서는 암호화를 하는 측과 복호화를 하는 측이 같은 암호 키를 공유해야 한다. 이러한 점은 공개 키 암호에서 공개 키와 비밀 키를 별도로 가지는 것과 구별된다. 대신, 대부분의 대칭 키 암호는 공개 키 암호화 비교하여 계산 속도가 빠르다는 장점을 가진다

 

대칭 키 암호는 암호화하는 단위에 따라 스트림 암호화 블록 암호로 나눌 수 있다.

-       스트림 암호는 연속적인 비트/바이트를 계속해서 입력 받아, 그에 대응하는 암호화 비트/바이트를 생성하는 방식이다.

-       블록 암호는 정해진 한 단위(블록)를 입력 받아 그에 대응하는 암호화 블록을 생성하는 방식이다.

 

DES AES가 블록 암호의 대표적 알고리즘이다.

 

블록 암호는 암호화할 때 블록을 어떻게 사용하느냐에 따라 4가지의 모드로 나눠진다

 

-       ECB(Electric CodeBook)

-       CBC(Cipher Block Chaining)

-       CFB(Cipher FeedBack)

-       OFB(Output FeedBack)

 

블록 암호에서 중요한 것은 암호화할 평문을 일정 길이의 블록으로 나눈다는 것이다.

만약 평문이 일정 길이의 블록으로 나눠지지 않는다면 ‘패딩(padding’이라고 하는 빈 데이터를 마지막에 덧붙인다그리고 나눠진 각각의 블록을 하나씩 키로 암호화한 후 생성된 암호 블록들을 하나로 합친다. 끝으로 패딩은 제거한다

 

CBC 모드는 XOR 연산 과정이 추가된 것이다. CBC 모드에서는 블록의 XOR 연산을 하기 때문에 초기 연산 블록으로 사용되는 IV(initiation Vector)가 필요하다.

IV는 블록 중의 하나를 선택하거나 블록 길이와 같은 길이의 임의의 데이터를 사용한다

 

 

키는 고정하고

Iv의 값을 같이 보내서 서버에서 복호화할 수 있게 해야 한다

라이브러리 사용 시 프로젝트 속성 설정

  1. 추가 포함 디렉터리
Include 할 헤더 파일이 있는 디렉터리를 지정한다.
ex)  Opencv 라이브러리의 경우 각 프로젝트마다 opencv 헤더파일을 가지고 있는 것이 아니라,

특정 위치(c:\opencv) opencv 관련 라이브러리가 있고, 사용할 프로젝트에서 해당 디렉토리 위치를 추가하여 헤더파일을 읽어 사용한다




추가 포함 디렉토리를 등록하면 아래와 같이 바로 헤더 파일 디렉터리를 가져온다





2. 추가 라이브러리 디렉터리


  사용할 lib 파일이 있는 디렉터리를 지정한다. 헤더파일과 마찬가지로 링커>입력>추가 종속성에서 lib 파일을 지정할 경우 해당하는 디렉터리에서도 lib 파일 유무를 확인한다





3. 추가 종속성


실제 사용할 라이브러리 파일의 이름을 적어준다

속성페이지에서 아래와 같이 lib 파일을 지정할 수 있고, #pragma (lib, opencv_calib3d2411d) 와 같이 코드에서 명시적으로 사용 라이브러리를 지정할 수 있다






'and so on' 카테고리의 다른 글

암호화 기본 내용  (1) 2015.04.23
[windbg] kb 명령어  (0) 2015.03.05
chapter01. 네트워크 프로그래밍과 소켓의 이해  (0) 2014.12.09
상속 vs 포함 (포함 예제)  (0) 2014.12.03
상속 vs 포함  (0) 2014.12.03

WM_GESTURE에서 PAN 입력 받기 (one/ two finger)

 

WM_GESTURE 메시지를 등록하여 이벤트를 처리할 경우

등록한 OnGesture 함수에 two finger pan의 발생은 들어오는데

One finger panOnGesture이벤트가 발생조차 되지 않는다

 

이때 모든 pan 동작에 대하여 메시지를 받을 수 있도록

WM_GESTURENOTIFY 메시지에서 Gesture를 설정해주어야 한다.

 



    switch (message)

    {

    case WM_GESTURENOTIFY:

        GESTURECONFIG gc = {0,GC_ALLGESTURES,0};

        BOOL bResult = SetGestureConfig(hWnd,0,1,&gc,sizeof(GESTURECONFIG));

           

        if(!bResult)

        {

            // an error

        }

        return DefWindowProc(hWnd, WM_GESTURENOTIFY, wParam, lParam);

    }

     

 

 

WM_GESUTRENOTIFY에서 SetGestureConfig를 이용하여 어떤 제스처에 대해서만 메시지를 받을지 설정하고 나면

해당하는 제스처가 발생했을 경우 WM_GESTURE 메시지를 받을 수 있다

 

SetGestureConfig 함수를 이용하여 설정하기 위해서는 CGestureConfig 객체를 인자로 넘겨주는데

CGestureConfig로 제스처 사용 여부를 설정하는 방법은 해당하는 제스처의 Enable 함수를 호출하면 된다

 

Ex)

Pan 동작에 대하여 메시지를 설정하려면

EnablePan() 함수를 호출하여 Pan 동작 사용시에는 EnablePan(TRUE), EnablePan(FALSE)의 값으로 설정해준다

 

Pan의 경우 여러가지 동작이 있는데

#define GC_PAN_WITH_SINGLE_FINGER_VERTICALLY        0x00000002

#define GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY      0x00000004

#define GC_PAN_WITH_GUTTER                          0x00000008

#define GC_PAN_WITH_INERTIA                         0x00000010

 

EnablePan함수에서 flagDefault는  

GC_PAN_WITH_GUTTER | GC_PAN_WITH_INERTIA 로 되어 있어서,

한 손가락에 대한 터치 제스처를 받기 위해서는  GC_PAN_WITH_SINGLE_FINGER_VERTICALLY | GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY 값도 flag 설정을 해주어야 한다

 

그래서 모든 Pan 동작을 받기 위하여

gestureConfig.EnablePan(TRUE, GC_PAN);

로 설정을 해주었다

 

WM_GESTURE 관한 내용

https://msdn.microsoft.com/en-us/library/windows/desktop/dd353243(v=vs.85).aspx

RGB


1 bit : 흑백

2 bit : 4가지(2^2) 색상 표현 가능

4 bit : 16가지(2^4) 색상 표현 가능

8 bit : 256가지(2^8) 색상 표현 가능

16 bit : R B 5bit / G 6bit를 할당하여 표현. 하이 컬러(High Color)

24 bit : RGB 각각 8bit씩 할당. 트루 컬러(true Color)

32 bit : true Color + alpha(투명 값). RGBA라고 부름

 

-       16bit

RGB555 : 남은 1비트를 사용하지 않고 RGB에 각각 5bit씩 할당 [0RRRRRGGGGGBBBBB]

RGB565 : 16비트 구성의 1bit  사람의 눈에 가장 민감한 G에 할당 [RRRRRGGGGGGBBBBB]

 

-       32 bit 

Alpha 바이트가 앞에 오면 ARGB888 뒤에 오면 RGBA888이다 

 

-       Alpha (투과도/ 투명도)

: 색상이 얼마나 투명하거나 불투명할지를 결정하고 1일 경우 완전 불투명, 0일 경우 완전 투명으로 결정한다. 0~1 값을 가지나?

이미지의 각 픽셀의 컬러 값을 구할 때 픽셀의 컬러 값에 알파채널의 값을 곱하여 표현한다. 그래서 알파 값이 1 이면 픽셀의 컬러가 변하지 않고 그대로 출력되고 알파채널이 그것보다 낮으면 컬러가 원래의 색보다 좀 더 우중충하게 나올 것이다.

ð   두 이미지를 합칠 때 Alpha 값을 사용하게 된다
Final Fixel = ( src Color * src alpha ) + ( dest Color * (1 - src alpha))   

'media' 카테고리의 다른 글

Video - YUY2 Format  (0) 2015.03.23

Video - YUY2 Format

  

YUV 4:2:2 Format에는

-       YUY2

-       YUVY

가 있다 (권고)

 

Format

Chroma sampling

Packed or planar

Bits per channel

YUY2

4:2:2

Packed

8

 

  

-       저장 형태에 따른 YUV 종류 

http://seoduckchan.com/2014/04/06/yuv-color/#fn-231-1

 

YUV Packed format Planar format 의 종류가 있다.





Packed format Y UV가 함께 섞여 Macropixel을 이루는 종류들을 말하며

이와 대조적으로 Planar format Y, UV 정보들이 서로 다른 영역에 분리되어 저장된 포맷들을 말한다.

 




-       메모리 저장 방식

https://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx#YUV422formats16bitsperpixel


 


Unsigned char 배열 값으로 다룰 수 있다.

첫 번째 byte는 첫 Y을 포함, 두 번째 byte는 첫 U(Cb)를 포함, 세 번째 byte는 두 번째 Y를 포함, 네 번째 byte는 첫 V(Cr)을 포함한다         

 

따라서 Y0 U0 Y1 V0으로는 2pixel을 표현할 수 있다

First pixel

U0 Y0 V0

Second pixel

Y0 Y1 V0

 

Y0 U0 Y1 V0 은 각각 1바이트씩 총 4바이트니까 32bit로 이루어져 있는데,

4바이트로 2개의 pixel이 표현 가능하므로 1개의 pixel 16bit가 필요하다고 볼 수 있다

 






-       색 표현 범위

https://msdn.microsoft.com/en-us/library/windows/desktop/bb530104(v=vs.85).aspx

 

Component

Range

Y'

16235

Cb/Cr

16240, with 128 representing zero

 

 

색을 표현하기 위한 RGB YUV의 값

Color

R

G

B

Y'

Cb

Cr

Black

0

0

0

16

128

128

Red

255

0

0

81

90

240

Green

0

255

0

145

54

34

Blue

0

0

255

41

240

110

Cyan

0

255

255

170

166

16

Magenta

255

0

255

106

202

222

Yellow

255

255

0

210

16

146

White

255

255

255

235

128

128

 

è 검정색을 표현하기 위해서 RGB에서는 각 값에 0을 주면 되지만, YUV에서는 Y = 16, U = 128, V = 128 값을 주어야 한다

 

 


'media' 카테고리의 다른 글

RGB  (0) 2015.03.30

[DirectShow] FORMAT_VideoInfo2

Video Renderer와 연결은 되고 영상 출력이 되지 않았다

 

현재 작업중인 필터에서 output핀 타입을 input핀 타입과 동일하게 만들어서 영상을 출력하고 있었는데

변환 필터에서 Input으로 받은 FormatType VideoInfo2일 때

출력 핀의 미디어 FormatTypevideoInfo2 이면 영상 출력이 되지 않았다

 

처음에는 단순히  Input FormatType VideoInfo2일 때 필터 연결을 해서 발생한 문제인줄 알았는데,

Input Format Type VideoInfo2이더라도, output mtOut->FormatType() 을 체크하지 않으면

Format TypevideoInfo로 변환되고 정상적으로 출력 되었다

 

HRESULT CEZrgb24::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)

{

           HRESULT hr;     

           hr = CheckInputType(mtIn);

           if (FAILED(hr))

                     return hr;

 

           //// format must be a VIDEOINFOHEADER

           //if (*mtOut->FormatType() != FORMAT_VideoInfo2)//FORMAT_VideoInfo)

           //        return E_INVALIDARG;

 

           //formats must be big enough

           if (mtIn->FormatLength() < sizeof(VIDEOINFOHEADER) || mtOut->FormatLength() < sizeof(VIDEOINFOHEADER))

                     return E_INVALIDARG;

 

           return S_OK;

}

 




-       Input 포맷 타입은 FORMAT_VIDEOINFO2


-       Output 포맷 타입은 FORMAT_VIDEOINFO 

 

videoInfo 타입과 videoInfo2 타입이 무엇인지 확인해보았다

 

videoInfo2

https://msdn.microsoft.com/en-us/library/windows/desktop/dd407324(v=vs.85).aspx

 

VMR-7, VMR9 VIDEOINFOHEADER2를 즉시 제공한다 VMR 에 접속할 때 최상의 포맷을 제시한다. 이전 Video Renderer filter

VIDEOINFOHEADER2를 지원하지 않는다.

Video Renderer filter에서 VIDEOINFOHEADER2를 사용하기 위해서는 Overlay Mixer를 그래프 안에 삽입해야 한다.

 

1. decoder filter output 핀에 미디어 타입을 나열한다(EnumMediaType 메소드 이용)

2. 나열된 배열에서 첫 번째 미디어 타입을 확인한다

3. 포맷 타입이 FORMAT_VideoInfo2일 경우 output pin Overlay Mixer에 접속한다  그리고 나서 Overlay Mixer video renderer에 접속 한다

 

 

내용을 읽어보니까 그냥 Video Renderer Filter에서 videoInfo2 타입을 사용을 하려면

overlay Mixer 필터를 통해서 영상을 출력하라는 것 같다

 

아니면 VMR9을 쓰던가

 

하….

근데 VideoInfo2Overlay Mixer 연결도 안되고,

Video Mixing Renderer9으로 연결하면 연결은 되는데 화면이 안나온다

 

'media > directshow' 카테고리의 다른 글

[DirectShow] SetProperties()에서 E_FAIL 발생  (0) 2015.03.20

[DirectShow] SetProperties()에서 E_FAIL 발생

변환 필터 제작 중

 

INPUT 핀 타입을 RGB에서 YUY2로 변경 하였다

Current Media Type

Majortype

MEDIATYPE_Video

Subtype

MEDIASUBTYPE_YUY2

formattype

FORMAT_VIDEOINFO2

 

 

기존 방식과 동일하게 input으로 받는 핀의 정보를 output 핀 형식과 동일하게 사용하려는데,

 

DecideBufferSize 함수에서

할당자를 설정하는 부분인 setProperties에서 계속 E_FAIL을 반환하여

Video Renderer Output 핀 연결이 되지 않았다

 

나랑 같은 문제여서 참고함

http://microsoft.public.win32.programmer.directx.video.narkive.com/8rcTkAL3/can-t-get-yv12-media-type-to-negotiate-in-transform-filter

 

CheckTransform 함수에서 Input , output 핀의 FormatLength를 체크 함?

이걸로 문제가 해결 됨… 왜지??

 

-       Old

HRESULT CheckTransForm(const CMediaType *mtIn, const CMediaType *mtOut)

{

    if (*mtIn == *mtOut)

   return S_OK;

 return E_FAIL;

} 

 

- Now

HRESULT CheckTransForm(const CMediaType *mtIn, const CMediaType *mtOut)

{

      HRESULT hr;

hr = CheckInputType(mtIn);

if (FAILED(hr))

return hr;


// format must be a VIDEOINFOHEADER

if (*mtOut->FormatType() != FORMAT_VideoInfo)

return E_INVALIDARG;


//formats must be big enough

if (mtIn->FormatLength() < sizeof(VIDEOINFOHEADER) || mtOut->FormatLength() < sizeof(VIDEOINFOHEADER))

return E_INVALIDARG;


return S_OK; 

}


'media > directshow' 카테고리의 다른 글

[DirectShow] FORMAT_VideoInfo2  (0) 2015.03.20

[LNK2019] 확인할 수 없는 외부 참조입니다.

openCV 사용하다가 lnk2019에러 발생하였다.

맨 처음에는 라이브러리 참조에서 발생한걸로 당연히 알고 

참조 라이브러리 오타 확인하고 또 하고 했는데



"void __stdcall cv::error(class cv::Exception const &)" (?error@cv@@YGXABVException@1@@Z) 외부 기호(참조 위치: "public: class cv::Vec<unsigned char,3> & __thiscall cv::Mat::at<class cv::Vec<unsigned char,3> >(int,int)" (??$at@V?$Vec@E$02@cv@@@Mat@cv@@QAEAAV?$Vec@E$02@1@HH@Z) 함수)에서 확인하지 못했습니다.

"void __stdcall cv::fastFree(void *)" (?fastFree@cv@@YGXPAX@Z) 외부 기호(참조 위치: "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ) 함수)에서 확인하지 못했습니다.

"int __stdcall cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YGHPAHH@Z) 외부 기호(참조 위치: "public: __thiscall cv::Mat::Mat(class cv::Mat const &)" (??0Mat@cv@@QAE@ABV01@@Z) 함수)에서 확인하지 못했습니다.



호출 규칙이 _stdcall(/Gz)로 되어 있었다


__cdecl(/Gd)로 변경하여 해결



window 깜빡임 처리 - WM_ERASEBKGND와 WM_PAINT

Window는 뭔가 새로 그려야할 필요성 있을 때마다 WM_PAINT Message를 받습니다. OnPaint라는 이름으로 WM_PAINT에 대한 Handler Function이 보통 만들어지죠. System으로부터 WM_PAINT가 날아오는 상황은 다음과 같습니다.

    - 윈도우가 처음 생성되었을 때
    - 윈도우의 위치가 이동되었을 때 
    - 윈도우의 크기가 변경되었을 때(최소 및 최대화 포함)
    - 윈도우의 전체 또는 일부가 다른 윈도우에 가려져 있다가 나타날 때
    - 윈도우가 스크롤 될 때
    - UpdateWindow나 RedrawWindow 함수가 불렸을 때
    - InvalidateRect나 InvalidateRgn 함수가 불려서 다시 그려져야할 영역이 발생 한 후,
      Message Queue에 다른 처리할 Windows Message가 없을 때

그런데 WM_PAINT가 날아오기 '전'에 대부분 같이 따라오는 Message가 있습니다 WM_ERASEBKGND라는 것으로, Erase Background 라는 의미죠. 즉, 배경을 지워라.

Window의 기본 Message Procedure(DefWindowProc)는 사용자가 WM_ERASEBKGND를 받고도 아무 처리를 하지 않으면, WNDCLASS의 hbrBackground 맴버에 정의된 색상으로 배경을 지워버립니다. 깜빡이는 것은 아래 처럼 되기 때문에 발생하는 것이지요.

    1. WM_ERASEBKGND 받음
    2. 배경 지움
    3. WM_PAINT 받음
    4. Image 다시 그림

2까지가 '깜'이고 4까지 가면 '빡'이 됩니다. 깜빡 깜빡의 실체는 이것입니다.
손쉬운 처리는 WM_ERASEBKGND를 받았을 때, 배경을 안지우도록 하는 방법입니다. 보통 OnEraseBkgnd 정도의 이름을 갖게 되는 WM_ERASEBKGND Message Handler에서 0을 return 하면 됩니다.

    BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC)
    {
        return 0;
    }

깜빡 거리는 것이 WM_PAINT Message Handler에서 그려주는 어떤 것이 아니라, 또 다른 Window인 '자식' Control이라면, Window Styles 중에 WS_CLIPCHILDREN Style을 '부모' Window에 먹여서 자식 Control에 의해 가려지는 영역은 그리기 대상에서 아예 제외시켜버리는 것이 일반적인 해결책입니다.

출처 : 데브피아 ( 박재민(MAXIST) )

 

[windbg] kb 명령어

ecxr : 예외가 발생한 context로 변경

Kb : call stack 출력

ð  .ecxr을한 후 kb를 수행할 경우 예외가 발생하기까지의 call stack을 출력한다

~[스래드번호]s  : [스레드번호]로 컨텍스트 변경 (ex ~0s 0번째 스레드로 이동

ð  스레드로 이동 후 kb를 수행할 경우 예외 발생 이후의 call stack을 출력한다.