2012-05-22 12 views
5

私のアプリケーションは、インターネット上で暗号化されたファイルを送信し、私は次の操作を実行できるようにする必要があります。Delphi&PHPで安全な鍵ペア暗号化ソリューション?

  1. クライアント側のDelphi 2010):私のアプリケーション &に同梱されて公開鍵を使って暗号化したファイルは、それをアップロードサーバーへ
  2. サーバー側のPHP):サーバー
  3. に保存されている私の秘密鍵(アップロードされたファイルの作業を...)を使用して、アップロードされたファイルを復号化

    1. DCPcrypt

    は簡単に聞こえるが、私は任意の信頼性の高いコード/コンポーネントを見つけることができない、私は、これらのコンポーネントを発見しました。これは私が今開発中に使用しているものの、キーペアベースの暗号化(RSA?)をサポートしていないようです。

  4. (GPL)私は商用アプリケーションで使用できません。

  5. TurboPower LockBox 3:キーペアの暗号化をサポートしていますが、非常に暗号がありません(ドキュメント化されていないAFAIK)。ファイル暗号化をサポートしていないようです。

私の質問は:

  1. は(。つまり、鍵ペアの暗号化を)私は上記のものを達成
  2. PHPを使用して復号化することができます:は安全な/信頼性の高い暗号化コンポーネントがあります
  3. 大きなファイル/ストリーム
  4. ここに夢見て!)これを行う方法を示す簡単なdelphi/phpデモはありますか? :)
  5. FOSSソリューションは、私が予算をオーバーwayyyすでにてるください:)
+6

グッド暗号は、ほとんど意味がない - それはスキルのかなり多くが必要ですプログラミング、セキュリティ、数学の両方で –

+0

通常、RSAなどを使用してファイル全体を暗号化することはありません。なぜなら、通常は遅いからです。非対称鍵で使用される鍵を暗号化するのではなく、対称アルゴリズムで暗号化します。あなたが正しく実装された標準アルゴリズムを使用する限り、データはPHPとDelphiの両方から使用可能になります。 LockBox 3 IMHOは良いライブラリではありません。 –

+0

@ EugeneMayevski'EldoSCorp:あなたはSecureBlackboxのために私に与えることができる素晴らしい割引クーポンを持っていますか? :) – TheDude

答えて

2

ああ、暗号。ほとんど知られていないものよりもはるかに危険な暗号を知っているプログラマについての話があります。

私はオープンソースを使用してデジタルXML署名を行う方法を見つけようとかなりの時間を費やしました。私はmanaged to get so farを座屈してからrock solid third party libraryにする前にだけです。それは純粋な金銭的意味では安いものではなく、これまでの私の最高の投資の一つです。

(実話:。。。私は実際にああ、私は彼から購入することになったとしてもコメントから削除されたこのライブラリの作者と少しflamewarになった姿を行く)

+0

あなたの答えは* no *、または* yesですが、私が追求しようとしていたよりも難しく、かつて誰かと議論しましたか? –

+0

@RobKennedy - あなたが答えがあなたの時間に価値がないと感じる場合は、downvote away。 –

+3

私はちょうどあなたの答えが*であるか分かりません。 –

3

私は考えOpenSSLに行く。
PHPは実際にそれを試していませんが、PHPを十分にサポートしているようです。 たとえば、the manualan example hereのようになります。

Delphiは、私がここで何度も言及したものを使用して、少しの作業でOpenSSLとうまく機能するようにすることができます:http://www.disi.unige.it/person/FerranteM/delphiopenssl/。そのページの良い例もあります。そしてIndy OpenSSLのインポートを見てみましょう。

ない特定のコンポーネントが、間違いなく自由に、柔軟かつ自分自身を撮影のための完全な可能性と、セキュリティ面では、

EDIT :-)足に:デルファイのために

私は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; 
関連する問題