c 语言密钥存储,在C中读取和写入rsa密钥到pem文件

RSA键是对称的,您可以使用任何一个作为私钥或公钥,只是您选择的一个问题(但DSA键不对称).下面的程序生成两个2048位长的RSA密钥,然后将它们保存到文件中并将它们读回到内存中.这应该给你的想法如何做到这一点.

#include

#include

#include

#include

#include

#include

#include

#include

#include

const char* pcszPassphrase = "open sezamee";

static void gen_callback(int iWhat, int inPrime, void* pParam);

static void init_openssl(void);

static void cleanup_openssl(void);

static int passwd_callback(char *pcszBuff,int size,int rwflag, void *pPass);

static EVP_PKEY* create_rsa_key(void);

static void handle_openssl_error(void);

int main(int argc, char **argv)

{

int iRet = EXIT_SUCCESS;

EVP_PKEY* pPrivKey = NULL;

EVP_PKEY* pPubKey = NULL;

FILE* pFile = NULL;

const EVP_CIPHER* pCipher = NULL;

init_openssl(

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较复杂的问题,我会尽量详细地回答。 首先,ECC(Elliptic Curve Cryptography,椭圆曲线加)是一种非对称加算法,它比传统的 RSA 算法更加高效、安全和灵活。在 OpenSSL ,可以通过以下步骤对大文件进行 ECC 加和解: 1. 生成 ECC 对 可以使用 OpenSSL 的 EC 函数族来生成 ECC 对。具体步骤如下: ```c++ // 选择一个椭圆曲线 EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); // 生成对 if (EC_KEY_generate_key(key) != 1) { // 对生成失败 } // 获取公和私 EC_POINT *pub_key = EC_KEY_get0_public_key(key); BIGNUM *priv_key = EC_KEY_get0_private_key(key); ``` 2. 加载公和私 在加和解之前,需要将公和私加载到内存。可以使用 OpenSSL PEM_read_* 函数族从文件读取,或者使用 d2i_ECPrivateKey 和 i2o_ECPrivateKey 函数直接从内存读取写入。 ```c++ // 从文件读取 FILE *fp = fopen("private_key.pem", "r"); EC_KEY *key = PEM_read_ECPrivateKey(fp, NULL, NULL, NULL); fclose(fp); // 从内存读取 unsigned char *pub_key_bytes = ...; // 从文件或网络读取的二进制表示 EC_KEY *key = EC_KEY_new(); EC_POINT *pub_key = EC_POINT_new(EC_KEY_get0_group(key)); if (EC_POINT_oct2point(EC_KEY_get0_group(key), pub_key, pub_key_bytes, pub_key_len, NULL) != 1) { // 公加载失败 } if (EC_KEY_set_public_key(key, pub_key) != 1) { // 公设置失败 } ``` 3. ECC 加和解 在加载完公和私之后,可以使用 OpenSSL 的 ECDH 函数族进行 ECC 加和解。具体步骤如下: ```c++ // 加 unsigned char *plaintext = ...; // 待加的明文 size_t plaintext_len = ...; // 明文长度 unsigned char *ciphertext = (unsigned char *)malloc(EC_GROUP_get_degree(EC_KEY_get0_group(key)) / 8 + plaintext_len); size_t ciphertext_len = ECDH_compute_key(ciphertext, EC_GROUP_get_degree(EC_KEY_get0_group(key)) / 8, EC_POINT_point2oct(EC_KEY_get0_group(key), EC_KEY_get0_public_key(key), POINT_CONVERSION_UNCOMPRESSED, NULL, 0, NULL), key, NULL); // 解 unsigned char *plaintext = (unsigned char *)malloc(ciphertext_len - EC_GROUP_get_degree(EC_KEY_get0_group(key)) / 8); size_t plaintext_len = ECDH_compute_key(plaintext, ciphertext_len - EC_GROUP_get_degree(EC_KEY_get0_group(key)) / 8, ciphertext, key, NULL); ``` 需要注意的是,ECC 加和解只能处理长度小于椭圆曲线阶数的数据。对于大文件,可以使用分块加和解的方式,即先将文件分成若干个小块,每个小块分别进行加或解,最后再将小块拼接起来即可。 希望这个回答能够帮到你。如果还有什么问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值