Я использовал приведенный выше код из Linux libcrypto AES-128 CB C Шифрование / дешифрование работает на Ubuntu, но не на Raspberry Pi
Здесь слегка изменили код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#include <openssl/crypto.h>
unsigned char aes_key[]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
/* Print Encrypted and Decrypted data packets */
void print_data(const char *tittle, const void* data, int len);
int main( )
{
/* Input data to encrypt */
unsigned char aes_input[]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
fprintf(stderr,"%s\n",SSLeay_version(SSLEAY_VERSION));
/* Init vector */
//unsigned char iv[AES_BLOCK_SIZE];
unsigned char iv[]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
//memset(iv, 0x00, AES_BLOCK_SIZE);
/* Buffers for Encryption and Decryption */
unsigned char enc_out[sizeof(aes_input)];
unsigned char dec_out[sizeof(aes_input)];
/* AES-128 bit CBC Encryption */
AES_KEY enc_key, dec_key;
AES_set_encrypt_key(aes_key, sizeof(aes_key)*8, &enc_key);
AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT);
FILE *fp = fopen("id_encrypted","w");
fwrite(enc_out, sizeof(enc_out), 1, fp); // write all the new buffer
fclose(fp);
/* AES-128 bit CBC Decryption */
//memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly
//unsigned char iv[AES_BLOCK_SIZE];
unsigned char iv2[]={0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf};
AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits
AES_cbc_encrypt(enc_out, dec_out, sizeof(aes_input), &dec_key, iv2, AES_DECRYPT);
/* Printing and Verifying */
print_data("\n Original ",aes_input, sizeof(aes_input)); // you can not print data as a string, because after Encryption its not ASCII
print_data("\n Encrypted",enc_out, sizeof(enc_out));
print_data("\n Decrypted",dec_out, sizeof(dec_out));
return 0;
}
void print_data(const char *tittle, const void* data, int len)
{
printf("%s : ",tittle);
const unsigned char * p = (const unsigned char*)data;
int i = 0;
for (; i<len; ++i)
printf("%02X ", *p++);
printf("\n");
}
Если вы запустите код, вы увидите следующий вывод:
OpenSSL 1.1.1 11 сентября 2018
Оригинал: 00 01 02 03 04 05 06 07 08 09 0A 0B 0 C 0D 0E 0F
Зашифровано: C6 A1 3B 37 87 8F 5B 82 6F 4F 81 62 A1 C8 D8 79
Расшифровано: 00 01 02 03 04 05 06 07 08 09 0A 0B 0 C 0D 0E 0F
Моя цель - расшифровать зашифрованный выходной файл [с именем id_encrypted в коде] с помощью openssl CLI.
Команда, которую я использовал, это
openssl enc -d -v -aes-128-cbc -in id_encrypted -out id_decrypted -K "0123456789abcdef" -iv "0123456789abcdef"
, но ниже сообщения об ошибке и выходной файл пуст.
bufsize=8192
hex string is too short, padding with zero bytes to length
hex string is too short, padding with zero bytes to length
bad decrypt
139861660053952:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:../crypto/evp/evp_enc.c:537:
Может кто-нибудь помочь с объяснением, почему это не так за работой ? Я предполагаю, что проблема связана с командой openssl, которую я использую, поскольку мы видим, что код работает как для шифрования, так и для дешифрования.