powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Конвертирование bytea в BYTE и обратно
1 сообщений из 1, страница 1 из 1
Конвертирование bytea в BYTE и обратно
    #39954201
Gasleng
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Возникла проблема: я ишу расширение для 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
Код: plaintext
1.
    char* dataToEncrypt = PG_GETARG_CSTRING(0);

, потом записываю в файл и всё как в примере. Итоговый массив BYTE* возвращаю в поле bytea:
Код: plaintext
1.
PG_RETURN_BYTEA_P(pbBuffer);

. Дешифрование происходит так: считываю из поля bytea:
Код: plaintext
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? Постараюсь приложить весь код и скрины в спойлере
Код: plaintext
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");
}

...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Конвертирование bytea в BYTE и обратно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]