【解決方法】EVP の復号化による奇妙な動作


ディレクトリ内のファイルを暗号化する簡単なプログラムがあります。 私は繰り返すことができ、すべてが完璧に機能します。 これは、pub/priv キー ペアを使用しています。 一度に 1 つのファイルを復号化すると、正常に機能します。 ただし、ディレクトリに複数のファイルがある場合、またはファイル名をベクトルに入れてそれぞれ読み取り/書き込み用に fopen した場合でも、ベクトル/ディレクトリ内の最後のファイルのみを復号化します。 これはどのように可能ですか? OpenFinal() で全員が失敗します。 これがプログラムの機能と核心です。 それ以外はしっかりしています。 前述のように、ファイルを 1 つだけ手動で復号化するか、ディレクトリまたはベクターにファイルが 1 つしかない場合は、スタンドアロン プログラムとして機能します。

どんな助けでも大歓迎です。 これはまったく意味がありません。 それは彼らの側での実装の問題のようです。

void handleErrors(void)
{
    // perror("Error: ");
    ERR_print_errors_fp(stderr);
    abort();
}


int envelope_open(EVP_PKEY *priv_key, unsigned char *ciphertext,
                  int ciphertext_len, unsigned char *encrypted_key,
                  int encrypted_key_len, unsigned char *iv,
                  unsigned char **plaintext, int *plaintext_len)
{
    EVP_CIPHER_CTX *ctx;
    int len = 0, ret = 0;
    unsigned char *tmpptxt = NULL;

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

    if ((tmpptxt = (unsigned char*)malloc(ciphertext_len)) == NULL)
    {
        printf("tmptxt error!\n");
        handleErrors();
    }

    if(EVP_OpenInit(ctx, EVP_aes_256_cbc(), encrypted_key, encrypted_key_len,
                    iv, priv_key) != 1)
    {
        printf("OpenInit error\n");
        handleErrors();
    }

    if(EVP_OpenUpdate(ctx, tmpptxt, &len, ciphertext, ciphertext_len) != 1)
            {
        printf("OpenUpdate error\n");
        handleErrors();
    }
    *plaintext_len = len;

    if(EVP_OpenFinal(ctx, tmpptxt + len, &len) != 1)
            {
        printf("OpenFinal error\n");
                handleErrors();
    }
    *plaintext_len += len;

    *plaintext = tmpptxt;
    tmpptxt = NULL;
    ret = 1;
 err:
    EVP_CIPHER_CTX_free(ctx);
    free(tmpptxt);

    return ret;
}

以下は main() の内部です

for (vector<string>::iterator t=crypt_files.begin(); t!=crypt_files.end(); ++t) 
{   
    const char *filename_crypt = t[i].c_str();
    printf("filename_crypt: %s\n", filename_crypt);
    f_input = fopen(filename_crypt, "rb");
    if (!f_input)
        printf("error opening %s\n", filename_crypt);
    size = fsize(f_input);

    // remove .crypt from each iteration to write to output file
    removeSubstrs (t[i], ".crypt");

    const char *filename = t[i].c_str();
    printf("filename      : %s\n", filename);
    f_dec = fopen(filename, "wb");
    if (!f_dec)
        printf("error opening %s\n", filename);

    ciphertext = (unsigned char*)malloc(size + 1);
    num_bytes_read = fread(ciphertext, sizeof(char), size, f_input);
    ciphertext_len = num_bytes_read;
    printf("ciphertext_len: %d\n", ciphertext_len);
    fclose(f_input);

    /* Decrypt the given file */
    if (!envelope_open(privkey, ciphertext, ciphertext_len, enc_key,
                       enc_key_len, iv, &plaintext, &plaintext_len))

    {
        printf("Error on envelope_open() !!\n\n");
        continue;
    }
    else
    {
        printf("plaintext len: %d\n", plaintext_len);
        plaintext[plaintext_len] = '\0';
        num_bytes_read = fwrite(plaintext, sizeof(char), plaintext_len, f_dec);
        fclose(f_dec);          
        printf("Decrypted: %s\n", filename);
        free(ciphertext);
        free(plaintext);
    }
}

私が試したこと:

ベクトルを使用せずに別のプログラムで手動で復号化し、完全に機能するため、envelope_open() 関数が機能します。 奇妙な理由で複数のファイルでは機能しません。

解決策 1

const char *filename_crypt = t[i].c_str();

する必要があります

const char *filename_crypt = t->c_str();

コメント

タイトルとURLをコピーしました