OpenSSL: Criptografia / Descriptografia RSA, geração de chaves e persistência de chaves
Eu estou tentando construir um aplicativo p2p que requer o seguinte, usando RSA no OpenSSL:
-Encryption
-Decryption
-Generating Keys (done)
-Saving and loading keys (done)
-Saving the PUBLIC key as bytes so it can be sent over the sockets
-Loading keys from the above format
Eu escolhi usar as funções EVP, o que quer que isso signifique. No entanto, estou tendo uma dificuldade suprema para encontrar quais funções eu preciso usar para fazer essas coisas e em que ordem. A documentação oficial do OpenSSL parece não existir.
Alguém sabe quais funções eu preciso usar em qual ordem e seus protótipos? Qualquer código de exemplo em torno também seria bom.
Muito obrigado antecipadamente
twitchliquid64.
PS: Isso é o que eu tenho até agora
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/objects.h>
#include <openssl/x509.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/engine.h>
#include <openssl/rand.h>
RSA* Generate_KeyPair(void)
{
char rand_buff[16];
EVP_PKEY *pkey = NULL;
RSA* r;
char* pass = "passgdfgf";//for now
int bits = 512; // 512, 1024, 2048, 4096
unsigned long exp = RSA_F4; // RSA_3
OpenSSL_add_all_algorithms();
RAND_seed(rand_buff, 16); //On linux: RAND_load_file("/dev/urandom", 1024);
r = RSA_generate_key(bits,exp,NULL,NULL);
if (RSA_check_key(r)!=1);;; //Check key - error out
//Create EVP to save to file.
pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, r);
//Save private key
FILE* fp = fopen("private.key", "w");
PEM_write_PrivateKey(fp,pkey,EVP_aes_256_cbc(),NULL,0,NULL,pass)
fclose(fp);
//Save public key
fp = fopen("public.key", "w");
PEM_write_PUBKEY(fp, pkey);
fclose(fp);
return r;
}
EVP_PKEY* ReadPrivKey_FromFile(char* filename, char* pass)
{
FILE* fp = fopen(filename, "r");
EVP_PKEY* key = NULL;
PEM_read_PrivateKey(fp, &key, NULL, pass);
fclose(fp);
return key;
}
EVP_PKEY* ReadPubKey_FromFile(char* filename)
{
FILE* fp = fopen(filename, "r");
EVP_PKEY* key = NULL;
PEM_read_PUBKEY(fp, &key, NULL, NULL);
fclose(fp);
return key;
}