pywin32/win32crypt에 해당하는 글 3

3. [pywin32] CryptUnprotectData 함수

pywin32/win32crypt|2020. 8. 9. 23:29

(str, bytes) = CryptUnprotectData(DataIn, OptionalEntropy , Reserved , PromptStruct , Flags )

 

CryptUnprotectData로 암호화된 데이터를 복호화하는 함수입니다.

 

인자로는 DataIn : bytes, OptionalEntropy=None : bytes, Reserved=None : None, PromptStruct=None : PyCRYPTPROTECT_PROMPTSTRUCT, Flags=0 : int가 있습니다.

 

DataIn은 CryptProtectData 함수로 암호화 데이터입니다.

 

OptionalEntropy는 데이터 암호화를 더 복잡하게 만든 값으로 CryptProtectData와 같은 값으로 하셔야 합니다.

 

Reserved는 지금은 쓰지 않지만 언제가 사용할 때를 대비한 인자로써 반드시 none이어야 합니다.

 

PromptStruct는 UI를 위한 옵션으로 PyCRPYTPROTECT_PROMPTSTRUCT 구조체를 사용합니다.

* PyCRPYTPROTECT_PROMPTSTRUCT 은 3개의 자료를 갖는 튜플형 변수입니다.

[0] int : flags

 - CRYPTPROTECT_PROMPT_PROTECT = 0x1

 - CRYPTPROTECT_PROMPT_UNPROTECT = 0x2

 - 위 2개의 인자값의 컴비네이션을 플래그로 갖습니다. 근데 제가 아무리 써봐도 무슨 차이가 있는지 모르겠습니다;;

 

[1] int : hwndApp

 - 부모 프로세스의 핸들로 0으로 두시면 됩니다.

 

[2] PyUnicode : prompt

  - UI 프롬프트 창의 이름입니다. None으로 두셔도 상관없습니다.

 

Flags는 암호화 옵션입니다.

 

Flags 설명
CRYPTPROTECT_UI_FORBIDDEN = 0x1 PromptStruct를 통해 UI 창을 호출할 수 있었는데 이 Flag가 활성화되있으면, PromptStruct 설정 시 에러가 발생합니다.(UI 금지)
CRYPTPROTECT_VERIFY_PROTECTION = 0x40 복호화시 보호 레벨이 암호화시의 보호 레벨보다 낮으면 재암호화를 요구한다고 합니다. 아마 제 생각에는 윈도우 버전별로 암복호화 알고리즘이 다른데 그 때 사용하는 게 아닌가 합니다.

CryptProtectData 함수와 Flags 가 차이가 나는데, CRYPTPROTECT_LOCAL_MACHINE, CRYPTPROTECT_AUDIT 같은 경우 CryptProtectData 함수 사용 시 설정되어 있었으면 CryptUnprotectData 함수 시 자동으로 설정되기 때문입니다.

 

import win32crypt

promptStruct = (0x1, 0, "hello")

eData = b'\x01\x00\x00\x00\xd0\x8c\x9d\xdf\x01\x15\xd1\x11\x8cz\x00\xc0O\xc2\x97\
\xeb\x01\x00\x00\x00\x01\x90\x01\xe7\xb1\x06+G\xb5\xe9\xba`l|\xe1}\x13\x00\x00\x00\
\x18\x00\x00\x00d\x00e\x00s\x00c\x00r\x00i\x00p\x00t\x00i\x00o\x00n\x00\x00\x00\x10f\
\x00\x00\x00\x01\x00\x00 \x00\x00\x00\x07\xceeu\nZ\xe8\xc3e\x1eW\x10\x7f\xa14\x8c\xcc\
\x87G\x05UM\xbb=\xcal\xb7\xb2\x17\t\x14S\x00\x00\x00\x00\x0e\x80\x00\x00\x00\x02\x00\
\x00 \x00\x00\x00\xdav\xd2\xa4\xea\xae\xb6\xa6\xd9\xaf\x91Rbi\xf7q\x91\xb3\xa3\x9d\xeeS\
\x99!\xac8\xbeoHw\xfa_\x10\x00\x00\x008)7I\xfb\x96\xbb\xf6\x94\xdcJQ\x90\xaf\x15\x9b@\
\x00\x00\x00\xdc\xebbD\x80\x0b\x95\xc3\x13\xd1\xa8\x8d\x0fL~\x17\xf9\xbf\xc5dd\x94@g\
\x83>\x82\x13`\xc6i\xac\xb7\xcf\xfc\xc0\x19=)\xab\xf6P\xaf\x83\x184#g\xe8\x8d\x93\x89\
\xd1B\xc6\x02\x9b\x9f.@b\xfc\xd7\x8d'
#CryptProtectData 시 암호화된 데이터

dData = win32crypt.CryptUnprotectData(eData, None, None, promptStruct, 0)
print(f"{dData}")

위 코드를 실행한 결과

 

CryptProtectData 함수 사용 시의 DataDescr와 DataIn 이 복호화되었습니다~

 

그리고 CryptProtectData 함수 사용 시 설정한 CRYPTPROTECT_AUDIT 플래그 때문에 복호화 시에도 이벤트 로그가 생겼습니다~

반응형

'pywin32 > win32crypt' 카테고리의 다른 글

2. [pywin32] CryptProtectData 함수  (0) 2020.08.09
1. [pywin32] win32crypt 소개  (0) 2020.08.09

댓글()

2. [pywin32] CryptProtectData 함수

pywin32/win32crypt|2020. 8. 9. 23:28

bytes = CryptProtectData(DataIn, DataDescr , OptionalEntropy , Reserved , PromptStruct , Flags )

 

데이터를 암호화 해주는 함수입니다. 암호화 과정 중 사용자의 정보를 이용하기 때문에 다른 사용자가 복호화를 하지 못합니다.

 

인자로는 DataIn : bytes, DataDescr=None : PyUnicode,OptionalEntropy=None : bytes, Reserved=None : None, PromptStruct=None : PyCRYPTPROTECT_PROMPTSTRUCT, Flags=0 : int 가 있습니다.

 

DataIn은 암호화 대상 데이터입니다.

 

DataDescr는 데이터에 대한 설명으로 DataIn에 합쳐져서 암호화가 됩니다. 기본값은 None입니다.

 

OptionalEntropy는 데이터 암호화를 더 복잡하게 만드는 값으로 패스워드로 보셔도 됩니다. 기본값은 None입니다.

 

Reserved는 지금은 쓰지 않지만 언제가 사용할 때를 대비한 인자로써 반드시 None이여야 합니다.

 

PromptStruct는 UI를 위한 옵션으로 PyCRPYTPROTECT_PROMPTSTRUCT 구조체를 사용합니다.

* PyCRPYTPROTECT_PROMPTSTRUCT 은 3개의 자료를 갖는 튜플형 변수입니다.

[0] int : flags

 - CRYPTPROTECT_PROMPT_PROTECT = 0x1

 - CRYPTPROTECT_PROMPT_UNPROTECT = 0x2

 - 위 2개의 인자값의 컴비네이션을 플래그로 갖습니다. 근데 제가 아무리 써봐도 무슨 차이가 있는지 모르겠습니다;;

 

[1] int : hwndApp

 - 부모 프로세스의 핸들로 0으로 두시면 됩니다.

 

[2] PyUnicode : prompt

  - UI 프롬프트 창의 이름입니다. None으로 두셔도 상관없습니다.

 

Flags는 암호화 옵션입니다.

Flags 설명
CRYPTPROTECT_LOCAL_MACHINE = 0x4 위에서 CryptProtectData는 사용자의 정보로 암호화를 하기 때문에 다른 사용자가 복호화를 하지 못한다고 했습니다. 이 Flag를 적용하면, 사용자의 정보가 아니라 컴퓨터의 정보를 이용하기 때문에 다른 사용자로 로그인해도 복호화가 가능합니다.
CRYPTPROTECT_UI_FORBIDDEN = 0x1 PromptStruct를 통해 UI 창을 호출할 수 있었는데 이 Flag가 활성화되있으면, PromptStruct 설정 시 에러가 발생합니다.(UI 금지)
CRYPTPROTECT_AUDIT = 0x10 암복호화 시 감사 로그를 발생시키게 합니다. 근데 이건 감사로그 정책 설정이 필요합니다. 밑에서 설명하겠습니다.

* 암복호화시 감사 로그를 남기기 위한 설정입니다.

저 같은 경우에는 gpedit.msc를 통해서 설정했습니다.

위 이미지의 경로에서 DPAPI 작업 감사를 성공 및 실패로 변경하면 됩니다.

 

import win32crypt

promptStruct = (0x1, 0, "hello")

eData = win32crypt.CryptProtectData(b"text", "description", None, None, promptStruct, 0x10)
# 감사 로그 남김
print(f"{eData}")

위의 프롬프트 창이 뜨고

 

암호화 결과가 출력됩니다.

 

이벤트 로그의 보안 로그를 보면 감사 로그도 남겨져 있습니다.

반응형

'pywin32 > win32crypt' 카테고리의 다른 글

3. [pywin32] CryptUnprotectData 함수  (0) 2020.08.09
1. [pywin32] win32crypt 소개  (0) 2020.08.09

댓글()

1. [pywin32] win32crypt 소개

pywin32/win32crypt|2020. 8. 9. 23:28

암호화 관련 win32api에 대해서 설명합니다.

 

다음의 2가지 함수를 제공합니다.

 

  1. CryptProtectData
  2. CryptUnprotectData

 

[pywin32/win32crypt] - 2. [pywin32] CryptProtectData 함수

 

2. [pywin32] CryptProtectData 함수

bytes = CryptProtectData(DataIn, DataDescr , OptionalEntropy , Reserved , PromptStruct , Flags ) 데이터를 암호화 해주는 함수입니다. 암호화 과정 중 사용자의 정보를 이용하기 때문에 다른 사용자가 복호..

ssjune.tistory.com

[pywin32/win32crypt] - 3. [pywin32] CryptUnprotectData 함수

 

3. [pywin32] CryptUnprotectData 함수

(str, bytes) = CryptUnprotectData(DataIn, OptionalEntropy , Reserved , PromptStruct , Flags ) CryptUnprotectData로 암호화된 데이터를 복호화하는 함수입니다. 인자로는 DataIn : bytes, OptionalEntropy=N..

ssjune.tistory.com

 

반응형

'pywin32 > win32crypt' 카테고리의 다른 글

3. [pywin32] CryptUnprotectData 함수  (0) 2020.08.09
2. [pywin32] CryptProtectData 함수  (0) 2020.08.09

댓글()