C++ OpenSSL:RSA加密/解密、密钥生成和;关键持久性

C++ OpenSSL:RSA加密/解密、密钥生成和;关键持久性,c++,openssl,rsa,p2p,C++,Openssl,Rsa,P2p,我正在尝试使用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 我选择使用EVP函数,不管这意味着什么。然而,我很难找

我正在尝试使用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
我选择使用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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
RSA*生成密钥对(无效)
{
char rand_buff[16];
EVP_PKEY*PKEY=NULL;
RSA*r;
char*pass=“passgdfgf”;//暂时
int bits=512;//512、1024、2048、4096
无符号长exp=RSA\u F4;//RSA\u 3
OpenSSL_添加_所有算法();
RAND_seed(RAND_buff,16);//在linux上:RAND_load_文件(“/dev/uradom”,1024);
r=RSA_生成_密钥(位,exp,NULL,NULL);
if(RSA_check_key(r)!=1);//check key-出错
//创建要保存到文件的EVP。
pkey=EVP_pkey_new();
执行副总裁(PKEY)分配RSA(PKEY,r);
//保存私钥
FILE*fp=fopen(“private.key”,“w”);
PEM_write_PrivateKey(fp,pkey,EVP_aes_256_cbc(),NULL,0,NULL,pass)
fclose(fp);
//保存公钥
fp=fopen(“公钥”,“w”);
PEM_write_PUBKEY(fp,pkey);
fclose(fp);
返回r;
}
EVP_PKEY*ReadPrivKey_FromFile(char*filename,char*pass)
{
FILE*fp=fopen(文件名,“r”);
EVP_PKEY*key=NULL;
PEM_read_PrivateKey(fp,&key,NULL,pass);
fclose(fp);
返回键;
}
EVP_PKEY*ReadPubKey_FromFile(char*filename)
{
FILE*fp=fopen(文件名,“r”);
EVP_PKEY*key=NULL;
PEM_read_PUBKEY(fp,&key,NULL,NULL);
fclose(fp);
返回键;
}

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


您会发现OpenSSL附带的示例代码比文档更有用。例如,使用RSA加密的文档显示在apps/RSA.c中。它可能有助于确定OpenSSL命令行,以执行您希望使用命令行工具执行的每个功能,然后(通过检查)确定代码的实际功能,以便您可以让代码执行相同的操作。 –大卫·施瓦茨


这个示例代码正是我所需要的,我建议任何有类似问题的人参考rsa代码和头文件,它们在文档中也只是一些小的使用示例。

老实说,直接回答这个问题比服务更可能给您带来伤害。诀窍在于拥有正确的框架来实现您的安全目标,而正确处理所有“小部件”并不能以任何方式确保系统作为一个整体是安全的。如果你一开始就说出你想要实现的目标,你会过得更好。(例如,如果您通过套接字发送公钥,如何阻止攻击者替换自己的公钥,从而能够解密消息并使用正确的密钥重新加密?)这主要是一个概念证明。其次,我有上述问题的解决方案(中间人攻击等),我要做的就是这些“小部分”。你会发现OpenSSL附带的示例代码比文档更有用。例如,RSA加密文档显示在
apps/RSA.c
中。它可能有助于确定OpenSSL命令行,以执行您希望使用命令行工具执行的每个功能,然后(通过检查)确定代码的实际功能,以便您可以让代码执行相同的操作。