首页 文章

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

提问于
浏览
5

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

  • Client side Delphi 2010) :使用 public key shipped with my application 加密文件并将其上传到服务器

  • Server side PHP) :使用我的 private key stored on server 解密上传的文件

  • (处理上传的文件......)

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

  • DCPcrypt . 这就是我似乎支持基于密钥对的加密(RSA?)

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

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

My question is: 有一个 secure / reliable 加密组件:

  • 实现我上面描述的内容(即密钥对加密)

  • 可以使用PHP解密

  • 适用于 large files/streams

  • Dreaming here! )有一个简单的delphi / php演示,展示了如何做到这一点? :)

  • 只有FOSS解决方案,我已经超出预算了:)

2 回答

  • 3

    我会选择OpenSSL .
    PHP似乎有很多支持,虽然我还没有尝试过它:例如the manualan example here .

    使用OpenSSL可以很好地使用Delphi,使用我在这里多次提到的东西:http://www.disi.unige.it/person/FerranteM/delphiopenssl/ . 该页面上也有一些很好的例子 . 并看看Indy OpenSSL的进口情况 .

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

    编辑:

    对于Delphi,我会考虑使用EVP_Seal *函数,你可以在this SO answer找到我的版本的减少libeay32.pas文件 . 你知道这是因为Indy没有表现或实现太多/任何实际的EVP_函数,所以你需要导入函数声明和一些其他例程 .

    对于PHP this link似乎是正确的对应物 .

    作为奖励,这应该让您了解如何使用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签名的方法 . 我只是managed to get so far才能屈服并获得rock solid third party library . 它在纯粹的货币意义上并不便宜,但到目前为止我最好的投资之一 .

    (真实的故事:我实际上与这个图书馆的作者进行了一场小小的抨击,甚至从评论中删除了 . 唉,我最后还是从他那里买了 . 去看看 . )

相关问题