Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以DER格式写入私钥/公钥_C_Openssl_Rsa_X509_Pkcs#8 - Fatal编程技术网

C 以DER格式写入私钥/公钥

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;

我需要编写一个生成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;
    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证书的位)