LINUX.ORG.RU

Подскажите в libgcrypt по gcry_cipher_decrypt в С++


0

1

пытаюсь просто проверить как работает шифрование-дешифрование код ТЕСТОВОЙ функции

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

    gcry_error_t gcryError;
    gcry_cipher_hd_t hd;

    size_t passLen = strlen(pass);
    size_t saltLen = strlen(salt);
    size_t textLen;
    char* outBuff;


    gcryError = gcry_cipher_open(&hd, GCRY_CIPHER_AES128, 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, passLen);
    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, saltLen);
    if (gcryError)
    {
        syslog(LOG_ERR, "gcry_cipher_setiv failed: %s/%s\n", gcry_strsource(gcryError),gcry_strerror(gcryError));
        return "";
    }

    stringstream buff("");

            textLen = strlen(text);
            outBuff = (char*)malloc(textLen);
            gcryError = gcry_cipher_encrypt(hd, outBuff, textLen, text, textLen);
            buff.str(outBuff);
            free(outBuff);

            textLen = buff.str().size();
            outBuff = (char*)malloc(textLen);
            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);

    gcry_cipher_close(hd);
    free(outBuff);
    return buff.str();
}
посылаю туда
string bf = Crypt("1234567890123456", "0987654321654321", "blablabla1234567890");

в ответ галиматья чередующаяся с дешифрованным текстом (( понимаю что ошибка где то в преобразовании типов, но где понять не могу.

★★★

разобрался в моем примере нельзя сразу декрипт делать, нужно полностью закрывать сессию и открывать по новой, но пример я делал для того, чтобы понять где у меня ошибка при шифровании-дешифровании и она была в strlen, которым измерял длину шифрованного unsigned char* (выдавало переодически меньшую длину), поэтому конечный вариант

#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();
}

wolverin ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.