openssl生成公私钥,使用bio并读取pkcs8公钥字符串,c实现
时间: 2024-02-20 21:58:42 浏览: 209
openssl密钥生成
5星 · 资源好评率100%
以下是使用 OpenSSL 库在 C 语言中生成 RSA 公私钥对,使用 BIO 对象并读取 PKCS#8 格式公钥字符串的代码示例:
```c
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
int main() {
RSA *keypair = RSA_new();
BIGNUM *exponent = BN_new();
int bits = 2048; // 密钥位数
// 设置指数
BN_set_word(exponent, RSA_F4);
// 生成密钥对
RSA_generate_key_ex(keypair, bits, exponent, NULL);
// 写入私钥
BIO *bp = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPrivateKey(bp, keypair, NULL, NULL, 0, NULL, NULL);
BUF_MEM *buf;
BIO_get_mem_ptr(bp, &buf);
FILE *fp = fopen("private.pem", "wb");
fwrite(buf->data, 1, buf->length, fp);
fclose(fp);
BIO_free_all(bp);
// 获取公钥
EVP_PKEY *pubkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pubkey, keypair);
// 写入 PKCS#8 格式公钥
bp = BIO_new(BIO_s_mem());
i2d_PublicKey_bio(bp, pubkey);
BIO_get_mem_ptr(bp, &buf);
fp = fopen("public.pkcs8", "wb");
fwrite(buf->data, 1, buf->length, fp);
fclose(fp);
BIO_free_all(bp);
// 读取 PKCS#8 格式公钥字符串
char pubstr[2048] = {0};
fp = fopen("public.pkcs8", "rb");
fread(pubstr, 1, 2048, fp);
fclose(fp);
// 从字符串中读取公钥
bp = BIO_new_mem_buf(pubstr, -1);
EVP_PKEY *pubkey2 = d2i_PUBKEY_bio(bp, NULL);
BIO_free_all(bp);
// 比较公钥
if (EVP_PKEY_cmp(pubkey, pubkey2) == 1) {
printf("Public key is the same.\n");
} else {
printf("Public key is different.\n");
}
return 0;
}
```
上述代码中,`BIO_new` 函数用于创建内存型 BIO 对象,`BUF_MEM` 结构体用于获取内存型 BIO 对象中的数据,`fwrite` 函数用于将字符串写入文件,`BIO_new_mem_buf` 函数用于将字符串创建为内存型 BIO 对象,从而得到公钥对象。
阅读全文