¿Solución segura de cifrado de par de claves en Delphi y PHP?

Mi aplicación envía archivos cifrados a través de Internet, necesito poder hacer lo siguiente:

  1. (Lado del cliente Delphi 2010): Cifrar archivos usando clave pública enviada con mi aplicación y subirlo al servidor
  2. (PHP del lado del servidor): Descifrar el archivo cargado usando mi clave privada almacenada en el servidor
  3. (Trabajar en el archivo subido...)

Suena simple pero no puedo encontrar ningún código/componente confiable, encontré estos componentes:

  1. DCPcriptografía. Esto es lo que estoy usando ahora mismo en desarrollo, pero no parece ser compatible con el cifrado basado en pares de claves (¿RSA?)

  2. GnuPgp (GPL), por lo que no puedo usarlo en mi aplicación comercial.

  3. Caja de seguridad TurboPower 3: admite el cifrado de pares de claves pero es muy críptico (sin documentación AFAIK) y no parece admitir el cifrado de archivos.

Mi pregunta es: Hay un seguro / confiable componente de cifrado que:

  1. Logre lo que describí anteriormente (es decir, cifrado de par de claves)
  2. Se puede descifrar usando PHP
  3. Trabaja en archivos/secuencias grandes
  4. (Soñando aquí!) ¿Tiene una demostración simple de delphi/php que muestra cómo hacer esto? :)
  5. Solo soluciones FOSS, por favor, ya estoy muy por encima del presupuesto :)

preguntado el 22 de mayo de 12 a las 17:05

Una buena criptografía gratuita tiene poco sentido: requiere muchas habilidades en programación, seguridad y matemáticas. -

Por lo general, no encriptará un archivo completo con RSA o similar, porque suele ser más lento. Usted cifra con un algoritmo simétrico, luego cifra la clave utilizada con la asimétrica. Siempre que utilice un algoritmo estándar correctamente implementado, los datos se podrán utilizar tanto desde PHP como desde Delphi. LockBox 3 en mi humilde opinión no es una buena biblioteca. -

@EugeneMayevski'EldoSCorp: ¿Tiene algún buen cupón de descuento por ahí que me pueda dar para SecureBlackbox? :) -

@Gdhami si me contactas en privado. -

2 Respuestas

Yo iría con OpenSSL.
PHP parece tener mucho soporte para él, aunque en realidad no lo he probado: por ejemplo el manual y un ejemplo aquí.

Se puede hacer que Delphi funcione bien con OpenSSL con un poco de trabajo, usando cosas que he mencionado aquí varias veces: http://www.disi.unige.it/person/FerranteM/delphiopenssl/. Algunos buenos ejemplos en esa página también. Y eche un vistazo a las importaciones Indy OpenSSL.

Componentes no específicos, pero definitivamente gratuitos, flexibles y con todas las posibilidades para dispararte a ti mismo, en cuanto a seguridad, en el pie :-)

EDIT:

Para Delphi, consideraría usar las funciones EVP_Seal* y puede encontrar mi versión de un archivo libeay32.pas reducido en esta SO respuesta. Necesita esto ya que Indy no muestra ni implementa muchas/ninguna de las funciones reales de EVP_, por lo que necesita importar las declaraciones de funciones y algunas otras rutinas.

Para PHP este enlace parece la contraparte correcta.

Como beneficio adicional, esto debería darle una idea de cómo usar el material EVP_Seal* (no probado):

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;

contestado el 23 de mayo de 17 a las 13:05

Ah, criptografía. Hay un dicho acerca de que un programador que sabe poco de criptografía es mucho más peligroso que uno que no sabe nada.

En una línea muy similar, pasé bastante tiempo tratando de encontrar una manera de hacer firmas XML digitales usando código abierto. yo solo logró llegar tan lejos antes de abrocharse el cinturón y obtener un biblioteca de terceros sólida como una roca. No es barato en el sentido monetario puro, pero es una de mis mejores inversiones hasta ahora.

(Historia real: de hecho, entré en una pequeña guerra con el autor de esta biblioteca que incluso se eliminó de los comentarios. Por desgracia, terminé comprándole. Imagínense).

contestado el 23 de mayo de 17 a las 13:05

Entonces, es tu respuesta no o el sí, pero es más difícil de lo que estaba dispuesto a seguir, y tuve una discusión con alguien una vez? - robar kennedy

@RobKennedy: si cree que la respuesta no es digna de su tiempo, entonces vote negativamente. - leonardo herrera

No estoy seguro de cuál es tu respuesta. is. - robar kennedy

¿Que gastará tiempo o dinero? Proporcioné un enlace a una pregunta anterior que contiene enlaces a varias bibliotecas de código abierto y también a un producto comercial que, en mi humilde opinión, es justo lo que necesita si necesita criptografía en Delphi. No tenía nada más que agregar porque simplemente no hay mucho (aún menos dado que se descarta la GPL). - leonardo herrera

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.