On 01/04/2020 17:34, Andrew Felsher wrote: > Hi, > > I'm trying to do what I assumed would be a very common and typical use > of OpenSSL. I'm just encrypting and decrypting some data (in code; not > from command line). EVP_EncryptInit_ex (and decrypt, update, and final > variants) are the standard way to do this. > > However, the init functions take a char buffer. All the examples I can > find use hard-coded char buffer keys. But obviously I'm not going to be > hard-coding my keys. I'm generating them through a couple different > means, but ultimately I have EVP_PKEYs (in my case, containing RSA > private keys). And there doesn't seem to be a straightforward way to go > from EVP_PKEYs to a form consumable by the EVP init functions. > > EVP_PKEY_get_raw_private_key looks like it would be perfect, but it was > introduced in 1.1.1 and I'm limited to 1.1.0. > > This seems like it would be a very common use case, yet I can't seem to > find any examples or documentation anywhere. > > Am I doing something wrong or making some really off-base assumptions? EVP_EncryptInit_ex does *symmetric* encryption, i.e. both sides of the communication share the same private key. An RSA key in an EVP_PKEY does *asymmetric* encryption. Typically anyone can encrypt using the public RSA key, but only the owner of the private RSA key can decrypt. Asymmetric encryption using RSA is limited because it can only encrypt a very small amount of data. It is also very slow compared to symmetric encryption. Therefore, typically, if you want to encrypt data via an RSA key you generate a random symmetric key and encrypt that using your RSA key. Then you encrypt the data using the randomly generated symmetric key. OpenSSL has a built in high level API for doing this combined operation. To encrypt you can use the EVP_Seal*() functions. To decrypt use the EVP_Open*() functions. See: https://www.openssl.org/docs/man1.1.1/man3/EVP_SealInit.html https://www.openssl.org/docs/man1.1.1/man3/EVP_OpenInit.html It is also possible to encrypt directly in RSA using EVP_PKEY_encrypt(): https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_encrypt.html Matt