шифрование и дешифрование с помощью openssl AES на Linux - PullRequest
1 голос
/ 28 мая 2020

Я хочу использовать AES для связи tcp / ip. Однако возникли трудности с включением AES. В процессе декодирования генерируются фиктивные значения или значения удаляются. Буду признателен, если вы окажете мне небольшую помощь.

int main(void)
{
unsigned char mykey[] = "01234567890123456789012345678\0";
unsigned  char iv[] = "0123456789012\0";
char buf[BUF_SIZE]="hi";
char enc[BUF_SIZE];
char dec[BUF_SIZE];
AES_encryption(buf,enc,mykey,iv);
AES_decryption(enc,dec,mykey,iv);
printf("buf : %s\n",buf);
printf("enc: %s\n",enc);
printf("dec: %s\n", dec);
return 0;
}


void AES_encryption(char plainfn[], char cipherfn[], unsigned char key[],unsigned char iv[])
   {

    EVP_CIPHER_CTX ctx;
    int in_len, out_len=0;
    in_len=strlen(plainfn);
    EVP_CIPHER_CTX_init(&ctx);
    EVP_CipherInit_ex(&ctx,EVP_aes_128_cbc(),NULL,key,iv,AES_ENCRYPT);
    EVP_CipherUpdate(&ctx,cipherfn,&out_len,plainfn,in_len);
    EVP_CipherFinal_ex(&ctx,cipherfn,&out_len);

    EVP_CIPHER_CTX_cleanup(&ctx);
    }

void AES_decryption(char cipherfn[], char plainfn[], unsigned char key[], unsigned char iv[])
    {

    EVP_CIPHER_CTX ctx;
    int in_len, out_len=0;
    in_len=strlen(cipherfn);
    EVP_CIPHER_CTX_init(&ctx);
    EVP_CipherInit_ex(&ctx,EVP_aes_128_cbc(),NULL,key,iv,AES_DECRYPT);
    EVP_CipherUpdate(&ctx,plainfn,&out_len,cipherfn,in_len);
    EVP_CipherFinal_ex(&ctx,plainfn,&out_len);
    EVP_CIPHER_CTX_cleanup(&ctx);
    }

Вот такие результаты. buf: привет en c: U▒▒B▒ac▒▒] ▒▒▒▒Y▒- de c: привет?! ▒

1 Ответ

1 голос
/ 28 мая 2020

Основная проблема заключается в том, что AES_encryption, скорее всего, помещает символы NULL в буфер enc. Затем вы подсчитываете "длину строки" зашифрованного буфера enc с помощью strlen() в AES_decryption. Это определенно неверно, поскольку дешифрование может быть остановлено слишком рано, поэтому не читается весь входной буфер.

Вероятно, вам следует передать аргумент размера буфера для шифрования и дешифрования функций, чтобы правильно зашифровать / расшифровать буфер (ы). Вычислите длину строки перед шифрованием и каким-то образом передайте ту же длину буфера на этап дешифрования. Вероятно, вам придется кодировать длину строки в вашем buf перед фактическими данными.

Кроме того, поскольку буфер enc по определению зашифрован, вы не можете просто printf ("% s", en c ) по той же причине, по которой strlen () для него не работает. Вам нужно напечатать символы один за другим с помощью putchar () или каким-либо другим способом, который невосприимчив к нулевым символам.

...