Здравствуйте! Возникла проблема: я ишу расширение для postgre, которое шифрует и расшифровывает данные. Шифрование и дешифрование происходит функциями micrisift cryptapi как в их примерах, только генерируя ключ из строки: https://docs.microsoft.com/en-us/windows/win32/seccrypto/example-c-program-encrypting-a-file] и https://docs.microsoft.com/en-us/windows/win32/seccrypto/example-c-program-decrypting-a-file] . Считываю я cstring 1.
char* dataToEncrypt = PG_GETARG_CSTRING(0);
, потом записываю в файл и всё как в примере. Итоговый массив BYTE* возвращаю в поле bytea: 1.
PG_RETURN_BYTEA_P(pbBuffer);
. Дешифрование происходит так: считываю из поля bytea: 1.
bytea* dataToDecrypt = PG_GETARG_BYTEA_P(0);
, записываю в файл и всё как в примере. Пока никак не возвращаю, потому что функция шифрования записывает зашифрованные байты так (файл cryptoText): =zvf=¦-ЈЯ†џ , а считывает из базы оно так(файл 10.txt): zvf=\\246-\\243\\337\\206\\237\\001\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000
. Функция же расшифрования считывает это (не совпадает с записанным функцией зашифрования, файл ): „ zvf= . Как правильно считывать bytea и записывать BYTE? Постараюсь приложить весь код и скрины в спойлере 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338.
Datum
f(PG_FUNCTION_ARGS)
{
FILE* log = AllocateFile("C:\\pg\\log.txt", PG_BINARY_A);
//get data to encrypt
char* dataToEncrypt = PG_GETARG_CSTRING(0);
DWORD dataToEncrypt_len = (DWORD)strlen(dataToEncrypt);
////get name of table
//char* tableName = PG_GETARG_CSTRING(1);
//DWORD tableName_len = (DWORD)strlen(tableName);
FILE* tempFile = AllocateFile("C:\\pg\\openText.txt", PG_BINARY_A);
fprintf(tempFile, "%s", dataToEncrypt);
FreeFile(tempFile);
///////////////////////////////////////////////////////////////////////////////////
bool fReturn = false;
HANDLE hSourceFile = INVALID_HANDLE_VALUE;
HANDLE hDestinationFile = INVALID_HANDLE_VALUE;
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hKey = NULL;
HCRYPTKEY hXchgKey = NULL;
HCRYPTHASH hHash = NULL;
PBYTE pbKeyBlob = NULL;
DWORD dwKeyBlobLen;
PBYTE pbBuffer = NULL;
DWORD dwBlockLen;
DWORD dwBufferLen;
DWORD dwCount;
bool fEOF = FALSE;
char pszPassword[] = "key";
char s[] = "C:\\pg\\openText.txt";
char d[] = "C:\\pg\\cryptoText.txt";
// Open the source file.
hSourceFile = CreateFile(s, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hSourceFile)
{
fprintf(log, "%u %s\n", GetLastError(), "CreateFile s");
goto Exit_MyEncryptFile;
}
// Open the destination file.
hDestinationFile = CreateFile(d, FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hDestinationFile)
{
fprintf(log, "%u %s\n", GetLastError(), "CreateFile d");
goto Exit_MyEncryptFile;
}
// Get the handle to the default provider.
if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptAcquireContext");
goto Exit_MyEncryptFile;
}
// Create a hash object.
if (!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptCreateHash");
goto Exit_MyEncryptFile;
}
// Hash the password.
if (!CryptHashData(hHash, (BYTE*)pszPassword, lstrlen(pszPassword), 0))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptHashData");
goto Exit_MyEncryptFile;
}
// Derive a session key from the hash object.
if (!CryptDeriveKey(hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptDeriveKey");
goto Exit_MyEncryptFile;
}
// Determine the number of bytes to encrypt at a time.
// This must be a multiple of ENCRYPT_BLOCK_SIZE.
// ENCRYPT_BLOCK_SIZE is set by a #define statement.
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
// Determine the block size. If a block cipher is used,
// it must have room for an extra block.
if (ENCRYPT_BLOCK_SIZE > 1)
dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
else
dwBufferLen = dwBlockLen;
// Allocate memory.
pbBuffer = (BYTE*)malloc(dwBufferLen);
// In a do loop, encrypt the source file,
// and write to the source file.
do
{
// Read up to dwBlockLen bytes from the source file.
if (!ReadFile(hSourceFile, pbBuffer, dwBlockLen, &dwCount, NULL))
{
fprintf(log, "%u %s\n", GetLastError(), "ReadFile");
goto Exit_MyEncryptFile;
}
if (dwCount < dwBlockLen)
fEOF = TRUE;
// Encrypt data.
if (!CryptEncrypt(hKey, NULL, fEOF, 0, pbBuffer, &dwCount, dwBufferLen))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptEncrypt");
goto Exit_MyEncryptFile;
}
// Write the encrypted data to the destination file.
if (!WriteFile(hDestinationFile, pbBuffer, dwCount, &dwCount, NULL))
{
fprintf(log, "%u %s\n", GetLastError(), "WriteFile");
goto Exit_MyEncryptFile;
}
} while (!fEOF);
fReturn = true;
Exit_MyEncryptFile:
if (hSourceFile)
CloseHandle(hSourceFile);
if (hDestinationFile)
CloseHandle(hDestinationFile);
//if (pbBuffer)
// free(pbBuffer);
if (hHash)
{
if (!(CryptDestroyHash(hHash)))
fprintf(log, "%u %s\n", GetLastError(), "CryptDestroyHash");
hHash = NULL;
}
// Release the session key.
if (hKey)
{
if (!(CryptDestroyKey(hKey)))
fprintf(log, "%u %s\n", GetLastError(), "CryptDestroyKey");
}
// Release the provider handle.
if (hCryptProv)
{
if (!(CryptReleaseContext(hCryptProv, 0)))
fprintf(log, "%u %s\n", GetLastError(), "WriteFile");
}
FreeFile(log);
PG_RETURN_BYTEA_P(pbBuffer);
//PG_RETURN_TEXT_P(pbBuffer);
//PG_RETURN_CSTRING(res);
}
Datum
g(PG_FUNCTION_ARGS)
{
FILE* log = AllocateFile("C:\\pg\\log.txt", PG_BINARY_A);
//get data to decrypt
bytea* dataToDecrypt = PG_GETARG_BYTEA_P(0);
FILE* tempFile = AllocateFile("C:\\pg\\10.txt", PG_BINARY_A);
fwrite(dataToDecrypt, sizeof(dataToDecrypt), 1, tempFile);
FreeFile(tempFile);
//get name of table
char* tableName = PG_GETARG_CSTRING(1);
DWORD tableName_len = (DWORD)strlen(tableName);
///////////////////////////////////////////////////////////////////////////////////
// Declare and initialize local variables.
bool fReturn = false;
HANDLE hSourceFile = INVALID_HANDLE_VALUE;
HANDLE hDestinationFile = INVALID_HANDLE_VALUE;
HCRYPTKEY hKey = NULL;
HCRYPTHASH hHash = NULL;
HCRYPTPROV hCryptProv = NULL;
DWORD dwCount;
PBYTE pbBuffer = NULL;
DWORD dwBlockLen;
DWORD dwBufferLen;
bool fEOF = false;
char pszPassword[] = "key";
// Open the source file.
char s[] = "C:\\pg\\10.txt";
hSourceFile = CreateFile(s, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hSourceFile)
{
fprintf(log, "%u %s\n", GetLastError(), "CreateFile source");
goto Exit_MyDecryptFile;
}
// Open the destination file.
char d[] = "C:\\pg\\11.txt";
hDestinationFile = CreateFile(d, FILE_WRITE_DATA, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hDestinationFile)
{
fprintf(log, "%u %s\n", GetLastError(), "CreateFile des");
goto Exit_MyDecryptFile;
}
// Get the handle to the default provider.
if (!CryptAcquireContext(&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptAcquireContext");
goto Exit_MyDecryptFile;
}
// Decrypt the file with a session key derived from a
// password.
// Create a hash object.
if (!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptCreateHash");
goto Exit_MyDecryptFile;
}
// Hash in the password data.
if (!CryptHashData(hHash, (BYTE*)pszPassword, lstrlen(pszPassword), 0))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptHashData");
goto Exit_MyDecryptFile;
}
// Derive a session key from the hash object.
if (!CryptDeriveKey(hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptDeriveKey");
goto Exit_MyDecryptFile;
}
// The decryption key is now available, either having been
// imported from a BLOB read in from the source file or having
// been created by using the password. This point in the program
// is not reached if the decryption key is not available.
// Determine the number of bytes to decrypt at a time.
// This must be a multiple of ENCRYPT_BLOCK_SIZE.
dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
dwBufferLen = dwBlockLen;
// Allocate memory for the file read buffer.
if (!(pbBuffer = (PBYTE)malloc(dwBufferLen)))
{
fprintf(log, "%u %s\n", GetLastError(), "malloc 3");
goto Exit_MyDecryptFile;
}
// Decrypt the source file, and write to the destination file.
do
{
// Read up to dwBlockLen bytes from the source file.
if (!ReadFile(hSourceFile, pbBuffer, dwBlockLen, &dwCount, NULL))
{
fprintf(log, "%u %s\n", GetLastError(), "ReadFile 4");
goto Exit_MyDecryptFile;
}
if (dwCount <= dwBlockLen)
fEOF = TRUE;
// Decrypt the block of data.
if (!CryptDecrypt(hKey, 0, fEOF, 0, pbBuffer, &dwCount))
{
fprintf(log, "%u %s\n", GetLastError(), "CryptDecrypt");
goto Exit_MyDecryptFile;
}
// Write the decrypted data to the destination file.
if (!WriteFile(hDestinationFile, pbBuffer, dwCount, &dwCount, NULL))
{
fprintf(log, "%u %s\n", GetLastError(), "WriteFile 2");
goto Exit_MyDecryptFile;
}
// End the do loop when the last block of the source file
// has been read, encrypted, and written to the destination
// file.
} while (!fEOF);
fReturn = true;
Exit_MyDecryptFile:
// Close files.
if (hSourceFile)
CloseHandle(hSourceFile);
if (hDestinationFile)
CloseHandle(hDestinationFile);
// Release the hash object.
if (hHash)
{
if (!(CryptDestroyHash(hHash)))
fprintf(log, "%u %s\n", GetLastError(), "CryptDestroyHash");
hHash = NULL;
}
// Release the session key.
if (hKey)
{
if (!(CryptDestroyKey(hKey)))
fprintf(log, "%u %s\n", GetLastError(), "CryptDestroyKey");
}
// Release the provider handle.
if (hCryptProv)
{
if (!(CryptReleaseContext(hCryptProv, 0)))
fprintf(log, "%u %s\n", GetLastError(), "CryptReleaseContext");
}
if (pbBuffer)
free(pbBuffer);
FreeFile(log);
PG_RETURN_TEXT_P("arg007");
}
|