Как сохранить размер шифра AES_encrypt с точным расчетом размера? - PullRequest
0 голосов
/ 01 июня 2018

У меня возникли проблемы с текстом шифрования AES, и мне нужна небольшая помощь по поводу того же, вот пояснение, я использую эту функцию для преобразования простого текста в зашифрованный текст.

/*
 * Encrypt *len bytes of data
 * All data going in & out is considered binary (unsigned char[])
 */
unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
{
  /* max ciphertext len for a n bytes of plaintext is n + AES_BLOCK_SIZE -1 bytes */
  int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
  unsigned char *ciphertext = palloc(c_len);

  /* allows reusing of 'e' for multiple encryption cycles */
  EVP_EncryptInit_ex(e, NULL, NULL, NULL, NULL);

  /* update ciphertext, c_len is filled with the length of ciphertext generated,
    *len is the size of plaintext in bytes */
  EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);

  /* update ciphertext with the final remaining bytes */
  EVP_EncryptFinal_ex(e, ciphertext+c_len, &f_len);

  *len = c_len + f_len;
  return ciphertext;
}

Эта функцияотлично работает, когда мы используем шифрование, но когда я пытаюсь вычислить длину зашифрованного текста, используя strlen, я не получаю точную длину, у меня есть Google и нашел немного информации о печати зашифрованного текста в цикле for, используя% c, равный длинеразмером len.

мой вопрос: как мне сохранить зашифрованный текст в файле с точной длиной?поскольку strlen (зашифрованный текст) не дает точной длины, какой способ хранения зашифрованного текста?

Любая помощь будет высоко ценится :) Заранее спасибо

1 Ответ

0 голосов
/ 01 июня 2018

Весь смысл этого интерфейса в том, что *len теперь содержит длину зашифрованного текста (я полагаю, он начинается со значения простого текста).EncryptFinal добавляет заполнение, так что длина изменяется.Если обычный имеет длину 16, зашифрованный текст будет иметь длину 32.

Вы не можете использовать strlen для вычисления длины.Это можно сделать в случае записей argv, так как они являются строками.key здесь больше похоже на пароль.Это довольно слабая система шифрования (жестко закодированная соль, 5 раундов и т. Д.).

После ciphertext = aes_encrypt(&en, (unsigned char *)input[i], &len);, если вы хотите записать зашифрованный текст в файл, просто сделайте что-то вроде

 FILE *cipher = NULL; 
 cipherfile=fopen("mycipher.txt", "wb"); 
 if (NULL ==cipherfile){ /* error handling here */
 }
 if (1 != fwrite(ciphertext, len, 1, cipherfile)){ /* error handling */
 }
 close(cipherfile);

, потому что длина зашифрованного текста равна len.Оригинальный автор на GitHub , вероятно, намеревался использовать вместо него olen (теперь он не используется).Таким образом (лучше) &olen можно использовать в обоих вызовах (aes_encrypt и fwrite) выше, а затем len сохраняет длину ввода, которую можно использовать при проверке дешифрования и т. Д.

...