C 以DER格式写入私钥/公钥
我需要编写一个生成RSA密钥的C程序,并以DER格式保存一个X.509公钥和一个以DER格式保存的PKCS#8私钥。我用过谷歌,但没找到多少。到目前为止,我得到的是:C 以DER格式写入私钥/公钥,c,openssl,rsa,x509,pkcs#8,C,Openssl,Rsa,X509,Pkcs#8,我需要编写一个生成RSA密钥的C程序,并以DER格式保存一个X.509公钥和一个以DER格式保存的PKCS#8私钥。我用过谷歌,但没找到多少。到目前为止,我得到的是: #include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> void main() { int ret = 0; RSA *r = NULL; BIGNUM *bne = NULL;
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
void main() {
int ret = 0;
RSA *r = NULL;
BIGNUM *bne = NULL;
BIO *bp_public = NULL, *bp_private = NULL;
int bits = 2048;
unsigned long e = RSA_F4;
// Generate the RSA key
printf("Generating RSA key...\n");
bne = BN_new();
ret = BN_set_word(bne, e);
if(ret != 1) {
goto free_all;
}
r = RSA_new();
ret = RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1) {
goto free_all;
}
// Save the public key in PEM format
printf("Writing key files...\n");
bp_public = BIO_new_file("public.pem", "w+");
ret = PEM_write_bio_RSAPublicKey(bp_public, r);
if(ret != 1) {
goto free_all;
}
// Save the private key in PEM format
bp_private = BIO_new_file("private.pem", "w+");
ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
// Free everything
free_all:
BIO_free_all(bp_public);
BIO_free_all(bp_private);
RSA_free(r);
BN_free(bne);
printf("Done!\n");
}
#包括
#包括
#包括
void main(){
int-ret=0;
RSA*r=NULL;
BIGNUM*bne=NULL;
BIO*bp_public=NULL,*bp_private=NULL;
整数位=2048;
无符号长e=RSA_F4;
//生成RSA密钥
printf(“生成RSA密钥…\n”);
bne=BN_new();
ret=BN\u集合词(bne,e);
如果(ret!=1){
去自由所有人;
}
r=RSA_new();
ret=RSA\u generate\u key\u ex(r,bit,bne,NULL);
如果(ret!=1){
去自由所有人;
}
//以PEM格式保存公钥
printf(“写入密钥文件…\n”);
bp_public=BIO_new_文件(“public.pem”、“w+”);
ret=PEM_write_bio_rsa公钥(bp_public,r);
如果(ret!=1){
去自由所有人;
}
//以PEM格式保存私钥
bp_private=BIO_new_文件(“private.pem”、“w+”);
ret=PEM_write_bio_RSAPrivateKey(bp_private,r,NULL,NULL,0,NULL,NULL);
//释放一切
全部免费:
BIO_free_all(bp_public);
BIO_free_all(bp_private);
无RSA_(r);
无BN_(bne);
printf(“完成!\n”);
}
这显然是以PEM格式编写密钥。我还需要能够在代码的内存中实际存储数据,而不仅仅是将数据直接写入文件,因为我还需要使用公钥执行其他一些操作
感谢您的帮助我想您需要使用
EVP\u PKEY\u assign\u RSA将您的密钥转换为EVP\u PKEY。然后您可以使用i2d\u PUBKEY\u bio
向bio进行写操作
以下代码修改对我有效:
包括头文件
申报个人简历,以便填写公共订单
使用EVP\u PKEY\u new()创建EVP\u PKEY结构
使用EVP\u PKEY\u assign\u RSA转换
用i2d\u PUBKEY\u bio
在这方面:
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
void main() {
int ret = 0;
RSA *r = NULL;
BIGNUM *bne = NULL;
BIO *bp_public = NULL, *bp_private = NULL, *bp_public_der = NULL;
int bits = 2048;
unsigned long e = RSA_F4;
// Generate the RSA key
printf("Generating RSA key...\n");
bne = BN_new();
ret = BN_set_word(bne, e);
if(ret != 1) {
goto free_all;
}
r = RSA_new();
ret = RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1) {
goto free_all;
}
// Save the public key in PEM format
printf("Writing key files...\n");
bp_public = BIO_new_file("public.pem", "w+");
ret = PEM_write_bio_RSAPublicKey(bp_public, r);
if(ret != 1) {
goto free_all;
}
// Save the private key in PEM format
bp_private = BIO_new_file("private.pem", "w+");
ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
// Save in DER
EVP_PKEY *evp = EVP_PKEY_new();
ret = EVP_PKEY_assign_RSA(evp, r);
if(ret != 1){
printf("failure %i\n", ret);
}
bp_public_der = BIO_new_file("public.key", "w+");
ret = i2d_PUBKEY_bio(bp_public_der, evp);
// Free everything
free_all:
BIO_free_all(bp_public);
BIO_free_all(bp_public_der);
BIO_free_all(bp_private);
RSA_free(r);
BN_free(bne);
printf("Done!\n");
}
#包括
#包括
#包括
#包括
void main(){
int-ret=0;
RSA*r=NULL;
BIGNUM*bne=NULL;
BIO*bp\u public=NULL,*bp\u private=NULL,*bp\u public\u der=NULL;
整数位=2048;
无符号长e=RSA_F4;
//生成RSA密钥
printf(“生成RSA密钥…\n”);
bne=BN_new();
ret=BN\u集合词(bne,e);
如果(ret!=1){
去自由所有人;
}
r=RSA_new();
ret=RSA\u generate\u key\u ex(r,bit,bne,NULL);
如果(ret!=1){
去自由所有人;
}
//以PEM格式保存公钥
printf(“写入密钥文件…\n”);
bp_public=BIO_new_文件(“public.pem”、“w+”);
ret=PEM_write_bio_rsa公钥(bp_public,r);
如果(ret!=1){
去自由所有人;
}
//以PEM格式保存私钥
bp_private=BIO_new_文件(“private.pem”、“w+”);
ret=PEM_write_bio_RSAPrivateKey(bp_private,r,NULL,NULL,0,NULL,NULL);
//储蓄
EVP_PKEY*EVP=EVP_PKEY_new();
ret=执行副总裁(执行副总裁,r);
如果(ret!=1){
printf(“失败%i\n”,ret);
}
bp_public_der=BIO_new_文件(“public.key”、“w+”);
ret=i2d_PUBKEY_bio(bp_public_der,evp);
//释放一切
全部免费:
BIO_free_all(bp_public);
BIO_free_all(bp_public_der);
BIO_free_all(bp_private);
无RSA_(r);
无BN_(bne);
printf(“完成!\n”);
}
现在,您可以在public.key
中找到公钥的顺序。你应该能为私人做同样的事情
希望这能有所帮助。我想您需要使用EVP\u PKEY\u assign\u RSA将密钥转换为EVP\u PKEY。然后您可以使用i2d\u PUBKEY\u bio
向bio进行写操作
以下代码修改对我有效:
包括头文件
申报个人简历,以便填写公共订单
使用EVP\u PKEY\u new()创建EVP\u PKEY结构
使用EVP\u PKEY\u assign\u RSA转换
用i2d\u PUBKEY\u bio
在这方面:
#include <stdio.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
void main() {
int ret = 0;
RSA *r = NULL;
BIGNUM *bne = NULL;
BIO *bp_public = NULL, *bp_private = NULL, *bp_public_der = NULL;
int bits = 2048;
unsigned long e = RSA_F4;
// Generate the RSA key
printf("Generating RSA key...\n");
bne = BN_new();
ret = BN_set_word(bne, e);
if(ret != 1) {
goto free_all;
}
r = RSA_new();
ret = RSA_generate_key_ex(r, bits, bne, NULL);
if(ret != 1) {
goto free_all;
}
// Save the public key in PEM format
printf("Writing key files...\n");
bp_public = BIO_new_file("public.pem", "w+");
ret = PEM_write_bio_RSAPublicKey(bp_public, r);
if(ret != 1) {
goto free_all;
}
// Save the private key in PEM format
bp_private = BIO_new_file("private.pem", "w+");
ret = PEM_write_bio_RSAPrivateKey(bp_private, r, NULL, NULL, 0, NULL, NULL);
// Save in DER
EVP_PKEY *evp = EVP_PKEY_new();
ret = EVP_PKEY_assign_RSA(evp, r);
if(ret != 1){
printf("failure %i\n", ret);
}
bp_public_der = BIO_new_file("public.key", "w+");
ret = i2d_PUBKEY_bio(bp_public_der, evp);
// Free everything
free_all:
BIO_free_all(bp_public);
BIO_free_all(bp_public_der);
BIO_free_all(bp_private);
RSA_free(r);
BN_free(bne);
printf("Done!\n");
}
#包括
#包括
#包括
#包括
void main(){
int-ret=0;
RSA*r=NULL;
BIGNUM*bne=NULL;
BIO*bp\u public=NULL,*bp\u private=NULL,*bp\u public\u der=NULL;
整数位=2048;
无符号长e=RSA_F4;
//生成RSA密钥
printf(“生成RSA密钥…\n”);
bne=BN_new();
ret=BN\u集合词(bne,e);
如果(ret!=1){
去自由所有人;
}
r=RSA_new();
ret=RSA\u generate\u key\u ex(r,bit,bne,NULL);
如果(ret!=1){
去自由所有人;
}
//以PEM格式保存公钥
printf(“写入密钥文件…\n”);
bp_public=BIO_new_文件(“public.pem”、“w+”);
ret=PEM_write_bio_rsa公钥(bp_public,r);
如果(ret!=1){
去自由所有人;
}
//以PEM格式保存私钥
bp_private=BIO_new_文件(“private.pem”、“w+”);
ret=PEM_write_bio_RSAPrivateKey(bp_private,r,NULL,NULL,0,NULL,NULL);
//储蓄
EVP_PKEY*EVP=EVP_PKEY_new();
ret=执行副总裁(执行副总裁,r);
如果(ret!=1){
printf(“失败%i\n”,ret);
}
bp_public_der=BIO_new_文件(“public.key”、“w+”);
ret=i2d_PUBKEY_bio(bp_public_der,evp);
//释放一切
全部免费:
BIO_free_all(bp_public);
BIO_free_all(bp_public_der);
BIO_free_all(bp_private);
无RSA_(r);
无BN_(bne);
printf(“完成!\n”);
}
现在,您可以在public.key
中找到公钥的顺序。你应该能为私人做同样的事情
希望这能有所帮助。您的问题有点模棱两可,您的实际意思是“将X.509公钥保存为DER格式”。假设您的意思是“将其另存为SubjectPublicKeyInfo结构”(这是持有公钥的X.509证书的位)