Простой способ реализовать криптографию с открытым ключом в C ++? - PullRequest
5 голосов
/ 13 августа 2011

Я хочу иметь возможность подписать файл.Под этим я подразумеваю, что получатель может проверить, что файл действительно от меня, и просмотреть его содержимое.Есть ли какой-нибудь простой способ сделать это в C ++?

Я только что взглянул на статью PGP в Википедии, но они потеряли меня где-то посреди «хеширования, сжатия данных, криптографии с симметричным ключом инаконец, криптография с открытым ключом ».В идеале, я хотел бы, чтобы библиотека имела функцию signString(string, privateykey), а получатель имел бы функцию readSignedString(string, publickey).Любое предложение?

Редактировать:

Я не уверен, что я использую правильный подход, поэтому вот что я пытаюсь сделать:

Я хочу реализовать простую защиту от пиратства в своем настольном приложении.Поэтому, когда пользователь покупает лицензию, я отправляю ему подписанный файл, содержащий его имя и адрес электронной почты.Затем пользователь устанавливает файл и приложение читает его: оно проверяет действительность подписи и отображает имя / адрес электронной почты (в поле «О программе»).Чтобы убедиться, что взломщики не могут сгенерировать эти файлы, мне нужно убедиться, что ключ для расшифровки файла не совпадает с ключом для его шифрования.Есть ли простой способ реализовать это?

Ответы [ 4 ]

6 голосов
/ 13 августа 2011

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

С OpenSSL вы можете использовать что-то вроде этого:

#include <openssl/evp.h>

EVP_MD_CTX ctx;
unsigned char signature[SIGNATURE_LEN];
int signature_len;

EVP_SignInit(&ctx, EVP_sha1());
EVP_SignUpdate(&ctx, data, size);
EVP_SignFinal(&ctx, signature, &signature_len, pkey);

И почти то же самое для проверки подписи, только с использованием EVP_ValidateInit, EVP_ValidateUpdate и EVP_ValidateFinal.Последняя функция возвращает 0/1, чтобы сказать, была ли проверка успешной или нет.

Вам все еще нужно получить ключ в приложение, для этого есть довольно много функций, в зависимости от того, откуда вы его читаете (файл / память / сертификат и т. д.)

2 голосов
/ 13 августа 2011

Вы также можете использовать Keyczar для шифрования и дешифрования вашего файла.

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

0 голосов
/ 17 августа 2011

Для информации, после того, как я попробовал большинство предложений здесь, я использовал инструмент командной строки openpgp.Он достаточно легкий после UPX, кроссплатформенный и делает то, что мне нужно, простым способом.

0 голосов
/ 13 августа 2011

Возможно, вы захотите взглянуть на GNU-версию PGP, GnuPG, в которой используется библиотека OSS libgcrypt http://directory.fsf.org/project/libgcrypt/, которая, похоже, может делать то, что вы хотите. http://www.gnupg.org/documentation/manuals/gcrypt/ для руководства.

...