3. [pywin32] CryptUnprotectData 함수
(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 |