我的应用程序通过互联网发送加密文件,我需要能够执行以下操作:
听起来很简单,但我找不到任何可靠的代码/组件,我找到了这些组件:
DCPcrypt。这就是我现在正在开发中使用但似乎不支持基于密钥对的加密(RSA?)
GnuPgp(GPL)所以我无法在商业应用中使用它。
TurboPower LockBox 3:支持密钥对加密,但非常神秘(没有文档AFAIK),似乎不支持文件加密。
我的问题是:是否有安全/可靠加密组件:
答案 0 :(得分:3)
我会选择OpenSSL PHP似乎有很多支持,虽然我还没有尝试过: 例如the manual和an example here。
Delphi可以通过一些工作与OpenSSL很好地协同工作,使用我在这里多次提到的东西: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;
答案 1 :(得分:2)
在一个非常相似的方面,我花了很多时间试图找到一种使用开源来进行数字XML签名的方法。我只有managed to get so far才能获得rock solid third party library。它纯粹的货币意义上并不便宜,但到目前为止我最好的投资之一。
(真实的故事:我实际上与这个图书馆的作者有点火焰,甚至从评论中删除了。唉,我最后还是从他那里买了。去看看。)