Решение для безопасного шифрования пар ключей в Delphi и PHP?

Мое приложение отправляет зашифрованные файлы через Интернет, мне нужно уметь делать следующее:

  1. (Клиентская часть Delphi 2010): шифрование файлов с помощью открытого ключа, поставляемого с моим приложением, и загрузка его на сервер.
  2. (PHP на стороне сервера): расшифруйте загруженный файл, используя мой закрытый ключ, хранящийся на сервере.
  3. (Работа над загруженным файлом ...)

Звучит просто, но я не могу найти надежного кода / компонента, я нашел эти компоненты:

  1. DCPcrypt. Это то, что я использую сейчас в разработке, но, похоже, не поддерживает шифрование на основе пар ключей (RSA?)

  2. GnuPgp (GPL), поэтому я не могу использовать его в своем коммерческом приложении.

  3. TurboPower LockBox 3: поддерживает шифрование пары ключей, но очень загадочно (без документации AFAIK) и не кажется для поддержки шифрования файлов.

У меня вопрос: существует ли компонент безопасного / надежного шифрования, который:

  1. Достичь того, что я описал выше (т. Е. Шифрования пары ключей)
  2. Можно расшифровать с помощью PHP
  3. Работает с большими файлами / потоками
  4. (Здесь мечта!) Есть простая демонстрация delphi / php, которая показывает, как это сделать? :)
  5. Только решения FOSS, я уже слишком много денег :)

person TheDude    schedule 22.05.2012    source источник
comment
Хорошая бесплатная криптовалюта не имеет большого смысла - для этого требуется довольно много навыков программирования, безопасности и математики.   -  person Eugene Mayevski 'Callback    schedule 22.05.2012
comment
Обычно вы не зашифруете весь файл с помощью RSA или подобного, потому что это обычно медленнее. Вы шифруете симметричным алгоритмом, а затем шифруете используемый ключ асимметричным. Если вы используете правильно реализованный стандартный алгоритм, данные можно будет использовать как в PHP, так и в Delphi. LockBox 3 ИМХО - не очень хорошая библиотека.   -  person Mad Hatter    schedule 24.05.2012
comment
@ EugeneMayevski'EldoSCorp: У вас есть хороший купон на скидку, который вы можете дать мне для SecureBlackbox? :)   -  person TheDude    schedule 30.08.2012
comment
@Gdhami, если вы свяжетесь со мной в частном порядке.   -  person Eugene Mayevski 'Callback    schedule 30.08.2012


Ответы (2)


Я бы выбрал OpenSSL.
Кажется, PHP имеет много поддержки для этого, хотя я на самом деле не пробовал: например, руководство и пример здесь.

Delphi можно заставить хорошо работать с OpenSSL, немного поработав, используя вещи, о которых я упоминал много раз: http://www.disi.unige.it/person/FerranteM/delphiopenssl/. На этой странице тоже есть несколько хороших примеров. И взгляните на импорт Indy OpenSSL.

Не специфические компоненты, но определенно бесплатные, гибкие и с полными возможностями для стрельбы себе в ногу с точки зрения безопасности :-)

РЕДАКТИРОВАТЬ:

Для Delphi я бы подумал об использовании функций EVP_Seal *, и вы можете найти мою версию урезанного файла libeay32.pas в этом ответе SO . Вы это сделали, поскольку Indy не показывает и не реализует большую часть / какие-либо из фактических функций EVP_, поэтому вам нужно импортировать объявления функций и несколько других подпрограмм.

Для PHP эта ссылка кажется правильным аналогом.

В качестве бонуса это должно дать вам представление о том, как использовать материал EVP_Seal * (не проверенный):

function EVPSeal(ASource: TBytes; const APublicKey: PEVP_PKEY; out Key: TBytes; out IV: TBytes): TBytes; 
var
  cipher: PEVP_CIPHER;
  ctx: EVP_CIPHER_CTX;
  buf: TBytes;
  block_size, buf_start, out_len, keysize: integer;
  ek: array[0..0] of PByte;
  ekl: array[0..0] of integer;
  pubk: array[0..0] of PEVP_PKEY;
begin
  keysize := EVP_PKEY_size(APublicKey);
  cipher := EVP_aes_256_cbc;
  SetLength(IV, EVP_MAX_IV_LENGTH);
  SetLength(Key, keysize);
  ek[0] := @Key[0];
  pubk[0] := APublicKey;
  buf_start := 0;
  EVP_CIPHER_CTX_init(@ctx);
  try
    EVP_SealInit(@ctx, cipher, @ek[0], @ekl, @IV[0], @pubk[0], 1);
    block_size := EVP_CIPHER_CTX_block_size(@ctx);
    SetLength(buf, Length(ASource) + block_size);
    SetLength(Key, ekl[0]);
    EVP_SealUpdate(@ctx, @buf[buf_start], out_len, @ASource[0], Length(ASource));
    Inc(buf_start, out_len);
    EVP_SealFinal(@ctx, @buf[buf_start], out_len);
    Inc(buf_start, out_len);
    SetLength(buf, buf_start);
    result := buf;
  finally
    EVP_CIPHER_CTX_cleanup(@ctx);
  end;
end;
person shunty    schedule 23.05.2012

Ах, крипто. Есть поговорка о программисте, который знает, что криптовалюта намного опаснее, чем программист, который ничего не знает.

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

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

person Leonardo Herrera    schedule 22.05.2012
comment
Итак, ваш ответ: нет или да, но это сложнее, чем я хотел, и однажды я с кем-то поссорился? - person Rob Kennedy; 22.05.2012
comment
@RobKennedy - если вы чувствуете, что ответ не стоит вашего времени, тогда голосуйте против. - person Leonardo Herrera; 22.05.2012
comment
Я просто не уверен, каков ваш ответ . - person Rob Kennedy; 22.05.2012
comment
На что вы потратите время или деньги? Я предоставил ссылку на предыдущий вопрос, который содержит ссылки на несколько библиотек с открытым исходным кодом, а также на коммерческий продукт, который, IMHO, как раз то, что вам нужно, если вам нужна криптовалюта в Delphi. Больше нечего было добавить, потому что их просто не так много (тем более, учитывая, что GPL исключена). - person Leonardo Herrera; 23.05.2012