Quiero cifrar una gran cantidad de datos binarios (digamos, 1 GB), utilizando un cifrado asimétrico (de modo que solo se necesita una clave pública para cifrar los datos, pero se necesita una clave privada para descifrarlos). Como un buen complemento, me gustaría firmarlo (y, idealmente, algunos datos adicionales) con mi clave pública
Las partes no se comunican de ninguna manera antes de transferir el blob (a excepción de que compartan sus claves públicas), por lo que varios esquemas que involucran DH o algo similar no encajan en este escenario.
Obviamente, no quiero inventar mi propio contenedor para eso.
¿Qué contenedor utilizo para que me permita usar el cifrado / firma con algoritmos estándar de la industria que no tienen fallas conocidas?
La forma obvia sería ir con CMS / PKCS # 7. Incluso el escenario ideal podría lograrse haciendo Encrypt-then-Sign con algunos arreglos manuales que concatenen, como:
encryptedMessage = createEnvelopedCms(cleartextBlob, recipientPublicKey)
signedMessage = createSignedCms(authenticationData.Length + authenticationData + encryptedMessage
Sin embargo, CMS tiene dos inconvenientes importantes:
1) Parece que solo se puede usar con las claves RSA / DSA / ECDSA, y de estas tres, solo se puede usar RSA para el cifrado. Sin embargo, RSA no es a prueba de futuro (ya que no es seguro en cuanto a cuántica).
2) Parece que CMS solo admite AES en modo CBC, que también tiene sus defectos.
Luego está el contenedor GPG, pero no puedo encontrar información sobre qué algoritmos específicos usa, y parece que no es configurable en la misma medida que CMS.
Si estuviera inventando mi propio contenedor (que no lo soy), probablemente haría algo en este sentido: generar una clave AES aleatoria + IV; cifre el blob usando estos en el modo AES-GCM (agregando la información de autenticación requerida); cifre la clave AES y IV utilizando la clave pública ECC del destinatario; concat encriptar claves + información de autenticación + blobs encriptados y empaquetarlos en un mensaje CMS firmado por la clave ECDSA del remitente. ¿Hay algún contenedor estándar de la industria que me permita hacer todo esto?