Programming Memory Error Magic Number

Programming/C,CPP,CS 2016. 9. 19. 09:54 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Programming Memory Error Magic Number


from: 

https://en.wikipedia.org/wiki/Magic_number_(programming)

http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations






Mainly Used Code


* 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory
* 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers
* 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory
* 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger
* 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files
* 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory
* 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory
* 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash.
* 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory
* 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory





CodeDescription
..FACADE"Facade", Used by a number of RTOSes
1BADB002"1 bad boot"Multiboot header magic number[16]
8BADF00D"Ate bad food", Indicates that an Apple iOS application has been terminated because a watchdog timeout occurred.[17]
A5A5A5A5Used in embedded development because the alternating bit pattern (1010 0101) creates an easily recognized pattern on oscilloscopes andlogic analyzers.
A5Used in FreeBSD's PHK malloc(3) for debugging when /etc/malloc.conf is symlinked to "-J" to initialize all newly allocated memory as this value is not a NULL pointer or ASCII NUL character. (It may be a play on Russian "опять", pronounced "a piat'" which is A5 read aloud, meaning "again")[citation needed]
ABABABABUsed by Microsoft's debug HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory.[18]
ABADBABE"A bad babe", Used by Apple as the "Boot Zero Block" magic number
ABBABABE"ABBA babe", used by Driver Parallel Lines memory heap.
ABADCAFE"A bad cafe", Used to initialize all unallocated memory (Mungwall, AmigaOS)
0DEFACED"Defaced", Required by Microsoft's Hyper-V hypervisor to be used by Linux guests as their "guest signature", after changing from original 0xB16B00B5 ("Big Boobs")
BAADF00D"Bad food", Used by Microsoft's debug HeapAlloc() to mark uninitialized allocated heap memory[18]
BAAAAAAD"Baaaaaad", Indicates that the Apple iOS log is a stackshot of the entire system, not a crash report[17]
BAD22222"Bad too repeatedly", Indicates that an Apple iOS VoIP application has been terminated because it resumed too frequently[17]
BADBADBADBAD"Bad bad bad bad"Burroughs large systems "uninitialized" memory (48-bit words)
BADC0FFEE0DDF00D"Bad coffee odd food", Used on IBM RS/6000 64-bit systems to indicate uninitialized CPU registers
BADDCAFE"Bad cafe", On Sun MicrosystemsSolaris, marks uninitialised kernel memory (KMEM_UNINITIALIZED_PATTERN)
BBADBEEF"Bad beef", Used in WebKit[clarification needed]
BEEFCACE"Beef cake", Used by Microsoft .NET as a magic number in resource files
C00010FF"Cool off", Indicates Apple iOS app was killed by the operating system in response to a thermal event[17]
CAFEBABE"Cafe babe", Used by Java for class files
CAFED00D"Cafe dude", Used by Java for their pack200 compression
CAFEFEED"Cafe feed", Used by Sun MicrosystemsSolaris debugging kernel to mark kmemfree() memory
CCCCCCCCUsed by Microsoft's C++ debugging runtime library and many DOS environments to mark uninitialized stack memory. CC resembles the opcode of the INT 3 debug breakpoint interrupt on x86 processors.
CDCDCDCDUsed by Microsoft's C/C++ debug malloc() function to mark uninitialized heap memory, usually returned from HeapAlloc()[18]
D15EA5E"Disease", Used as a flag to indicate regular boot on the Nintendo GameCube and Wii consoles
DDDDDDDDUsed by MicroQuill's SmartHeap and Microsoft's C/C++ debug free() function to mark freed heap memory[18]
DEAD10CC"Dead lock", Indicates that an Apple iOS application has been terminated because it held on to a system resource while running in the background[17]
DEADBABE"Dead babe", Used at the start of Silicon GraphicsIRIX arena files
DEADBEEF"Dead beef", Famously used on IBM systems such as the RS/6000, also used in the original Mac OS operating systemsOPENSTEP Enterprise, and the Commodore Amiga. On Sun MicrosystemsSolaris, marks freed kernel memory (KMEM_FREE_PATTERN)
DEADCAFE"Dead cafe", Used by Microsoft .NET as an error number in DLLs
DEADC0DE"Dead code", Used as a marker in OpenWRT firmware to signify the beginning of the to-be created jffs2 file system at the end of the static firmware
DEADFA11"Dead fail", Indicates that an Apple iOS application has been force quit by the user[17]
DEADF00D"Dead food", Used by Mungwall on the Commodore Amiga to mark allocated but uninitialized memory [19]
DEFEC8ED"Defecated", Used for OpenSolaris core dumps
EBEBEBEBFrom MicroQuill's SmartHeap
FADEDEAD"Fade dead", Comes at the end to identify every AppleScript script
FDFDFDFDUsed by Microsoft's C/C++ debug malloc() function to mark "no man's land" guard bytes before and after allocated heap memory[18]
FEE1DEAD"Feel dead", Used by Linux reboot() syscall
FEEDFACE"Feed face", Seen in PowerPC Mach-O binaries on Apple Inc.'s Mac OS X platform. On Sun MicrosystemsSolaris, marks the red zone (KMEM_REDZONE_PATTERN)

Used by VLC player and some IP cameras in RTP/RTCP protocol, VLC player sends four bytes in the order of the endianness of the system. Some IP cameras expecting that the player sends this magic number and do not start the stream if no magic number received.

FEEEFEEE"Fee fee", Used by Microsoft's debug HeapFree() to mark freed heap memory. Some nearby internal bookkeeping values may have the high word set to FEEE as well.[18]


'Programming > C,CPP,CS' 카테고리의 다른 글

OpenSSL x64 Build  (0) 2016.09.27
debug_crt_heap table  (0) 2016.09.19
openssl error LNK2019: 외부 기호 에러  (0) 2016.09.19
openssl AES encrypt (AES_ctr128_encrypt)  (0) 2016.09.19
openssl AES Mode : ECB, CBC, CFB, OFB, CTR  (0) 2016.09.05
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

openssl error LNK2019: 외부 기호 에러









#pragma comment(lib, "libeay32.lib")

#pragma comment(lib, "ssleay32.lib")




lib 파일 참조 추가

openssl AES encrypt (AES_ctr128_encrypt)

Programming/C,CPP,CS 2016. 9. 19. 08:50 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

openssl AES encrypt (AES_ctr128_encrypt)



Sample Class













AESCTR.cppAESCTR.h


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Grid control 2.27 DragAndDrop Error








가끔씩 Grid 컨트롤 내의 셀을 컨트롤 밖으로 드래그앤드랍을 하게 되면 에러가 발생한다.






EnableDragRowMode(FALSE);



으로 설정해주니





해당 에러가 발생하지 않는다.






MFC Modal and Modeless Dialog Boxes

Programming/MFC 2016. 9. 6. 10:56 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Modal and Modeless Dialog Boxes




You can use class CDialog to manage two kinds of dialog boxes:

  • Modal dialog boxes, which require the user to respond before continuing the program

  • Modeless dialog boxes, which stay on the screen and are available for use at any time but permit other user activities

The resource editing and procedures for creating a dialog template are the same for modal and modeless dialog boxes.

Creating a dialog box for your program requires the following steps:

  1. Use the dialog editor to design the dialog box and create its dialog-template resource.

  2. Create a dialog class.

  3. Connect the dialog resource's controls to message handlers in the dialog class.

  4. Add data members associated with the dialog box's controls and to specify dialog data exchange and dialog data validations for the controls.




생성되는 윈도우는 두가지 형태가 있다.
대화가 필요한 모달형과, 대화가 필요없는 모달리스

대화가 필요한 모달형은 대화를 마치지 않으면 다음으로 넘어갈 수 없는 윈도우다.
즉, 파일열기를 해서 파일목록이 나오고 파일을 선택하는 윈도우가 팝업되었을 때, 
그 윈도우창을 무시하고 그 전의 윈도우를 컨트롤 할 수 없도록 되어있다. (취소를 하시든가)
무조건 적으로 대화가 필요한 모달형에 비해,
대화가 필요없는 모달리스형이 있다.
모달리스형은 익스플로러를 하면서 Ctrl F키를 눌러서 찾기 기능을 사용할 때, 개념을 찾을 수 있는데, 
찾기 윈도우가 팝업되었지만, 기존의 익스플로러 윈도우에도 편하게 접근이 가능하다.
대화따위... 존재하지 않은지가 오랜지...


Modal Dialog

써먹을려면 CDialog 클래스의 일부함수를 재정의 해야 하는데, 
이렇게 가상함수들을 재정의할 때, 함수의 호출 시점을 꿰고있는게 좋을 것이다.

대화상자 객체를 주로 스택에 생성한다.

virtual BOOL CDialog::OnInitDialog();
호출 : CDialog::DoModal() 함수에 의해서 대화상자가 생성되고 WM_CREATE메시지가 발생하게 된다.
        OS는 이 메시지를 받고, Dialog 템플릿에 선언된 컨트롤을 모두 생성한 후 대화상자가 화면에 보이기전에
        WM_INITDIALOG 메시지를 발생시키는데, 이 때 OnInitDialog()함수가 호출된다.
        즉, OnInitDialog()함수는 WM_INITDIALOG메시지 핸들러라고 할 수 있다.
사용 : 컨트롤 초기화 및, 키보드 포커스 변경시 사용

virtual void CDialog::OnOk();
호출 : 사용자가 OK버튼을 누르면 호출된다. (id값이 IDOK인 버튼)
        즉, OnOk()함수는 OK버튼클릭 메시지 핸들러라고 할 수 있다.
사용 : 컨트롤 값을 읽거나 값의 타당성을 검사한 후 Dialog 닫기

virtual void CDialog::OnCancel();
호출 : 사용자가 Cancel버튼을 누르면 호출된다. (id값이 IDCANCEL인 버튼)
        즉, OnCancel()함수는 Cancel버튼클릭 메시지 핸들러라고 할 수 있다.
사용 : 대화상자 닫기.

위의 3가지 함수는 메시지핸들러의 기능을 하지만, 가상함수로 정의되어 있으므로 
굳이 메시지 맵이 필요없이 자동 호출된다.

생성은 CDialog::DoModal(), 닫을때는 CDialog::EndDialog()
OnOk()나 OnCancel()함수는 자동으로 EndDialog() 호출하므로,
만약 다른 방법으로 대화상자를 닫기 원할 때, CDialog::EndDialog() 호출하면 된다.



Modeless Dialog

주의사항. 모달형과 생성 및 닫는 함수가 다르다.
DoModal()대신 CDialog::Create()
EndDialog()대신 CWnd::DestroyWindow() 함수를 사용한다.
대화상자 객체를 힙에 생성한다.
(스택에 객체를 생성해버리면 변수선언영역을 벗어났을때 소멸자가 호출되어 대화상자가 소멸되므로
대화상자를 계속 유지할 수 없기 때문이다.)





'Programming > MFC' 카테고리의 다른 글

공유 DLL에서 MFC 사용 VS 정적 라이브러리에서 MFC 사용  (0) 2016.10.06
MFC Dialog Modal  (0) 2016.09.22
MFC Alert MessageBox2  (0) 2016.09.06
MFC Alert MessageBox  (0) 2016.09.06
MFC Drag And Drop FileName 만 추출  (0) 2016.08.30

MFC Alert MessageBox2

Programming/MFC 2016. 9. 6. 10:47 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

      int MessageBox(
   LPCTSTR lpszText,
   LPCTSTR lpszCaption = NULL,
   UINT nType = MB_OK 
);

lpszText

가리키는 있는 CString 개체 또는 표시 되는 메시지에 포함 된 null로 끝나는 문자열입니다.

lpszCaption

가리키는 있는 CString 개체 또는 null로 끝나는 문자열에 대 한 캡션을 메시지 상자를 사용할 수 있습니다. 경우 lpszCaption  NULL, 기본 캡션을 "오류"를 사용 합니다.

nType

콘텐츠 및 메시지 상자의 동작을 지정합니다.


전역 함수 사용 AfxMessageBox 응용 프로그램에서 메시지 상자를 구현 하려면이 멤버 함수를 대신 합니다.

다음은 메시지 상자에 사용할 수 있는 다양 한 시스템 아이콘입니다.

중지(x) 아이콘

MB_ICONHANDMB_ICONSTOP, 및 MB_ICONERROR

도움말(?) 아이콘

MB_ICONQUESTION

중요(!) 아이콘

MB_ICONEXCLAMATION 및 MB_ICONWARNING

정보(i) 아이콘

MB_ICONASTERISK 및 MB_ICONINFORMATION









void CMainFrame::OnDisplayErrorMessage()
{
   // This displays a message box with the title "Error"
   // and the message "Help, Something went wrong."
   // The error icon is displayed in the message box, along with
   // an OK button.
   MessageBox(_T("Help, Something went wrong."), _T("Error"), 
      MB_ICONERROR | MB_OK);
}




'Programming > MFC' 카테고리의 다른 글

MFC Dialog Modal  (0) 2016.09.22
MFC Modal and Modeless Dialog Boxes  (0) 2016.09.06
MFC Alert MessageBox  (0) 2016.09.06
MFC Drag And Drop FileName 만 추출  (0) 2016.08.30
MFC File Icon Drag and Drop  (0) 2016.08.30

MFC Alert MessageBox

Programming/MFC 2016. 9. 6. 10:40 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

MFC Alert MessageBox


MessageBox 클래스

.NET Framework (current version)
 

사용자에게 메시지를 보여 주는 메시지 창을 표시합니다. 이 창을 대화 상자라고도 합니다. 이 창은 사용자가 닫을 때까지 응용 프로그램의 다른 동작을 차단하는 모달 창입니다. MessageBox에는 사용자에게 필요한 정보와 명령을 제공하는 텍스트, 단추 및 기호가 포함될 수 있습니다.

네임스페이스:   System.Windows.Forms
어셈블리:  System.Windows.Forms.dll의 System.Windows.Forms




private:
   void validateUserEntry()
   {
      // Checks the value of the text.
      if ( serverName->Text->Length == 0 )
      {
         // Initializes the variables to pass to the MessageBox::Show method.
         String^ message = "You did not enter a server name. Cancel this operation?";
         String^ caption = "No Server Name Specified";
         MessageBoxButtons buttons = MessageBoxButtons::YesNo;
         System::Windows::Forms::DialogResult result;

         // Displays the MessageBox.
         result = MessageBox::Show( this, message, caption, buttons );
         if ( result == ::DialogResult::Yes )
         {
            // Closes the parent form.
            this->Close();
         }
      }
   }



private:
   void Form1_FormClosing(Object^ sender, FormClosingEventArgs^ e)
   {
	  // If the no button was pressed ...
      if ((MessageBox::Show(
         "Are you sure that you would like to close the form?", 
         "Form Closing", MessageBoxButtons::YesNo, 
         MessageBoxIcon::Question) == DialogResult::No))
      {
		 // cancel the closure of the form.
         e->Cancel = true;
      }
   }



'Programming > MFC' 카테고리의 다른 글

MFC Modal and Modeless Dialog Boxes  (0) 2016.09.06
MFC Alert MessageBox2  (0) 2016.09.06
MFC Drag And Drop FileName 만 추출  (0) 2016.08.30
MFC File Icon Drag and Drop  (0) 2016.08.30
MFC Dialog 가 이상한 위치에 배치, (0,0)에 배치  (0) 2016.08.24
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

openssl AES Mode : ECB,CBC,CFB,OFB,CTR


Source : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Z2do&articleno=2




블록 암호화에서의 운영 모드 
이미지의 출처는 위키피디아 입니다. (http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation)

1. ECB (Electronic Code Block) Mode
- 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조이다.
- 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. (Brute-Force Arttack, Dictionary Attack)
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding을 해야한다.


- error propagation : 각 블록이 독립적으로 동작하므로 한블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다. 해당 블록까지 에러 전파.


2. CBC(Cipher Block Chaining) Mode
- 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용된다.
- 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용된다. 이 때, IV는 제 2의 키가 될수 있다.
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 Padding을 해야만 한다.
암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다. (단점이죵~)


- error propagation : 깨진 암호문의 해당블록과 다음블록의 평문까지 영향을 미치게 됩니다. 두번째 복호화 그림을 보고 Ciphertext가 깨졌을 때를 생각해보시면 이해가 되실꺼에요~


3. CFB(Cipher FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다(패딩이 필요 없다)
- 최초의 키생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있다.
스트림의 기본단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 CFB8~CFB128로 쓰인다.
암호화, 복호화 모두 암호화로만 처리할 수 있다.
- CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있다. 


- error propagation : CBC모드와 마찬가지로 한 암호문블럭의 에러는 해당평문블록과 다음 평문블록, 이렇게 총 2개의 블록에 전파된다.


4. OFB(Output FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다.(패딩이 필요없다)
- 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나온다. (복호화시에 암호화)
- 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있다.
스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰인다.


- error propagation : 해당블록까지만~ 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitized analog신호에 많이 사용된다.


5. CTR (CounTeR) Mode
- 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키스트림을 만든다. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 된다.
- CTR모드는 OFB와 같은 스트림 암호의 일종이다.
- CTR모드의 암복호화는 완전히 같은 구조가 되므로 구현이 간단하다.(OFB와 같은 스트림 암호의 특징)
- CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수있다.(비표와 블록번호로부터 카운터를 구할 수 있기때문에)
- 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미한다.(병렬처리 가능)


- error propagation : 각 블록이 병렬처리 되므로 같은 블록내에서만 이루어짐.

표준 대칭키 알고리즘의 종류

알고리즘

특징

소유국가

DES

64bit block

56bit key

미국

Triple DES

64bit block

112~168bit key

미국

BlowFish

64bit block

128bit key

미국

RC2

64bit block

128bit key

미국

RC4

Stream Cipher

미국

AES

128bit block

128~256 bit key

벨기에

SEED

128bit block

128bit key

한국

ARIA

128bit block

128~256bit key

한국



*Stream Cipher : 키의 길이가 유동적이며, 키의 길이가 길수록 안전성이 뛰어남.





Source : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Z2do&articleno=2



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

CPP aes128 cbc mode Encryption Decryption



AES


Encryption Block  : 

128 비트

192 비트 

256 비트


Mode :    

1. ECB ( Electric Code Book )

http://jo.centis1504.net/wp-content/uploads/2010/11/Encryption-ECB_MODE.swf




2. CBC ( Cipher Block Chaining )

http://jo.centis1504.net/wp-content/uploads/2010/11/Encryption-CBC_MODE.swf





3. OFB ( Output Feed Back )

http://jo.centis1504.net/wp-content/uploads/2010/11/Encryption-OFB_MODE.swf



4. CFB ( Cipher Feed Back )



5. CTR ( CounTeR )



모드별 설명은


관련 자료 참고 : http://www.parkjonghyuk.net/lecture/modernCrypto/lecturenote/chap04.pdf




구현에서는 CTR 모드로 구현하였다.






개발 환경 : Windows 7 64bit, VS 2013



최신버전으로 직접 빌드하시려면 아래의 링크를 참조하시기 바랍니다.


귀찮으신 분은 빌드된 버전을 사용합시다.


OpenSSL 빌드 : http://yokkohama.tistory.com/entry/OpenSSL-%EB%B9%8C%EB%93%9C%ED%95%98%EA%B8%B0-Visual-Studio-2010-%EB%98%90%EB%8A%94-libeay32dll-ssleay32dll-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C



"openssl-1.0.1f_vc_no-idea no-mdc2 no-rc5_build.zip" 는 no-idea no-mdc2 no-rc5  로 빌드된, 특허문제가 해결 된 바이너리입니다.


openssl-1.0.1f_vc_no-idea no-mdc2 no-rc5_build.zip



압축 해제 후 파일을 프로젝트 폴더로 이동



프로젝트속성 > VC++ 디렉터리 > 디렉터리 설정 (포함 디렉터리, 라이브러리 디렉터리)






별도의 클래스를 만들어 사용 하였습니다.







#pragma once

#include 
#include 
#include 
#include 


struct ctr_state {
	unsigned char ivec[AES_BLOCK_SIZE];
	unsigned int num;
	unsigned char ecount[AES_BLOCK_SIZE];
};



class CAESCTR
{
public:
	AES_KEY key;
	int BYTES_SIZE = 1024;
	int KEY_SIZE = 128;
	unsigned char ckey[32];
	unsigned char iv[8];
	int init_ctr(struct ctr_state *state, const unsigned char iv[8]);
	void encrypt(unsigned char *indata, unsigned char *outdata, int bytes_read);
	void encrypt(CString& indata, CString& outdata, int bytes_read);
	CAESCTR();
	CAESCTR::CAESCTR(unsigned char* iv, unsigned char* ckey);
	~CAESCTR();
};







#include "stdafx.h"
#include "AESCTR.h"

int CAESCTR::init_ctr(struct ctr_state *state, const unsigned char iv[8]){
	state->num = 0;
	memset(state->ecount, 0, AES_BLOCK_SIZE);
	memset(state->ivec + 8, 0, 8);
	memcpy(state->ivec, iv, 8);

	return 0;
}
// encrypt twice  == decrypt

void CAESCTR::encrypt(unsigned char *indata, unsigned char *outdata, int bytes_read){

	int i = 0;
	int mod_len = 0;

	AES_set_encrypt_key(ckey, KEY_SIZE, &key);

	if (bytes_read < BYTES_SIZE){
		struct ctr_state state;
		init_ctr(&state, iv);
		AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);
		return;
	}
	// loop block size  = [ BYTES_SIZE ]
	for (i = BYTES_SIZE; i <= bytes_read; i += BYTES_SIZE){
		struct ctr_state state;
		init_ctr(&state, iv);
		AES_ctr128_encrypt(indata, outdata, BYTES_SIZE, &key, state.ivec, state.ecount, &state.num);
		indata += BYTES_SIZE;
		outdata += BYTES_SIZE;
	}

	mod_len = bytes_read % BYTES_SIZE;
	if (mod_len != 0){
		struct ctr_state state;
		init_ctr(&state, iv);
		AES_ctr128_encrypt(indata, outdata, mod_len, &key, state.ivec, state.ecount, &state.num);
	}
}

void CAESCTR::encrypt(CString& instr, CString& outstr, int bytes_read){

	int i = 0;
	int mod_len = 0;
	unsigned char *indata;
	unsigned char *outdata;

	indata = (unsigned char *)malloc(instr.GetLength() + 1);
	outdata = (unsigned char *)malloc(instr.GetLength() + 1);



	strncpy((char*)indata, (LPSTR)(LPCSTR)instr, instr.GetLength());
	indata[instr.GetLength()] = NULL;


	

	AES_set_encrypt_key(ckey, KEY_SIZE, &key);

	if (bytes_read < BYTES_SIZE){
		struct ctr_state state;
		init_ctr(&state, iv);
		AES_ctr128_encrypt(indata, outdata, bytes_read, &key, state.ivec, state.ecount, &state.num);

		outdata[instr.GetLength()] = NULL;
		outstr = outdata;
		return;
	}
	// loop block size  = [ BYTES_SIZE ]
	for (i = BYTES_SIZE; i <= bytes_read; i += BYTES_SIZE){
		struct ctr_state state;
		init_ctr(&state, iv);
		AES_ctr128_encrypt(indata, outdata, BYTES_SIZE, &key, state.ivec, state.ecount, &state.num);
		indata += BYTES_SIZE;
		outdata += BYTES_SIZE;
	}

	mod_len = bytes_read % BYTES_SIZE;
	if (mod_len != 0){
		struct ctr_state state;
		init_ctr(&state, iv);
		AES_ctr128_encrypt(indata, outdata, mod_len, &key, state.ivec, state.ecount, &state.num);
	}
	outdata[instr.GetLength()] = NULL;
	outstr = outdata;
}

CAESCTR::CAESCTR()
{
	unsigned char temp_iv[8] = { 0x66, 0x61, 0x63, 0x65, 0x73, 0x65, 0x61, 0x00 };
	memcpy(iv, temp_iv, 8);

	unsigned char temp_ckey[32] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0,
		0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12,
		0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34,
		0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56 }; // 32bytes = AES256, 16bytes = AES128
	memcpy(ckey, temp_ckey, 32);
}

CAESCTR::CAESCTR(unsigned char* iv, unsigned char* ckey)
{
	memcpy(this->iv, iv, 8);
	memcpy(this->ckey, ckey, 32);
}

CAESCTR::~CAESCTR()
{
}






그리고, 프로젝트 속성에서


구성 속성 > 문자 집합 > 설정 안 함


으로 하여서 사용하였습니다.



사용예시










void CPasswordEncoderDlg::OnEnChangeEdit1()
{
	// TODO:  RICHEDIT 컨트롤인 경우, 이 컨트롤은
	// CDialogEx::OnInitDialog() 함수를 재지정 
	//하고 마스크에 OR 연산하여 설정된 ENM_CHANGE 플래그를 지정하여 CRichEditCtrl().SetEventMask()를 호출하지 않으면
	// 이 알림 메시지를 보내지 않습니다.

	// TODO:  여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CAESCTR m_AESCTR;

	CString editText;
	m_Edit1.GetWindowTextA(editText);
		
	int editTextLength = editText.GetLength();

	unsigned char* editTextCharSeq;
	editTextCharSeq = (unsigned char *)malloc(editTextLength+1);

	strncpy((char*)editTextCharSeq, (LPSTR)(LPCSTR)editText, editTextLength);
	editTextCharSeq[editTextLength] = NULL;

	unsigned char* outTextCharSeq;
	outTextCharSeq = (unsigned char *)malloc(editTextLength + 1);

	m_AESCTR.encrypt(editTextCharSeq, outTextCharSeq, editTextLength);
	outTextCharSeq[editTextLength] = NULL;
	
	editText = outTextCharSeq;
	m_Edit2.SetWindowTextA(editText);
	
	m_AESCTR.encrypt(editText, editText, editTextLength);

	m_Edit3.SetWindowTextA(editText);

	free(editTextCharSeq);
	free(outTextCharSeq);
}










'Programming > C,CPP,CS' 카테고리의 다른 글

openssl AES encrypt (AES_ctr128_encrypt)  (0) 2016.09.19
openssl AES Mode : ECB, CBC, CFB, OFB, CTR  (0) 2016.09.05
CDateTimeCtrl 사용법  (0) 2016.08.25
Apache License, Version 2.0  (0) 2016.08.22
Log4cxx ChainSaw Appender  (0) 2016.08.22

MFC Drag And Drop FileName 만 추출

Programming/MFC 2016. 8. 30. 11:38 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


MFC Drag And Drop FileName 만 추출


	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	int nFiles;


	char szPathName[MAX_PATH];  // 파일 경로명이 들어간다.
	
	// 드래그앤드롭된 파일의 갯수
	nFiles = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH);







	for (int i = 0; i < nFiles; i++)
	{
		// 파일의 경로 얻어옴
		::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);
		MessageBox(szPathName, "DropAndDropFile");
		char* szFileName = szPathName;
		// FileName 만을 찾기위한 반복문
		for (int j = 0; j < strlen(szPathName); j++)
		{
			if (szPathName[j] == '\\')
			{
				szFileName = szPathName + j + 1;
			}
		}
		m_ListCtrl.AddString(szFileName);
		m_ListCtrl.SetHorizontalExtent(2600);
	}

'Programming > MFC' 카테고리의 다른 글

MFC Alert MessageBox2  (0) 2016.09.06
MFC Alert MessageBox  (0) 2016.09.06
MFC File Icon Drag and Drop  (0) 2016.08.30
MFC Dialog 가 이상한 위치에 배치, (0,0)에 배치  (0) 2016.08.24
MFC CTextProgressCtrl  (0) 2016.08.17