OpenSSL:RSA加密/解密,密钥生成和密钥持久性

64b*_*uid 8 c++ openssl p2p rsa

我正在尝试使用OpenSSL中的RSA构建一个需要以下内容的p2p应用程序:

-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
Run Code Online (Sandbox Code Playgroud)

我选择使用EVP功能,无论这意味着什么.但是,我很难找到我需要使用哪些函数来执行这些操作,以及以什么顺序执行.OpenSSL的官方文档似乎不存在.

有谁知道我需要以什么顺序使用哪些功能及其原型?周围的任何示例代码也都很好.

非常感谢,提前

twitchliquid64.

PS:这是我到目前为止所拥有的

#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;
}
Run Code Online (Sandbox Code Playgroud)

64b*_*uid 7

正如我在对我的问题的评论中所说:

您会发现OpenSSL附带的示例代码比文档更有用.例如,使用RSA加密的文档显示在apps/rsa.c中.可能有助于计算OpenSSL命令行以执行您想要使用命令行工具执行的每个功能,然后找出代码实际执行的操作(通过检查它),这样您就可以使代码执行相同的操作. - 大卫施瓦茨

这个示例代码正是我所需要的,我建议任何有类似问题的人查阅rsa代码和头文件,并且它们也是文档中的小用例.