5

我的应用程序通过 Internet 发送加密文件,我需要能够执行以下操作:

  1. 客户端 Delphi 2010) :使用我的应用程序附带的公钥加密文件并将其上传到服务器
  2. 服务器端 PHP) :使用我存储在服务器上的私钥解密上传的文件
  3. (处理上传的文件...)

听起来很简单,但我找不到任何可靠的代码/组件,我找到了这些组件:

  1. 数字加密货币。这是我现在在开发中使用的,但似乎不支持基于密钥对的加密(RSA?)

  2. GnuPgp (GPL) 所以我不能在我的商业应用程序上使用它。

  3. TurboPower LockBox 3:确实支持密钥对加密,但非常神秘(没有文档 AFAIK)并且似乎不支持文件加密。

我的问题是:是否有一个安全/可靠的加密组件:

  1. 实现我上面描述的(即密钥对加密)
  2. 可以使用PHP解密
  3. 适用于大文件/流
  4. 在这里做梦!)有一个简单的 delphi/php 演示来展示如何做到这一点?:)
  5. 请仅使用 FOSS 解决方案,我已经超出预算了 :)
4

2 回答 2

3

我会选择 OpenSSL。
PHP 似乎对它有很多支持,虽然我还没有真正尝试过:例如手册这里的示例

使用我在这里多次提到的东西:http ://www.disi.unige.it/person/FerranteM/delphiopenssl/ 可以通过一些工作使 Delphi 与 OpenSSL 一起工作。该页面上也有一些很好的例子。并查看 Indy OpenSSL 导入。

不是特定的组件,但绝对是免费的、灵活的,并且有充分的可能性在安全方面拍摄自己的脚 :-)

编辑:

对于 Delphi,我会考虑使用 EVP_Seal* 函数,您可以在此 SO answer中找到我的精简版 libeay32.pas 文件。您需要这样做,因为 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;
于 2012-05-23T07:50:32.807 回答
2

啊,加密货币。有一种说法是,一个对加密知之甚少的程序员比一个对加密一无所知的程序员危险得多。

与此类似,我花了相当长的时间试图找到一种使用开源进行数字 XML 签名的方法。我只设法做到了这么远,然后才得到一个坚如磐石的第三方库。从纯粹的货币意义上来说,它并不便宜,但它是我迄今为止最好的投资之一。

(真实故事:我实际上与这个图书馆的作者发生了一场小冲突,甚至被从评论中删除。唉,我最终从他那里买了东西。去想。)

于 2012-05-22T18:46:06.207 回答