0

このアルゴリズムを使用してEVP Symmetric Encryption and Decryption、テキスト ファイルを暗号化および復号化しています。

暗号化作業ファイル、新しい暗号化ファイルが生成されますが、ファイルを復号化しようとするEVP_DecryptFinal_exと、最初に呼び出されたときに常にクラッシュします。

2 つの Visual Studio プロジェクトを使用しています。1 つは暗号化用、もう 1 つは復号化用です。
私が使用しているライブラリは、DEBUG モードでビルドされていると思われます (.pdb ファイルがあるため)。それで、私のプロジェクトもビルドされます。(リリース モードを選択すると、コンパイラは openssl インクルード ヘッダーを見つけることができなくなります)。

これは私が得るエラーです:

digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

私はC++ 11バージョンを使用しています。これが私のコードです:

void Cipher::Encrypt(const byte key[KEY_SIZE], const byte iv[BLOCK_SIZE], const secure_string& ptext, secure_string& ctext) {
    EVP_CIPHER_CTX_free_ptr ctx(EVP_CIPHER_CTX_new(), ::EVP_CIPHER_CTX_free);
    int rc = EVP_EncryptInit_ex(ctx.get(), EVP_aes_256_cbc(), NULL, key, iv);
    if (rc != 1)
        throw std::runtime_error("EVP_EncryptInit_ex failed");

    // Recovered text expands upto BLOCK_SIZE
    ctext.resize(ptext.size() + BLOCK_SIZE);
    int out_len1 = (int)ctext.size();

    rc = EVP_EncryptUpdate(ctx.get(), (byte*)&ctext[0], &out_len1, (const byte*)&ptext[0], (int)ptext.size());
    if (rc != 1)
        throw std::runtime_error("EVP_EncryptUpdate failed");

    int out_len2 = (int)ctext.size() - out_len1;
    rc = EVP_EncryptFinal_ex(ctx.get(), (byte*)&ctext[0] + out_len1, &out_len2);
    if (rc != 1)
        throw std::runtime_error("EVP_EncryptFinal_ex failed");

    // Set cipher text size now that we know it
    ctext.resize(out_len1 + out_len2);
}

void Cipher::Decrypt(const byte key[KEY_SIZE], const byte iv[BLOCK_SIZE], const secure_string& ctext, secure_string& rtext) {
    EVP_CIPHER_CTX_free_ptr ctx(EVP_CIPHER_CTX_new(), ::EVP_CIPHER_CTX_free);
    int rc = EVP_DecryptInit_ex(ctx.get(), EVP_aes_256_cbc(), NULL, key, iv);
    if (rc != 1)
        throw std::runtime_error("EVP_DecryptInit_ex failed");

    // Recovered text contracts upto BLOCK_SIZEB
    rtext.resize(ctext.size());
    int out_len1 = (int)rtext.size();

    rc = EVP_DecryptUpdate(ctx.get(), (byte*)&rtext[0], &out_len1, (const byte*)&ctext[0], (int)ctext.size());
    if (rc != 1)
        throw std::runtime_error("EVP_DecryptUpdate failed");

    int out_len2 = (int)rtext.size() - out_len1;
    rc = EVP_DecryptFinal_ex(ctx.get(), (byte*)&rtext[0] + out_len1, &out_len2);
    if (rc != 1) {
        ERR_print_errors_fp(stderr);
        throw std::runtime_error("EVP_DecryptFinal_ex failed");
    }

    // Set recovered text size now that we know it
    rtext.resize(out_len1 + out_len2);
}
int main(int argc, char* argv[])
{
    // Load the necessary cipher
    EVP_add_cipher(EVP_aes_256_cbc());

    // create Cipher object
    Cipher cipher;
    ifstream f("d:/temp.YML");
    ofstream out("d:/tempDecrypt.YML");

    byte key[KEY_SIZE] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2};
    byte iv[BLOCK_SIZE] = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6};
    //cipher.gen_params(key, iv);

    secure_string line;
    secure_string temp;
    while (getline(f, line)) {
        cipher.Decrypt(key, iv, line, temp);
        std::cout << temp << std::endl;
        out << temp;
    }

    OPENSSL_cleanse(key, KEY_SIZE);
    OPENSSL_cleanse(iv, BLOCK_SIZE);

    return 0;
}

また、パディングの問題である可能性があることも読みましたが、そうであるかどうか、どうすればよいかわかりません。私は暗号化が得意ではありません。

さらに進める方法についての指針は大歓迎です。さらに情報が必要な場合はお知らせください。

4

0 に答える 0