В EVP_DecryptFinal отсутствует 8 байт - PullRequest
6 голосов
/ 07 января 2012

это мой первый вопрос, поэтому, пожалуйста, скажите мне, если я что-то не так делаю:).

Моя проблема в том, что я использую

EVP_DecryptInit(&ctx1, EVP_des_ecb(), tmpkey, NULL);
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength);
EVP_DecryptFinal(&ctx1, keysigout, &outlf);
printf("DECLEN:%i",outlu + outlf);

для расшифровки двоичного файла.Файл имеет длину 248 байт, но printf только сообщает мне, что EVP расшифровал 240 байт.keysigfilelength равен 248 и должен сообщить обновлению, что необходимо расшифровать 248 байт.

Я не понимаю, почему это не работает, и был бы рад, если вы меня просветите.

Редактировать: Я только что зашифровалфайл вручную с помощью команды

openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00

, и он вырос на 8 байт: O.Я до сих пор не знаю, откуда они берутся, но не думаю, что общая ошибка в моей программе вызвана этим.

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

Можно ли публиковать всю мою программу для вас?

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Я надеюсь, что хорошо ответить на мой собственный вопрос.

EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength);
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf);

Проблема заключалась в том, что отсутствующий результат был, DecryptFinal снова попытался расшифровать весь блок. Когда я добавил результат, я получил 7 байт в outlf, и это сработало. Для дальнейшего использования я добавлю всю функцию ниже. Ожидается, что ключ и iv будут одним блоком данных.

int decrypt(const EVP_CIPHER *cipher,unsigned char *key, unsigned char *encryptedData, int encryptedLength,unsigned int * length, unsigned char ** decryptedData)
{
  int decryptedLength = 0, lastDecryptLength = 0, ret;
  unsigned char * iv = NULL;
  EVP_CIPHER_CTX *cryptCtx = EVP_CIPHER_CTX_new();
  EVP_CIPHER_CTX_init(cryptCtx);
  *decryptedData = malloc (encryptedLength * sizeof(char));

  if(cipher->iv_len != 0) iv = key + cipher->key_len;

  EVP_DecryptInit_ex(cryptCtx, cipher, NULL, key, iv);
  EVP_DecryptUpdate(cryptCtx, *decryptedData, &decryptedLength, encryptedData, encryptedLength);
  ret = EVP_DecryptFinal_ex(cryptCtx, *decryptedData + decryptedLength, &lastDecryptLength);

  *length = decryptedLength + lastDecryptLength;

  EVP_CIPHER_CTX_free(cryptCtx);
  EVP_cleanup();
  return ret;
}
0 голосов
/ 07 января 2012

Поскольку блочные шифры действительно хотят работать только с входом, кратным их размеру блока, вход обычно дополняется, чтобы соответствовать этому требованию.По умолчанию для многих программ (включая openssl enc) используется PKCS # 5 padding

Если открытый текст не кратен 8 байтам, то добавляются байты заполнения, так что это так.это уже кратно 8 байтам, затем добавляется 8 байтов заполнения.Таким образом, вполне нормально, что зашифрованные данные длиннее, чем обычный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...