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