C++ OpenSSL:RSA 加密/解密、密钥生成和密钥持久性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10779027/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
OpenSSL: RSA Encryption/Decryption, key generation & key persistance
提问by 64bit_twitchyliquid
I am trying to build a p2p application that requires the following, using RSA in OpenSSL:
我正在尝试构建一个需要以下内容的 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
I have chosen to use the EVP functions, whatever that means. However I am having supreme difficulty finding which functions I need to use to do these things, and in what order. Official documentation of OpenSSL seems to be non-existant.
我选择使用 EVP 功能,无论这意味着什么。然而,我很难找到我需要使用哪些功能来做这些事情,以及以什么顺序。OpenSSL 的官方文档似乎不存在。
Does anyone know what functions I need to use in what order and their prototypes? Any example code lying around would also be nice.
有谁知道我需要按什么顺序使用什么功能及其原型?任何示例代码都很好。
Thanks much in advance,
非常感谢提前,
twitchliquid64.
抽搐液体64。
PS: This is what I have so far
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;
}
采纳答案by 64bit_twitchyliquid
As said in a comment on my question:
正如在对我的问题的评论中所说:
You'll find the example code that comes with OpenSSL more useful than the documentation. For example, documentation of encryption with RSA is shows in apps/rsa.c. It may help to work out the OpenSSL command lines to perform each function you want to do with the command line tool and then figure out what the code actually does (by inspecting it) so you can make your code do the same thing.– David Schwartz
您会发现 OpenSSL 附带的示例代码比文档更有用。例如,使用 RSA 加密的文档显示在 apps/rsa.c 中。找出 OpenSSL 命令行来执行您想要使用命令行工具执行的每个功能,然后找出代码实际执行的操作(通过检查它)可能会有所帮助,这样您就可以让代码执行相同的操作。— 大卫·施瓦茨
This example code was exactly what I needed, I advise anyone with a similar problem to consult the rsa code and header file, and also their are small use examples in the documentation as well.
这个示例代码正是我所需要的,我建议任何有类似问题的人查阅 rsa 代码和头文件,并且它们也是文档中的小用例。