Шифрование и дешифрование небольшого файла с использованием openssl - PullRequest
22 голосов
/ 17 июня 2009

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

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

Ответы [ 3 ]

21 голосов
/ 18 июня 2009

В идеале, вы могли бы использовать существующий инструмент, такой как 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.

РЕДАКТИРОВАТЬ : Кажется, AES_cfb128_encrypt принимает данные произвольной длины, поэтому вам не нужно шифровать в блоках AES_BLOCK_SIZE (16) байтов.

13 голосов
/ 18 июня 2009

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

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

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

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

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

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

1 голос
/ 17 июня 2009

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

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

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