Шифрование и дешифрование небольшого файла с помощью openssl
Я хочу написать небольшую программу на C/С++, которая читает небольшой текстовый файл и шифрует его, используя "внутренний" ключ. Затем я также хочу написать еще одну небольшую программу, которая может расшифровать зашифрованный файл, используя внутренний ключ.
Я посмотрел на сайт openSSL и нашел googled, но нашел не простой пример, кто-нибудь когда-либо пытался это сделать?
Ответы
Ответ 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, которые предоставляют примеры для их использования.