Delphi和PHP中的安全密钥对加密解决方案?

5
我的应用程序通过互联网发送加密文件,我需要能够执行以下操作:
  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解决方案,我已经超预算了 :)

6
免费的好加密技术并不是一件容易的事情——它需要具备编程、安全和数学等方面的相当多技能。 - Eugene Mayevski 'Callback
通常情况下,您不会使用RSA或类似算法加密整个文件,因为它通常很慢。您可以使用对称算法进行加密,然后使用非对称算法加密所使用的密钥。只要使用正确实现的标准算法,数据就可以从PHP和Delphi中使用。在我看来,LockBox 3不是一个好的库。 - Mad Hatter
@EugeneMayevski'EldoSCorp:你手头有可以给我使用的SecureBlackbox的折扣优惠券么? :) - TheDude
如果您私下联系我,请@Gdhami。 - Eugene Mayevski 'Callback
2个回答

3
我建议使用OpenSSL。
PHP似乎对其有很好的支持,尽管我还没有实际尝试过:例如手册此处的示例。
通过一些工作,可以使Delphi与OpenSSL很好地配合使用,我在这里多次提到了相关内容:http://www.disi.unige.it/person/FerranteM/delphiopenssl/。该页面上也有一些很好的示例。并且可以查看Indy OpenSSL导入内容。
虽然不是特定的组件,但绝对是免费的、灵活的,并且具有完全可能让您在安全方面自食其果的可能性 :-)
编辑:
对于Delphi,我建议使用EVP_Seal*函数,您可以在此SO答案中找到我削减版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;

2
啊,加密技术。有句话说,懂一点加密技术的程序员比完全不懂的程序员更危险。
在一个非常相似的领域里,我花了很多时间寻找使用开源方式进行数字XML签名的方法。我只能做到这个程度,然后就选择购买一个非常可靠的第三方库。从纯经济意义上来看,它并不便宜,但是是我迄今为止最好的投资之一。
(真实故事:我曾经和这个库的作者发生过一点小争执,甚至被删除了评论。不过最终我还是从他那里购买了这个库。真是讽刺啊。)

那么,你的答案是“不”,还是“是,但比我愿意追求的要困难,而且我曾经和某人争论过”? - Rob Kennedy
@RobKennedy - 如果你觉得这个答案不值得你花时间,那就点个踩吧。 - Leonardo Herrera
3
我不确定你的答案是什么。 - Rob Kennedy
你会花费时间还是金钱?我提供了一个链接到以前的问题,其中包含几个开源库的链接,以及一个商业产品的链接,我认为如果你需要在Delphi中使用加密,这正是你所需要的。没有其他要补充的,因为实际上并没有太多选择(尤其是考虑到GPL已经被排除在外)。 - Leonardo Herrera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接