Расшифровка OpenSSL - ошибка EVP_DecryptFinal_ex - PullRequest
0 голосов
/ 20 ноября 2018

Я использую эту функцию расшифровки, чтобы получить текстовое значение шифра, который был зашифрован с использованием EVP AES 265 GCM;Я вижу данные в rawOut, но ret = EVP_DecryptFinal_ex(ctx, rawOut, &len); возвращает 0;Можете ли вы дать представление о том, почему?Я также видел источники, которые делают rawOut + len в коде EVP_DecryptFinal_ex, я не уверен, зачем это нужно, так как он будет перемещать указатель в конец буфера.

unsigned char* keyDecrypter(unsigned char* pszMasterKey)
{
    ERR_load_crypto_strings();

    int ret, len;
    EVP_CIPHER_CTX* ctx;
    unsigned char* rawOut = new unsigned char[48]; // ToDo Remove Hardcoded Value

    Info info = m_header.processKeyInfo();
    if (NULL == info.nonce)
        return NULL;

    if (!(ctx = EVP_CIPHER_CTX_new()))
        return NULL;

    if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, pszMasterKey, info.nonce))
        return NULL;

    if (!EVP_DecryptUpdate(ctx, NULL, &len, m_header.aad, m_header.aad_len))
        return NULL;

    if (!EVP_DecryptUpdate(ctx, rawOut, &len, m_header.encryptedValue, m_header.encryptedValueLen))
        return NULL;

    // Finalise the decryption. A positive return value indicates success,
    // anything else is a failure - the plain text is not trustworthy.
    ret = EVP_DecryptFinal_ex(ctx, rawOut, &len);

    ERR_print_errors_fp(stderr);

    EVP_CIPHER_CTX_free(ctx);

    if (ret > 0)
    {
        return rawOut;
    }
    else
    {
        return NULL;
    }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Вам нужно передать rawOut + len на EVP_DecryptFinal_ex.См. Пример в конце документации :

    /* Buffer passed to EVP_EncryptFinal() must be after data just
     * encrypted to avoid overwriting it.
     */
    if(!EVP_EncryptFinal_ex(ctx, outbuf + outlen, &tmplen))
    {
         /* Error */
         return 0;
    }
    outlen += tmplen;

Также обратите внимание, что rawOut должен иметь достаточно места для (m_header.aad_len + cipher_block_size) байтов.Вы можете получить размер блока с EVP_CIPHER_block_size().

...