2012-05-22 9 views
5

La mia applicazione invia i file crittografati su internet, ho bisogno di essere in grado di effettuare le seguenti operazioni:Soluzione di crittografia delle chiavi in ​​mano sicura in Delphi e PHP?

  1. (client lato Delphi 2010): Crittografare i file utilizzando chiave pubblica in dotazione con la mia applicazione & caricarlo al server
  2. (PHP Server lato): decifrare il file caricato usando la mia chiave privata memorizzata su server di
  3. (I lavori per il file caricato ...)

Sembra semplice, ma non riesco a trovare alcun codice/componente affidabile, ho trovato queste componenti:

  1. DCPcrypt. Questo è quello che sto usando in questo momento in sviluppo, ma non sembra supportare la crittografia basata su keypair (RSA?)

  2. GnuPgp (GPL), quindi non posso usarlo sulla mia app commerciale.

  3. TurboPower LockBox 3: supporta la crittografia di chiavi in ​​mano ma molto criptico (senza documentazione AFAIK) e non sembra supportare la crittografia dei file.

La mia domanda è: c'è un sicuro/affidabile componente crittografia:

  1. ottenere ciò che ho descritto sopra (vale a dire la crittografia coppia di chiavi.)
  2. può essere decifrato usando PHP
  3. Funziona su file di grandi dimensioni/flussi
  4. (Sognando qui!) Ha una semplice demo delphi/php che mostra come fare questo? :)
  5. soluzioni FOSS solo per favore, io sono già fuori budget wayyy :)
+6

Buon Crypto gratis ha poco senso - si richiede un bel po 'di abilità sia in programmazione, sicurezza e matematica. –

+0

Di solito non si cripta un intero file usando RSA o simili, perché di solito è più lento. Si crittografa con un algoritmo simmetrico, anziché crittografare la chiave utilizzata con quella asimmetrica. Finché utilizzi un algoritmo standard correttamente implementato, i dati saranno utilizzabili sia da PHP che da Delphi. LockBox 3 IMHO non è una buona libreria. –

+0

@ EugeneMayevski'EldoSCorp: hai un buono sconto in circolazione che puoi darmi per SecureBlackbox? :) – TheDude

risposta

2

Ah, crypto. C'è un detto su un programmatore che sa che la cripto è molto più pericolosa di quella che non conosce nessuno.

Su una vena molto simile, ho passato un po 'di tempo a cercare un modo per fare firme XML digitali usando l'open source. Ho solo managed to get so far prima di invecchiare e ottenere un rock solid third party library. Non è economico nel puro senso monetario, ma uno dei miei migliori investimenti fino ad ora.

(La vera storia:. Io in realtà avuto in un po 'flamewar con l'autore di questa biblioteca che anche ottenuto cancellato dai commenti Ahimè, ho finito per comprare da lui Vai a capire..)

+0

Quindi, è la tua risposta * no *, o * sì, ma è più difficile di quanto volessi perseguire, e ho avuto una discussione con qualcuno una volta *? –

+0

@RobKennedy - se ritieni che la risposta non sia degna del tuo tempo, allora allontanati. –

+3

Non sono sicuro di quale sia la tua risposta * *. –

3

lo farei vai con OpenSSL.
PHP sembra avere un sacco di supporto per questo, anche se in realtà non l'ho provato: Ad esempio the manual e an example here.

Delphi può essere fatto per funzionare bene con OpenSSL con un po 'di lavoro, usando cose che ho menzionato qui numerose volte: http://www.disi.unige.it/person/FerranteM/delphiopenssl/. Alcuni buoni esempi anche su quella pagina. E dai un'occhiata alle importazioni di Indy OpenSSL.

componenti Non specifici, ma sicuramente libera, flessibile e con piena possibilità di sparare se stessi, la sicurezza-saggio, in piedi :-)

EDIT:

per Delphi vorrei considerare l'uso del EVP_Seal * funzioni e puoi trovare la mia versione di un file libeay32.pas ridotto in this SO answer. Questo è come Indy non affiora o implementa molte/eventuali funzioni EVP_ effettive quindi è necessario importare le dichiarazioni di funzione e alcune altre routine.

Per PHP this link sembra la controparte giusta.

Come bonus, questo dovrebbe darvi un'idea di come utilizzare il materiale EVP_Seal * (non testato):

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; 
Problemi correlati