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