2012-05-22 12 views
5

Meine Anwendung sendet verschlüsselte Dateien über das Internet, muss ich der Lage sein, die folgenden Funktionen ausführen:Sichere Schlüsselpaar-Verschlüsselungslösung in Delphi & PHP?

  1. (Client-Seite Delphi 2010): es Verschlüsseln von Dateien mit öffentlichen Schlüssel ausgeliefert mit meiner Anwendung & hochladen zum Server
  2. (Server-Seite PHP): Entschlüsseln der hochgeladene Datei auf dem Server gespeichert ist meine privaten Schlüssel
  3. (Arbeiten an der hochgeladenen Datei ...)

Klingt einfach, aber ich kann keine zuverlässige Code-/Komponente finden, ich diese Komponenten gefunden:

  1. DCPcrypt. Dies ist, was ich gerade in der Entwicklung verwende, aber scheint nicht Schlüssel-basierte Verschlüsselung (RSA?)

  2. GnuPgp (GPL) zu unterstützen, so dass ich es nicht auf meiner kommerziellen App verwenden kann.

  3. TurboPower LockBox 3: unterstützt KeyPair-Verschlüsselung, aber sehr kryptisch (keine Dokumentation AFAIK) und scheint nicht die Dateiverschlüsselung zu unterstützen.

Meine Frage ist: gibt es eine secure/zuverlässige Verschlüsselungskomponente, die:

  1. erreichen, was ich oben beschrieben (dh Keypair Verschlüsselung.)
  2. Kann PHP entschlüsselt werden unter Verwendung von
  3. Works on große Dateien/Ströme
  4. (Träumen hier!) Hat eine einfache Delphi/PHP-Demo, die zeigt, wie das geht? :)
  5. FOSS-Lösungen nur bitte, ich bin schon wayyy über das Budget :)
+6

Gute Krypto kostenlos macht wenig Sinn - es erfordert eine ganze Menge von Fähigkeiten in Programmierung, Sicherheit und Mathematik. –

+0

Normalerweise werden Sie nicht eine ganze Datei mit RSA oder dergleichen kryptieren, weil es normalerweise langsamer ist. Sie verschlüsseln mit einem symmetrischen Algorithmus, dann verschlüsseln Sie den mit dem asymmetrischen Schlüssel verwendeten Schlüssel. Solange Sie einen korrekt implementierten Standardalgorithmus verwenden, können Daten sowohl von PHP als auch von Delphi verwendet werden. LockBox 3 IMHO ist keine gute Bibliothek. –

+0

@ EugeneMayevski'EldoSCorp: Haben Sie einen schönen Rabatt-Coupon herumliegen, den Sie mir für SecureBlackbox geben können? :) – TheDude

Antwort

2

Ah, krypto. Es gibt ein Sprichwort über einen Programmierer, der wenig Krypto kennt, der viel gefährlicher ist als einer, der keinen kennt.

In einer sehr ähnlichen Art und Weise verbrachte ich einige Zeit damit, einen Weg zu finden, digitale XML-Signaturen mit Open Source zu erstellen. Ich nur managed to get so far vor dem Aufbocken und eine rock solid third party library bekommen. Es ist nicht im rein monetären Sinne billig, sondern eine meiner bisher besten Investitionen.

(Eine wahre Geschichte. Ich habe tatsächlich in ein kleines Flamewar mit dem Autor dieser Bibliothek, die auch aus den Kommentaren gelöscht wurde Ach, endete ich von ihm aufkaufen Figur gehen..)

+0

Also, ist deine Antwort * nein *, oder * ja, aber es ist schwieriger, als ich zu verfolgen bereit war, und ich habe einmal mit jemandem gestritten *? –

+0

@RobKennedy - wenn Sie glauben, die Antwort ist nicht wert Ihre Zeit, dann weggeraten. –

+3

Ich bin mir einfach nicht sicher, was deine Antwort * ist *. –

3

würde ich gehe mit OpenSSL.
PHP scheint viel Unterstützung dafür zu haben, obwohl ich es nicht wirklich versucht habe: Zum Beispiel the manual und an example here.

Delphi kann gemacht werden, um gut mit OpenSSL mit ein wenig Arbeit zu arbeiten, mit Sachen, die ich hier schon mehrfach erwähnt habe: http://www.disi.unige.it/person/FerranteM/delphiopenssl/. Einige gute Beispiele auf dieser Seite. Und werfen Sie einen Blick auf die Indy OpenSSL Importe.

Nicht spezifische Komponenten aber auf jeden Fall frei, flexibel und mit vollen Möglichkeiten für sich selbst schießen, Sicherheit-weise, in dem Fuß :-)

EDIT:

Für Delphi würde ich die EVP_Seal * Funktionen prüfen, mit und Sie können meine Version einer Schnitt libeay32.pas Datei in this SO answer finden. Sie haben dies berücksichtigt, da Indy nicht viele der EVP_ Funktionen aufspannt oder implementiert, so dass Sie die Funktionsdeklarationen und einige andere Routinen importieren müssen.

Für PHP this link scheint das richtige Gegenstück.

Als Bonus das Ihnen eine Vorstellung davon, wie geben sollte EVP_Seal * Sachen (nicht getestet) verwenden:

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;