こんにちは、EVP_Encrypt Openssl ライブラリを使用するプログラムを作成しようとしていますが、問題が発生しています。私は、 openssl フグの簡単な例でガベージ文字を挿入するという投稿の支援をガイドとして使用し、それが良い出発点になるはずだと考えました。ただし、何かが間違っていると確信していますが、何が原因かわかりません。openssl を使用して暗号文を復号化できるかどうかをテストしているため、何かがおかしいことはわかっています。コマンドは次のとおりです。プログラムによって作成された暗号文のファイルはcat file.enc | openssl bf-cbc -d -K cafefacedeadbeef -iv 0 > output
どこにありますか。file.enc
Openssl コマンドを実行した後、このエラー メッセージが表示されます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;
}