· 6 years ago · Nov 27, 2019, 03:04 AM
1;CNG (Cryptography API: Next Generation) by jNizM
2
3;https://www.autohotkey.com/boards/viewtopic.php?f=6&t=23413
4
5
6encrypt(string, iv, key)
7{
8 If (!string)
9 return
10
11 BCRYPT_AES_ALGORITHM := "AES"
12 BCRYPT_OBJECT_LENGTH := "ObjectLength"
13 BCRYPT_BLOCK_LENGTH := "BlockLength"
14 BCRYPT_CHAINING_MODE := "ChainingMode"
15 BCRYPT_CHAIN_MODE_CBC := "ChainingModeCBC"
16 BCRYPT_OPAQUE_KEY_BLOB := "OpaqueKeyBlob"
17 BCRYPT_BLOCK_PADDING := 0x00000001
18
19 DllCall("LoadLibrary", "str", "crypt32.dll", "ptr")
20 DllCall("LoadLibrary", "str", "bcrypt.dll", "ptr")
21 DllCall("LoadLibrary", "str", "msvcrt.dll", "ptr")
22
23 ALG_HANDLE := BCryptOpenAlgorithmProvider(BCRYPT_AES_ALGORITHM)
24 OBJECT_LENGTH := BCryptGetProperty(ALG_HANDLE, BCRYPT_OBJECT_LENGTH, 4)
25 BLOCK_LENGTH := BCryptGetProperty(ALG_HANDLE, BCRYPT_BLOCK_LENGTH, 4)
26 BCryptSetProperty(ALG_HANDLE, BCRYPT_CHAINING_MODE, BCRYPT_CHAIN_MODE_CBC)
27 KEY_HANDLE := BCryptGenerateSymmetricKey(ALG_HANDLE, KEY, KEY_OBJECT, OBJECT_LENGTH)
28 CIPHER_LENGTH := BCryptEncrypt(KEY_HANDLE, STRING, IV, BLOCK_LENGTH, CIPHER_DATA)
29 encryption := b64Encode(CIPHER_DATA, CIPHER_LENGTH)
30 BCryptDestroyKey(KEY_HANDLE)
31 BCryptCloseAlgorithmProvider(ALG_HANDLE)
32 return encryption
33}
34
35decrypt(string, iv, key)
36{
37 If (!string)
38 return
39
40 BCRYPT_AES_ALGORITHM := "AES"
41 BCRYPT_OBJECT_LENGTH := "ObjectLength"
42 BCRYPT_BLOCK_LENGTH := "BlockLength"
43 BCRYPT_CHAINING_MODE := "ChainingMode"
44 BCRYPT_CHAIN_MODE_CBC := "ChainingModeCBC"
45 BCRYPT_OPAQUE_KEY_BLOB := "OpaqueKeyBlob"
46 BCRYPT_BLOCK_PADDING := 0x00000001
47
48 DllCall("LoadLibrary", "str", "crypt32.dll", "ptr")
49 DllCall("LoadLibrary", "str", "bcrypt.dll", "ptr")
50 DllCall("LoadLibrary", "str", "msvcrt.dll", "ptr")
51
52 ALG_HANDLE := BCryptOpenAlgorithmProvider(BCRYPT_AES_ALGORITHM)
53 OBJECT_LENGTH := BCryptGetProperty(ALG_HANDLE, BCRYPT_OBJECT_LENGTH, 4)
54 BLOCK_LENGTH := BCryptGetProperty(ALG_HANDLE, BCRYPT_BLOCK_LENGTH, 4)
55 BCryptSetProperty(ALG_HANDLE, BCRYPT_CHAINING_MODE, BCRYPT_CHAIN_MODE_CBC)
56 KEY_HANDLE := BCryptGenerateSymmetricKey(ALG_HANDLE, KEY, KEY_OBJECT, OBJECT_LENGTH)
57 len := b64Decode(string, buf)
58 CIPHER_LENGTH := BCryptDecrypt(KEY_HANDLE, buf, len, IV, BLOCK_LENGTH, CIPHER_DATA)
59 BCryptDestroyKey(KEY_HANDLE)
60 BCryptCloseAlgorithmProvider(ALG_HANDLE)
61 return StrGet(&CIPHER_DATA, CIPHER_LENGTH /= 2, "utf-16")
62}
63
64
65; ===========================================================================================================================
66; BCryptOpenAlgorithmProvider https://msdn.microsoft.com/en-us/library/aa375479(v=vs.85).aspx
67; ===========================================================================================================================
68BCryptOpenAlgorithmProvider(ALGORITHM, FLAGS := 0)
69{
70 if (NT_STATUS := DllCall("bcrypt\BCryptOpenAlgorithmProvider", "ptr*", BCRYPT_ALG_HANDLE
71 , "ptr", &ALGORITHM
72 , "ptr", 0
73 , "uint", FLAGS) != 0)
74 ;throw Exception("BCryptOpenAlgorithmProvider: " NT_STATUS, -1)
75 return
76 return BCRYPT_ALG_HANDLE
77}
78
79; ===========================================================================================================================
80; BCryptGetProperty https://msdn.microsoft.com/en-us/library/aa375464(v=vs.85).aspx
81; ===========================================================================================================================
82BCryptGetProperty(BCRYPT_HANDLE, PROPERTY, cbOutput)
83{
84 if (NT_STATUS := DllCall("bcrypt\BCryptGetProperty", "ptr", BCRYPT_HANDLE
85 , "ptr", &PROPERTY
86 , "uint*", pbOutput
87 , "uint", cbOutput
88 , "uint*", cbResult
89 , "uint", 0) != 0)
90 ;throw Exception("BCryptGetProperty: " NT_STATUS, -1)
91 return
92 return pbOutput
93}
94
95; ===========================================================================================================================
96; BCryptSetProperty https://msdn.microsoft.com/en-us/library/aa375504(v=vs.85).aspx
97; ===========================================================================================================================
98BCryptSetProperty(BCRYPT_HANDLE, PROPERTY, pbInput)
99{
100 if (NT_STATUS := DllCall("bcrypt\BCryptSetProperty", "ptr", BCRYPT_HANDLE
101 , "ptr", &PROPERTY
102 , "ptr", &pbInput
103 , "uint", StrLen(pbInput)
104 , "uint", 0) != 0)
105 ;throw Exception("BCryptSetProperty: " NT_STATUS, -1)
106 return
107 return true
108}
109
110; ===========================================================================================================================
111; BCryptGenerateSymmetricKey https://msdn.microsoft.com/en-us/library/aa375453(v=vs.85).aspx
112; ===========================================================================================================================
113BCryptGenerateSymmetricKey(BCRYPT_ALG_HANDLE, KEY, ByRef pbKeyObject, cbKeyObject)
114{
115 VarSetCapacity(pbKeyObject, cbKeyObject, 0)
116 VarSetCapacity(pbSecret, cbSecret := StrPut(KEY, "UTF-8"), 0) && StrPut(KEY, &pbSecret, "UTF-8"), cbSecret--
117 if (NT_STATUS := DllCall("bcrypt\BCryptGenerateSymmetricKey", "ptr", BCRYPT_ALG_HANDLE
118 , "ptr*", BCRYPT_KEY_HANDLE
119 , "ptr", &pbKeyObject
120 , "uint", cbKeyObject
121 , "ptr", &pbSecret
122 , "uint", cbSecret
123 , "uint", 0) != 0)
124 ;throw Exception("BCryptGenerateSymmetricKey: " NT_STATUS, -1)
125 return
126 return BCRYPT_KEY_HANDLE
127}
128
129; ===========================================================================================================================
130; BCryptEncrypt https://msdn.microsoft.com/en-us/library/aa375421(v=vs.85).aspx
131; ===========================================================================================================================
132BCryptEncrypt(BCRYPT_KEY_HANDLE, STRING, IV, cbIV, ByRef pbOutput)
133{
134 BCRYPT_BLOCK_PADDING := 0x00000001
135 VarSetCapacity(pbInput, cbInput := StrLen(STRING) << 1, 0)
136 DllCall("msvcrt\memcpy", "ptr", &pbInput, "ptr", &STRING, "ptr", cbInput)
137
138 VarSetCapacity(pbIV, cbIV, 0)
139 DllCall("msvcrt\memcpy", "ptr", &pbIV, "ptr", &IV, "ptr", cbIV)
140
141 if (NT_STATUS := DllCall("bcrypt\BCryptEncrypt", "ptr", BCRYPT_KEY_HANDLE
142 , "ptr", &pbInput
143 , "uint", cbInput
144 , "ptr", 0
145 , "ptr", &pbIV
146 , "uint", cbIV
147 , "ptr", 0
148 , "uint", 0
149 , "uint*", cbOutput
150 , "uint", BCRYPT_BLOCK_PADDING) != 0)
151 ;throw Exception("BCryptEncrypt: " NT_STATUS, -1)
152 return
153 VarSetCapacity(pbOutput, cbOutput, 0)
154 if (NT_STATUS := DllCall("bcrypt\BCryptEncrypt", "ptr", BCRYPT_KEY_HANDLE
155 , "ptr", &pbInput
156 , "uint", cbInput
157 , "ptr", 0
158 , "ptr", &pbIV
159 , "uint", cbIV
160 , "ptr", &pbOutput
161 , "uint", cbOutput
162 , "uint*", cbOutput
163 , "uint", BCRYPT_BLOCK_PADDING) != 0)
164 ;throw Exception("BCryptEncrypt: " NT_STATUS, -1)
165 return
166 return cbOutput
167}
168
169; ===========================================================================================================================
170; BCryptDecrypt https://msdn.microsoft.com/en-us/library/aa375391(v=vs.85).aspx
171; ===========================================================================================================================
172BCryptDecrypt(BCRYPT_KEY_HANDLE, ByRef STRING, cbInput, IV, cbIV, ByRef pbOutput)
173{
174 BCRYPT_BLOCK_PADDING := 0x00000001
175 VarSetCapacity(pbInput, cbInput, 0)
176 DllCall("msvcrt\memcpy", "ptr", &pbInput, "ptr", &STRING, "ptr", cbInput)
177
178 VarSetCapacity(pbIV, cbIV, 0)
179 DllCall("msvcrt\memcpy", "ptr", &pbIV, "ptr", &IV, "ptr", cbIV)
180
181 if (NT_STATUS := DllCall("bcrypt\BCryptDecrypt", "ptr", BCRYPT_KEY_HANDLE
182 , "ptr", &pbInput
183 , "uint", cbInput
184 , "ptr", 0
185 , "ptr", &pbIV
186 , "uint", cbIV
187 , "ptr", 0
188 , "uint", 0
189 , "uint*", cbOutput
190 , "uint", BCRYPT_BLOCK_PADDING) != 0)
191 ;throw Exception("BCryptDecrypt: " NT_STATUS, -1)
192 return
193 VarSetCapacity(pbOutput, cbOutput, 0)
194 if (NT_STATUS := DllCall("bcrypt\BCryptDecrypt", "ptr", BCRYPT_KEY_HANDLE
195 , "ptr", &pbInput
196 , "uint", cbInput
197 , "ptr", 0
198 , "ptr", &pbIV
199 , "uint", cbIV
200 , "ptr", &pbOutput
201 , "uint", cbOutput
202 , "uint*", cbOutput
203 , "uint", BCRYPT_BLOCK_PADDING) != 0)
204 ;throw Exception("BCryptDecrypt: " NT_STATUS, -1)
205 return
206 return cbOutput
207}
208
209; ===========================================================================================================================
210; BCryptDestroyKey https://msdn.microsoft.com/en-us/library/aa375404(v=vs.85).aspx
211; ===========================================================================================================================
212BCryptDestroyKey(BCRYPT_KEY_HANDLE)
213{
214 if (NT_STATUS := DllCall("bcrypt\BCryptDestroyKey", "ptr", BCRYPT_KEY_HANDLE) != 0) ;fix here add .dll
215 ;throw Exception("BCryptDestroyKey: " NT_STATUS, -1)
216 return
217 return true
218}
219
220; ===========================================================================================================================
221; BCryptCloseAlgorithmProvider https://msdn.microsoft.com/en-us/library/aa375377(v=vs.85).aspx
222; ===========================================================================================================================
223BCryptCloseAlgorithmProvider(BCRYPT_ALG_HANDLE)
224{
225 if (NT_STATUS := DllCall("bcrypt\BCryptCloseAlgorithmProvider", "ptr", BCRYPT_ALG_HANDLE
226 , "uint", 0) != 0)
227 ;throw Exception("BCryptCloseAlgorithmProvider: " NT_STATUS, -1)
228 return
229 return true
230}
231
232
233; ===========================================================================================================================
234; For Internal Use Only
235; ===========================================================================================================================
236b64Encode(ByRef string, len)
237{
238 DllCall("crypt32\CryptBinaryToString", "ptr", &string, "uint", len, "uint", 0x40000001, "ptr", 0, "uint*", size)
239 VarSetCapacity(buf, size << 1, 0)
240 DllCall("crypt32\CryptBinaryToString", "ptr", &string, "uint", len, "uint", 0x40000001, "ptr", &buf, "uint*", size)
241 return StrGet(&buf, size << 1, "UTF-16")
242}
243
244b64Decode(ByRef string, ByRef buf)
245{
246 DllCall("crypt32\CryptStringToBinary", "ptr", &string, "uint", 0, "uint", 0x1, "ptr", 0, "uint*", size, "ptr", 0, "ptr", 0)
247 VarSetCapacity(buf, size, 0)
248 DllCall("crypt32\CryptStringToBinary", "ptr", &string, "uint", 0, "uint", 0x1, "ptr", &buf, "uint*", size, "ptr", 0, "ptr", 0)
249 return size
250}