Guest User

CNG

a guest
Nov 26th, 2019
288
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;CNG (Cryptography API: Next Generation) by jNizM
  2. ;https://www.autohotkey.com/boards/viewtopic.php?f=6&t=23413
  3.  
  4.  
  5. encrypt(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.  
  43. decrypt(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. ; ===========================================================================================================================
  76. BCryptOpenAlgorithmProvider(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. ; ===========================================================================================================================
  90. BCryptGetProperty(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. ; ===========================================================================================================================
  106. BCryptSetProperty(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. ; ===========================================================================================================================
  121. BCryptGenerateSymmetricKey(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. ; ===========================================================================================================================
  140. BCryptEncrypt(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. ; ===========================================================================================================================
  180. BCryptDecrypt(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. ; ===========================================================================================================================
  220. BCryptDestroyKey(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. ; ===========================================================================================================================
  231. BCryptCloseAlgorithmProvider(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. ; ===========================================================================================================================
  244. b64Encode(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.  
  252. b64Decode(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. }
RAW Paste Data