8

我正在尝试使用 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 的官方文档似乎不存在。

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

提前非常感谢,

抽搐液体64。

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

1 回答 1

7

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

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

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

于 2012-06-01T12:18:04.277 回答