#NoEnv
SetBatchLines, -1
password := "password"
iv := "ку-ку"
string = Строку возвращает, а что с ней потом делать, не пойму.
encstring := CryptString(string, password, iv)
MsgBox % encstring := String2BASE64(encstring, 1)
deccstring := CryptString(encstring, password, iv, false)
MsgBox % deccstring
String2BASE64(str, NOCRLF)
{
Return CryptBinaryToStringBASE64(&str, StrLen(str) * (A_IsUnicode ? 2 : 1), NOCRLF)
}
BASE642String(StringBASE64)
{
size := StringBase64ToData(StringBase64, Data)
Return StrGet(&Data, size >> !!A_IsUnicode, A_IsUnicode ? "UTF-16" : "cp0")
}
CryptBinaryToStringBASE64(pData, Bytes, NOCRLF = "")
{
static CRYPT_STRING_BASE64 := 1, CRYPT_STRING_NOCRLF := 0x40000000
Crypt := CRYPT_STRING_BASE64 | (NOCRLF ? CRYPT_STRING_NOCRLF : 0)
DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, Crypt, Ptr, 0, UIntP, Chars)
VarSetCapacity(OutData, Chars * (A_IsUnicode ? 2 : 1))
DllCall("Crypt32.dll\CryptBinaryToString", Ptr, pData, UInt, Bytes, UInt, Crypt, Str, OutData, UIntP, Chars)
Return OutData
}
StringBase64ToData(StringBase64, ByRef OutData)
{
static CRYPT := CRYPT_STRING_BASE64 := 1
DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
, UInt, StrLen(StringBase64), UInt, CRYPT, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)
VarSetCapacity(OutData, Bytes)
DllCall("Crypt32.dll\CryptStringToBinary", Ptr, &StringBase64
, UInt, StrLen(StringBase64), UInt, CRYPT, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
Return Bytes
}
CryptString(string, password, iv := "", crypt := true, algorithm := "AES", textEncoding := "UTF-8") {
; crypt: true — encrypt, false — decrypt
If crypt
lenInData := StrPutBuff(string, inData, textEncoding)
Else
lenInData := StringBase64ToData(string, inData)
hLib := DllCall("LoadLibrary", "Str", "Bcrypt.dll", "Ptr")
lenPasswordData := StrPutBuff(password, passwordData, textEncoding)
lenHashPassword := CreateHash(&passwordData, lenPasswordData, hashPassword)
pHashIv := lenIv := 0
if (iv != "") {
lenIvData := StrPutBuff(iv, ivData, textEncoding)
lenHashIv := CreateHash(&ivData, lenIvData, hashIv)
VarSetCapacity(iv16, 16, 0)
DllCall("RtlMoveMemory", "Ptr", pHashIv := &iv16, "Ptr", &hashIv + lenHashIv - 16, "Ptr", lenIv := 16)
}
crypt := (crypt ? "En" : "De") . "crypt"
lenOutData := Bcrypt(&inData, lenInData, outData, &hashPassword, lenHashPassword, pHashIv, lenIv, algorithm, crypt)
DllCall("FreeLibrary", "Ptr", hLib)
Return StrGet(&outData, lenOutData, textEncoding)
}
Bcrypt(pData, dataSize, ByRef outData, pKey, keySize, pIv := 0, ivSize := 0, AlgId := "AES", crypt := "Decrypt", chainingMode := "ChainingModeCBC") {
; crypt: Encrypt/Decrypt
static padding := BCRYPT_BLOCK_PADDING := 1, chainingModeSize := StrLen(chainingMode)*2
pLocalIv := 0
if pIv {
VarSetCapacity(localIv, ivSize, 0)
DllCall("RtlMoveMemory", "Ptr", pLocalIv := &localIv, "Ptr", pIv, "Ptr", ivSize)
}
DllCall("Bcrypt\BCryptOpenAlgorithmProvider", "PtrP", hAlgorithm, "WStr", AlgId, "Ptr", 0, "UInt", 0)
DllCall("Bcrypt\BCryptSetProperty", "Ptr", hAlgorithm, "WStr", "ChainingMode"
, "WStr", chainingMode, "UInt", chainingModeSize, "UInt", 0)
DllCall("Bcrypt\BCryptGenerateSymmetricKey", "Ptr", hAlgorithm, "PtrP", hKey, "Ptr", 0, "UInt", 0
, "Ptr" , pKey, "UInt", keySize, "UInt", 0, "UInt")
res := DllCall("Bcrypt\BCrypt" . crypt, "Ptr", hKey, "Ptr", pData, "UInt", dataSize, "Ptr", 0
, "Ptr", pLocalIv, "UInt", ivSize, "Ptr", 0
, "UInt", 0, "UIntP", outSize, "UInt", padding, "UInt")
if (res != 0)
throw "Crypt error! BCrypt" . crypt . "1 result: " . Format("{:#x}", res)
VarSetCapacity(outData, outSize, 0)
res := DllCall("Bcrypt\BCrypt" . crypt, "Ptr", hKey, "Ptr", pData, "UInt", dataSize, "Ptr", 0
, "Ptr", pLocalIv, "UInt", ivSize, "Ptr", &outData
, "UInt", outSize, "UIntP", outSize, "UInt", padding, "UInt")
if (res != 0)
throw "Crypt error! BCrypt" . crypt . "2 result: " . Format("{:#x}", res)
DllCall("Bcrypt\BCryptDestroyKey", "Ptr", hKey)
DllCall("Bcrypt\BCryptCloseAlgorithmProvider", "Ptr", hAlgorithm, "UInt", 0)
Return outSize
}
CreateHash(pData, size, ByRef hashData, pSecretKey := 0, keySize := 0, AlgId := "SHA256") {
; CNG Algorithm Identifiers
; https://docs.microsoft.com/en-us/windows/win32/seccng/cng-algorithm-identifiers
static HMAC := BCRYPT_ALG_HANDLE_HMAC_FLAG := 0x00000008
DllCall("Bcrypt\BCryptOpenAlgorithmProvider", "PtrP", hAlgorithm, "WStr", AlgId, "Ptr", 0, "UInt", keySize ? HMAC : 0)
DllCall("Bcrypt\BCryptCreateHash", "Ptr", hAlgorithm, "PtrP", hHash, "Ptr", 0, "UInt", 0, "Ptr", pSecretKey, "UInt", keySize, "UInt", 0)
DllCall("Bcrypt\BCryptHashData", "Ptr", hHash, "Ptr", pData, "UInt", size, "UInt", 0)
DllCall("Bcrypt\BCryptGetProperty", "Ptr", hAlgorithm, "WStr", "HashDigestLength", "UIntP", hashLen, "UInt", 4, "UIntP", cbResult, "UInt", 0)
VarSetCapacity(hashData, hashLen, 0)
DllCall("Bcrypt\BCryptFinishHash", "Ptr", hHash, "Ptr", &hashData, "UInt", hashLen, "UInt", 0)
DllCall("Bcrypt\BCryptDestroyHash", "Ptr", hHash)
DllCall("Bcrypt\BCryptCloseAlgorithmProvider", "Ptr", hAlgorithm, "UInt", 0)
Return hashLen
}
StrPutBuff(string, ByRef data, encoding := "UTF-8") {
VarSetCapacity( data, len := (StrPut(string, encoding) - 1) << (encoding ~= "i)^(UTF-16|cp1200)$") )
StrPut(string, &data, encoding)
Return len
}