Подтвердить что ты не робот

Шифрование и дешифрование небольшого файла с помощью openssl

Я хочу написать небольшую программу на C/С++, которая читает небольшой текстовый файл и шифрует его, используя "внутренний" ключ. Затем я также хочу написать еще одну небольшую программу, которая может расшифровать зашифрованный файл, используя внутренний ключ.

Я посмотрел на сайт openSSL и нашел googled, но нашел не простой пример, кто-нибудь когда-либо пытался это сделать?

4b9b3361

Ответ 1

В идеале вы можете использовать существующий инструмент, например ccrypt, но здесь:

#include <openssl/aes.h>

/* ... */


{
  int bytes_read, bytes_written;
  unsigned char indata[AES_BLOCK_SIZE];
  unsigned char outdata[AES_BLOCK_SIZE];

  /* ckey and ivec are the two 128-bits keys necesary to
     en- and recrypt your data.  Note that ckey can be
     192 or 256 bits as well */
  unsigned char ckey[] =  "thiskeyisverybad";
  unsigned char ivec[] = "dontusethisinput";

  /* data structure that contains the key itself */
  AES_KEY key;

  /* set the encryption key */
  AES_set_encrypt_key(ckey, 128, &key);

  /* set where on the 128 bit encrypted block to begin encryption*/
  int num = 0;

  while (1) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp);

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num,
           AES_ENCRYPT);

    bytes_written = fwrite(outdata, 1, bytes_read, ofp);
    if (bytes_read < AES_BLOCK_SIZE)
  break;
  }
}

Расшифровка выполняется путем вызова AES_cfb128_encrypt с AES_DECRYPT в качестве последнего параметра. Обратите внимание, что этот код не получил ничего больше, чем самое элементарное тестирование, и что вы действительно должны использовать правильные 8-битные случайные данные для ckey и ivec.

EDIT. Кажется, что AES_cfb128_encrypt принимает данные произвольной длины, поэтому вам не требуется шифровать в блоках из AES_BLOCK_SIZE (16) байтов.

Ответ 2

Предыдущие ответы указывают на то, как делать то, что вы просили.

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

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

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

Если приложение, которое вы имеете в виду, очень специфично, это означает, что ваша установка может выглядеть "безопасно", но это не так. В этих случаях обычно лучше не шифровать вообще, так что никто из них не подходит для этого ложного чувства безопасности...

Очень хорошо, что вы ищете стандартные библиотеки для шифрования (вместо реализации/создания алгоритма самостоятельно), но protocoll (как приложения, ключи и сообщения используются и обмениваются) по меньшей мере так же важен, как и сам шифровать. Возможно, вы захотите, чтобы ваши идеи были проверены кем-то, кто занимался криптографией, чтобы рассказать вам о слабых сторонах. (Я уверен, что такого достаточно здесь, в StackOverflow.;-))

Ответ 3

OpenSSL специально занимается внедрением SSL и TLS, которые являются протоколами для шифрования данных по сети. Поскольку вы просто пытаетесь зашифровать файл, можно использовать OpenSSL, но не идеально.

Вместо этого я бы использовал что-то вроде BeeCrypt или Crypto ++ ® Library 5.6.0, которые предоставляют примеры для их использования.