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

9

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

-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;
}

3
老实说,直接回答这个问题可能会对您造成不利影响。关键是要有正确的框架来实现您的安全目标,而把所有“小细节”处理正确并不能确保整个系统是安全的。如果您开始时说明您想要达到什么目的,那么您会更好地理解。比如,如果您在套接字上发送公钥,有什么防止攻击者替换他自己的公钥从而能够解密消息并使用正确的密钥重新加密它的方法吗? - David Schwartz
这主要是一个概念验证。其次,我有解决上述问题(中间人攻击等)的方案,我所要做的就是这些“小细节”。 - 64bit_twitchyliquid
你会发现随 OpenSSL 附带的示例代码比文档更有用。例如,RSA 加密的文档位于 apps/rsa.c 中。它可能有助于确定使用命令行工具执行每个功能所需的 OpenSSL 命令行,并找出代码实际执行的操作(通过检查代码),以便使您的代码实现相同的操作。 - David Schwartz
1个回答

8

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

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

这个示例代码正是我需要的,我建议任何遇到类似问题的人都要查阅rsa代码和头文件,文档中也有小型使用示例。


1
http://www.opensource.apple.com/source/OpenSSL097/OpenSSL097-16/openssl/apps/rsa.c - osyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接