2009-06-17 2 views
19

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

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

+0

Вопрос с похожим примером http://stackoverflow.com/questions/3141860/aes-ctr-256-encryption-mode-of- operation-on-openssl – enthusiasticgeek

+0

Вы должны использовать 'EVP_ *' функции. В функциях 'EVP_ *' используется аппаратное обеспечение, например AES-NI (если доступно). См. [Симметричное шифрование и дешифрование EVP] (https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) в вики OpenSSL.Фактически, вы, вероятно, должны использовать аутентифицированное шифрование, поскольку оно обеспечивает * и * конфиденциальность и аутентичность. См. [EVP Authenticated Encryption and Decryption] (https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) в вики OpenSSL. – jww

ответ

0

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

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

+4

OpenSSL имеет как память, так и файл 'BIO', которые являются абстракцией. Библиотека в порядке с буферами памяти, файловыми буферами, сокетами и другими объектами ввода-вывода. Криптографическая часть библиотеки ('libcrypto.a') может использоваться автономно; и часть SSL ('libssl.a') построена поверх криптографии. – jww

20

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

+0

В некотором направлении от справочника aes help: Эта библиотека предоставляет не все возможные варианты размеров и режимов работы ключа. По этой причине и другие приложения должны использовать функции более высокого уровня L и т. Д. Вместо прямого вызова функций AES. – solotim

+0

@Michiel Budding ': Я использовал ваш код и вам нужно инициализировать int num; до размера ivec, чтобы он работал правильно. – Macarse

+0

Ваш код segfaults bigtime. – user99545

13

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

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

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

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

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

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

+0

+1 за хороший совет. Но, в отличие от того, что вы говорите, по крайней мере два ответа предложили НЕ делать симметричное шифрование (Эндрю Остин и мой). – bortzmeyer

+0

Я признаю, что не следил за ссылками, чтобы узнать, о чем они. ;-) – DevSolar

+2

Мне нужно немного возразить (и, конечно же, я бы); мы не знаем, что имеет в виду ОП. Если шифрование и дешифрование выполняются на разных компьютерах, внутренний ключ защищен. Если он просто хочет играть с библиотеками SSL, безопасность не имеет значения. Я дам вам +1 за совет, но «вы не должны этого делать» - это слишком сильное резюме. –

Смежные вопросы