1

こんにちは、EVP_Encrypt Openssl ライブラリを使用するプログラムを作成しようとしていますが、問題が発生しています。私は、 openssl フグの簡単な例でガベージ文字を挿入するという投稿の支援をガイドとして使用し、それが良い出発点になるはずだと考えました。ただし、何かが間違っていると確信していますが、何が原因かわかりません。openssl を使用して暗号文を復号化できるかどうかをテストしているため、何かがおかしいことはわかっています。コマンドは次のとおりです。プログラムによって作成された暗号文のファイルはcat file.enc | openssl bf-cbc -d -K cafefacedeadbeef -iv 0 > outputどこにありますか。file.encOpenssl コマンドを実行した後、このエラー メッセージが表示されますbad decrypt 7418:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:330: 。この問題は、初期化ベクトルを 0 にしようとしているという事実、またはキーを読み取っている方法に関連している可能性がありますが、肯定的ではありません。どんな助けでも素晴らしいでしょう。

暗号化機能:

void encrypt(unsigned char *key, unsigned char* msg)
{
        unsigned char iv[8]={0};

        int length = 0;
        EVP_CIPHER_CTX enc_struct;
        EVP_CIPHER_CTX_init(&enc_struct);
        EVP_EncryptInit(&enc_struct, EVP_bf_cbc(), key, iv);

        unsigned char* out = (unsigned char *) malloc(sizeof(unsigned char) * 1024 +EVP_MAX_BLOCK_LENGTH);

        if (EVP_EncryptUpdate(&enc_struct, out, &length, msg, 8) != 1)
        {
                printf("error update\n");
                exit(EXIT_FAILURE);
        }

        write(STDOUT_FILENO, out, length);

        int temp_length = 0;

        if(EVP_EncryptFinal(&enc_struct, out+length, &temp_length) !=1)
        {
                printf("error final\n");
                exit(EXIT_FAILURE);
        }

        write(STDOUT_FILENO, out+length, temp_length);

        EVP_CIPHER_CTX_cleanup(&enc_struct);

        free(out);
}

暗号化関数の呼び出しとキーの読み取り。

int main(int argc, char* argv[])
{
        setprogname("bf");
        setproctitle("-%s", "bf");
        int decrypt_flag = 0;
        int encrypt_flag = 0;
        int key_flag = 0;
        char ch;
        unsigned char raw_key[16] = {'\0'};

        if (argc <=1)
              help();
        memcpy(raw_key, argv[optind], 24);

        bytes_read = read(STDIN_FILENO, msg, 8);
        if (encrypt_flag)
                encrypt(raw_key, msg);
        else
                decrypt();
        return 0;
}
4

0 に答える 0