powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Подскажите в libgcrypt по gcry_cipher_decrypt
1 сообщений из 26, страница 2 из 2
Подскажите в libgcrypt по gcry_cipher_decrypt
    #38686419
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smald,

все разобрался, так работает, спасибо что не бросили )) тудасюда hex гоняется нормально, там путаница была у меня с размерами и попыткой посчитать длину строки через strlen у шифрованного буфера unsigned char*, который переодически получался РАЗНЫЙ!!! видать strlen нельзя посчитать такие вещи ))
Код: 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.
#define ENCR 1
#define DECR 0

string Crypt(int encdec, const char* pass, const char* salt, const char* text, size_t textLen)
{
    if (!gcry_check_version(GCRYPT_VERSION))
    {
        syslog(LOG_ERR, "libgcrypt version mismatch\n");
        return "";
    }

    gcry_error_t gcryError;
    gcry_cipher_hd_t hd;
    char* outBuff;

    gcryError = gcry_cipher_open(&hd, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_CTS);

    if (gcryError)
    {
        syslog(LOG_ERR, "gcry_cipher_open failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
        return "";
    }

    gcryError = gcry_cipher_setkey(hd, pass, strlen(pass));
    if (gcryError)
    {
        syslog(LOG_ERR, "gcry_cipher_setkey failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
        return "";
    }

    gcryError = gcry_cipher_setiv(hd, salt, strlen(salt));
    if (gcryError)
    {
        syslog(LOG_ERR, "gcry_cipher_setiv failed: %s/%s\n", gcry_strsource(gcryError),gcry_strerror(gcryError));
        return "";
    }

    stringstream buff("");
    switch(encdec)
    {
        case ENCR:
            outBuff = (char*)malloc(textLen);
            gcryError = gcry_cipher_encrypt(hd, outBuff, textLen, text, textLen);

            if (gcryError)
            {
                syslog(LOG_ERR, "gcry_cipher_encrypt failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
                return "";
            }

            for (size_t i = 0; i < textLen; i++)
                buff << setfill('0') << setw(2) << hex << (unsigned int)(unsigned char)outBuff[i];

            break;
        case DECR:
            char ch[2];
            for (int i = 0; i < textLen; i += 2)
            {
                sprintf(ch, "%c%c", text[i], text[i+1]);
                buff << (unsigned char)strtoul(ch, NULL, 16);
            }

            textLen /= 2;
            outBuff = (char*)malloc(textLen + 1);
            outBuff[textLen] = 0;
            gcryError = gcry_cipher_decrypt(hd, outBuff, textLen, buff.str().c_str(), textLen);

            if (gcryError)
            {
                syslog(LOG_ERR, "gcry_cipher_decrypt failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
                return "";
            }

            buff.str(outBuff);
    }

    free(outBuff);
    gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
    gcry_cipher_close(hd);
    //memset(&hd, 0, sizeof(hd));
    return buff.str();
}
...
Рейтинг: 0 / 0
1 сообщений из 26, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Подскажите в libgcrypt по gcry_cipher_decrypt
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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