用openssl生成的RSA密钥与公钥
时间: 2024-03-19 07:43:04 浏览: 85
使用 OpenSSL 生成 RSA 密钥对可以分为以下步骤:
1. 生成私钥:使用 OpenSSL 命令行工具 `openssl`,执行以下命令生成一个 2048 位的 RSA 私钥:
```bash
openssl genpkey -algorithm RSA -out private_key.pem -aes256
```
该命令将生成一个加密的 PEM 格式的私钥文件 `private_key.pem`,并要求设置一个密码来保护私钥。
2. 提取公钥:从私钥文件中提取公钥,可以使用以下命令:
```bash
openssl rsa -in private_key.pem -pubout -out public_key.pem
```
该命令将从私钥文件中提取公钥,并将其保存到一个 PEM 格式的文件 `public_key.pem` 中。
现在,你可以使用这两个文件来进行加密和解密操作。在加密时,你需要使用公钥加密数据,然后使用私钥解密数据。在签名时,你需要使用私钥对数据进行签名,然后使用公钥验证签名。
下面是一个使用 OpenSSL 库的例子,它演示了如何使用 PEM 格式的 RSA 密钥对进行加密和解密操作:
```c
#include <openssl/evp.h>
#include <openssl/pem.h>
int rsa_encrypt(const unsigned char *plaintext, int plaintext_len,
unsigned char *ciphertext, EVP_PKEY *pubkey) {
EVP_PKEY_CTX *ctx;
size_t ciphertext_len;
int rc;
ctx = EVP_PKEY_CTX_new(pubkey, NULL);
if (!ctx) {
return -1;
}
rc = EVP_PKEY_encrypt_init(ctx);
if (rc != 1) {
EVP_PKEY_CTX_free(ctx);
return -1;
}
rc = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
if (rc != 1) {
EVP_PKEY_CTX_free(ctx);
return -1;
}
rc = EVP_PKEY_encrypt(ctx, ciphertext, &ciphertext_len, plaintext, plaintext_len);
if (rc != 1) {
EVP_PKEY_CTX_free(ctx);
return -1;
}
EVP_PKEY_CTX_free(ctx);
return ciphertext_len;
}
int rsa_decrypt(const unsigned char *ciphertext, int ciphertext_len,
unsigned char *plaintext, EVP_PKEY *privkey) {
EVP_PKEY_CTX *ctx;
size_t plaintext_len;
int rc;
ctx = EVP_PKEY_CTX_new(privkey, NULL);
if (!ctx) {
return -1;
}
rc = EVP_PKEY_decrypt_init(ctx);
if (rc != 1) {
EVP_PKEY_CTX_free(ctx);
return -1;
}
rc = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
if (rc != 1) {
EVP_PKEY_CTX_free(ctx);
return -1;
}
rc = EVP_PKEY_decrypt(ctx, plaintext, &plaintext_len, ciphertext, ciphertext_len);
if (rc != 1) {
EVP_PKEY_CTX_free(ctx);
return -1;
}
EVP_PKEY_CTX_free(ctx);
return plaintext_len;
}
```
这里 `rsa_encrypt` 函数使用给定的公钥对一个数据进行加密,并返回密文的长度。`rsa_decrypt` 函数使用给定的私钥对一个密文进行解密,并返回明文的长度。注意,这些函数仅适用于 RSA_PKCS1_OAEP_PADDING 填充模式。
阅读全文