Code : Tout sélectionner
Global $CRYPTPROTECT_LOCAL_MACHINE = 0x4
Global $CRYPTPROTECT_UI_FORBIDDEN = 0x0001
Global $CRYPTPROTECT_AUDIT = 0x10
Global $CRYPTPROTECT_VERIFY_PROTECTION = 0x40
Func _Crypt_ProtectData($bData, $sEntropy = "", $iFlags = 0)
; ---
; Data
Local $iDataLen = BinaryLen($bData)
Local $in_DATA = DllStructCreate("byte[" & $iDataLen & "]")
DllStructSetData($in_DATA, 1, $bData)
Local $in_DATA_BLOB = DllStructCreate("dword; ptr")
DllStructSetData($in_DATA_BLOB, 1, $iDataLen)
DllStructSetData($in_DATA_BLOB, 2, DllStructGetPtr($in_DATA, 1))
; ---
; Description string
;~ Local $description_DATA = 0
;~ If StringLen($sDescription) Then
;~ $description_DATA = DllStructCreate("wstr[" & StringLen($sDescription) + 1 & "]")
;~ DllStructSetData($description_DATA, 1, $sDescription)
;~ DllStructSetData($description_DATA, 1, 0, StringLen($sDescription))
;~ EndIf
; ---
; Additionnal entropy
Local $entropy_DATA_BLOB = 0
If $sEntropy Then
Local $iEntropyLen = BinaryLen($sEntropy)
Local $entropy_DATA = DllStructCreate("byte[" & $iEntropyLen & "]")
DllStructSetData($entropy_DATA, 1, $sEntropy)
$entropy_DATA_BLOB = DllStructCreate("dword; byte[" & $iEntropyLen & "]")
DllStructSetData($entropy_DATA_BLOB, 1, $iEntropyLen)
DllStructSetData($entropy_DATA_BLOB, 2, DllStructGetPtr($entropy_DATA, 1))
EndIf
; ---
; Out Data structure
Local $out_DATA_BLOB = DllStructCreate("dword; ptr")
; ---
Local $ret = DllCall("Crypt32.dll", "bool", "CryptProtectData", _
"ptr", DllStructGetPtr($in_DATA_BLOB), _
"ptr", 0, _ ; DllStructGetPtr($description_DATA, 1), _
"ptr", DllStructGetPtr($entropy_DATA_BLOB), _
"ptr", 0, _
"ptr", 0, _
"int", $iFlags, _
"ptr", DllStructGetPtr($out_DATA_BLOB) _
)
If @error Then
Local $err = @error
If Not @Compiled Then ConsoleWrite("! DllCall error " & $err & " (CryptProtectData)" & @CRLF)
Return SetError($err, 0, 0)
EndIf
; ---
; Extract encrypted data
Local $out_data = DllStructCreate("byte[" & DllStructGetData($out_DATA_BLOB, 1) & "]", DllStructGetData($out_DATA_BLOB, 2))
$out_data = DllStructGetData($out_data, 1)
DllCall("Kernel32.dll", "handle", "LocalFree", "handle", DllStructGetData($out_DATA_BLOB, 2))
; ---
Return SetError(0, 0, $out_data)
EndFunc
Func _Crypt_UnprotectData($bData, $sEntropy = "", $iFlags = 0)
; ---
; Data
Local $iDataLen = BinaryLen($bData)
Local $in_DATA = DllStructCreate("byte[" & $iDataLen & "]")
DllStructSetData($in_DATA, 1, $bData)
Local $in_DATA_BLOB = DllStructCreate("dword; ptr")
DllStructSetData($in_DATA_BLOB, 1, $iDataLen)
DllStructSetData($in_DATA_BLOB, 2, DllStructGetPtr($in_DATA, 1))
; ---
; Description
;~ Local $description_DATA = DllStructCreate("ptr")
; ---
; Additionnal entropy
Local $entropy_DATA_BLOB = 0
If $sEntropy Then
Local $iEntropyLen = BinaryLen($sEntropy)
Local $entropy_DATA = DllStructCreate("byte[" & $iEntropyLen & "]")
DllStructSetData($entropy_DATA, 1, $sEntropy)
$entropy_DATA_BLOB = DllStructCreate("dword; byte[" & $iEntropyLen & "]")
DllStructSetData($entropy_DATA_BLOB, 1, $iEntropyLen)
DllStructSetData($entropy_DATA_BLOB, 2, DllStructGetPtr($entropy_DATA, 1))
EndIf
; ---
; Out Data structure
Local $out_DATA_BLOB = DllStructCreate("dword; ptr")
; ---
Local $ret = DllCall("Crypt32.dll", "bool", "CryptUnprotectData", _
"ptr", DllStructGetPtr($in_DATA_BLOB), _
"ptr", 0, _ ;DllStructGetPtr($description_DATA), _
"ptr", DllStructGetPtr($entropy_DATA_BLOB), _
"ptr", 0, _
"ptr", 0, _
"int", $iFlags, _
"ptr", DllStructGetPtr($out_DATA_BLOB) _
)
If @error Then
Local $err = @error
If Not @Compiled Then ConsoleWrite("! DllCall error " & $err & " (CryptUnprotectData)" & @CRLF)
Return SetError($err, 0, 0)
EndIf
; ---
; Extract encrypted data
Local $out_data = DllStructCreate("byte[" & DllStructGetData($out_DATA_BLOB, 1) & "]", DllStructGetData($out_DATA_BLOB, 2))
$out_data = DllStructGetData($out_data, 1)
DllCall("Kernel32.dll", "handle", "LocalFree", "handle", DllStructGetData($out_DATA_BLOB, 2))
; ---
; Extract description
;~ Local $out_descr = DllStructCreate("wstr[" & 128 * 1024 & "]", DllStructGetData($description_DATA, 1))
;~ $out_descr = DllStructGetData($out_descr, 1)
;~ DllCall("Kernel32.dll", "handle", "LocalFree", "handle", DllStructGetData($description_DATA, 1))
; ---
;~ Local $aRet[2] = [$out_data, $out_descr]
Return $out_data
;~ Return $aRet
EndFunc
Local $encrypted = _Crypt_ProtectData(StringToBinary("Salut la compagnie!"), "matwachich")
Local $err = @error
ConsoleWrite("_Crypt_ProtectData: " & BinaryLen($encrypted) & " (@error = " & $err & ")" & @CRLF)
Local $decrypted = _Crypt_UnprotectData($encrypted, "matwachich", 0)
Local $err = @error
ConsoleWrite("_Crypt_UnprotectData: " & BinaryToString($decrypted) & " (@error = " & $err & ")" & @CRLF)
;~ ConsoleWrite("_Crypt_UnprotectData: " & BinaryToString($decrypted[0]) & " (Description: " & $decrypted[1] & ") (@error = " & $err & ")" & @CRLF)