c++ rsa根据私钥生成公钥
时间: 2023-11-16 07:04:25 浏览: 71
在 RSA 加密算法中,私钥和公钥是成对出现的。私钥用于解密加密过的消息,而公钥用于加密消息。因此,我们可以通过私钥生成公钥。
具体步骤如下:
1. 首先,选择两个大素数 p 和 q,并计算它们的乘积 n = p * q。
2. 然后根据欧拉函数 φ(n) = (p-1)*(q-1) 计算出一个整数 e,满足 e 和 φ(n) 互质。
3. 接下来,计算一个整数 d,使得 e*d ≡ 1 (mod φ(n))。这个计算可以通过扩展欧几里得算法来实现。
4. 最后,公钥就是一个由两个值组成的二元组 (n, e),私钥就是一个由两个值组成的二元组 (n, d)。
所以,如果已知私钥 (n, d),则可以通过计算得到公钥 (n, e)。
相关问题
公钥私钥生成p12格式证书C++代码示例
以下是使用 OpenSSL 库生成 p12 格式证书的 C++ 代码示例:
```
#include <openssl/pem.h>
#include <openssl/x509.h>
#include <openssl/pkcs12.h>
int main() {
// 生成RSA私钥
EVP_PKEY* pkey = EVP_PKEY_new();
RSA* rsa = RSA_new();
BIGNUM* bn = BN_new();
BN_set_word(bn, RSA_F4);
RSA_generate_key_ex(rsa, 2048, bn, NULL);
EVP_PKEY_assign_RSA(pkey, rsa);
// 生成证书请求
X509_REQ* req = X509_REQ_new();
X509_REQ_set_pubkey(req, pkey);
X509_NAME* name = X509_NAME_new();
X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, (const unsigned char*)"CN", -1, -1, 0);
X509_REQ_set_subject_name(req, name);
// 生成自签名证书
X509* x509 = X509_new();
X509_set_version(x509, 2);
ASN1_INTEGER_set(X509_get_serialNumber(x509), 0);
X509_gmtime_adj(X509_get_notBefore(x509), 0);
X509_gmtime_adj(X509_get_notAfter(x509), 31536000L);
X509_set_pubkey(x509, pkey);
X509_set_subject_name(x509, name);
X509_set_issuer_name(x509, name);
X509_sign(x509, pkey, EVP_sha256());
// 生成p12格式证书
PKCS12* p12 = PKCS12_create(NULL, "p12_password", pkey, x509, NULL, 0, 0, 0, 0, 0);
FILE* fp = fopen("cert.p12", "wb");
i2d_PKCS12_fp(fp, p12);
fclose(fp);
PKCS12_free(p12);
// 释放资源
X509_REQ_free(req);
X509_free(x509);
EVP_PKEY_free(pkey);
BN_free(bn);
X509_NAME_free(name);
return 0;
}
```
以上代码中,生成 RSA 私钥的过程使用 OpenSSL 库提供的 RSA_generate_key_ex 函数,生成证书请求和证书的过程中使用 X509_REQ_new 和 X509_new 函数创建 X509_REQ 和 X509 对象,使用 EVP_PKEY_assign_RSA 和 X509_set_pubkey 函数设置公钥,使用 X509_set_subject_name 函数设置证书主题,使用 X509_gmtime_adj 函数设置证书有效期,使用 X509_sign 函数自签名证书。最后,使用 PKCS12_create 函数生成 p12 格式证书,并使用 i2d_PKCS12_fp 函数将其写入文件。
c++ 实现公钥加密 私钥解密
C++ 可以使用 OpenSSL 库来实现公钥加密和私钥解密。以下是一个简单的示例代码:
```c++
#include <openssl/rsa.h>
#include <openssl/pem.h>
int main() {
// 生成 RSA 密钥对
RSA *keypair = RSA_generate_key(2048, RSA_F4, nullptr, nullptr);
// 保存公钥和私钥到文件
FILE *pubkey_file = fopen("public.pem", "w");
PEM_write_RSA_PUBKEY(pubkey_file, keypair);
fclose(pubkey_file);
FILE *privkey_file = fopen("private.pem", "w");
PEM_write_RSAPrivateKey(privkey_file, keypair, nullptr, nullptr, 0, nullptr, nullptr);
fclose(privkey_file);
// 从文件中读取公钥和私钥
pubkey_file = fopen("public.pem", "r");
RSA *pubkey = PEM_read_RSA_PUBKEY(pubkey_file, nullptr, nullptr, nullptr);
fclose(pubkey_file);
privkey_file = fopen("private.pem", "r");
RSA *privkey = PEM_read_RSAPrivateKey(privkey_file, nullptr, nullptr, nullptr);
fclose(privkey_file);
// 明文数据
const char *plaintext = "Hello, world!";
// 公钥加密
int ciphertext_len = RSA_size(pubkey);
unsigned char *ciphertext = new unsigned char[ciphertext_len];
int ret = RSA_public_encrypt(strlen(plaintext), (unsigned char *)plaintext, ciphertext, pubkey, RSA_PKCS1_OAEP_PADDING);
if (ret == -1) {
printf("RSA_public_encrypt failed!\n");
return -1;
}
// 私钥解密
unsigned char *decrypted = new unsigned char[ret];
ret = RSA_private_decrypt(ciphertext_len, ciphertext, decrypted, privkey, RSA_PKCS1_OAEP_PADDING);
if (ret == -1) {
printf("RSA_private_decrypt failed!\n");
return -1;
}
// 输出解密后的明文
printf("%.*s\n", ret, decrypted);
// 释放内存
RSA_free(keypair);
RSA_free(pubkey);
RSA_free(privkey);
delete[] ciphertext;
delete[] decrypted;
return 0;
}
```
此代码中,我们使用 RSA_generate_key 函数生成一个 2048 位的 RSA 密钥对,然后将公钥和私钥分别保存到 public.pem 和 private.pem 文件中。接着,我们使用 PEM_read_RSA_PUBKEY 和 PEM_read_RSAPrivateKey 函数从文件中读取公钥和私钥。然后,我们使用 RSA_public_encrypt 函数使用公钥加密明文数据,再使用 RSA_private_decrypt 函数使用私钥解密密文数据。最后,我们输出解密后的明文数据,并释放内存。