I would recommend using an existing S / MIME (or CMS) implementation using a solid cryptographic module to encrypt your content.
The covered S / MIME data provides a good format for storing encrypted data at rest: the envelope records information about the algorithms and keys used so that information is available to authorized recipients later when necessary.
In addition, even if it does not support the “best” algorithms (for example, the ECDH key agreement), a good library is much less likely to have vulnerabilities than something written by a common programmer. Since it is much more likely that security will be violated by an implementation error than cryptanalysis, it makes sense to minimize these errors.
In legal protocols, public keys are signed by one of a small number of trusted issuers whose public keys are distributed using some out-of-band secure means. If you already have a secure means to get the public key to the sender of the message, why bother sending another? And if you do not, you are screwed.
TLS and S / MIME depend on the availability of a set of known CA certificates on each client. They are used to sign the server’s public key, so the client can detect attempts to replace the keys. The protocol cannot be downloaded independently; There should be a safe way to distribute "trusts" out of range.
Also note that RSA is incredibly slow compared to symmetric ciphers. Real protocols generate a “content encryption key” for a symmetric algorithm such as AES, and then use the RSA public key as the “encryption key” to encrypt the content encryption key for message recipients.
Thus, the main problem is to provide secure access to your public key. If you can do this, either option # 1 or # 2 is good, assuming you're just using this public key, rather than trying to send another in-band. In fact, in CMS , Option # 1 is called "key transport", and Option # 2 is called "key agreement."
In practice, the “server” can use a certificate issued by a CA that is already well known, or the client can compare the hash of the certificate with the one you tell him by phone, or cut rocks or something else in the face. Most importantly, all your security depends on the integrity of the certificate. You must protect it from fake.
While Crypto ++ is the “industry standard”, its security depends on how you use it. As Jerry told Kramer, "the door must be closed!" Using cryptographic primitives in Crypto ++ with a poorly designed protocol will not give you anywhere else. Therefore, I emphasize the use of CMS (higher level protocol) along with a good cryptographic module (cryptographic primitives).