繁体   English   中英

使用X509证书中的公共密钥进行RSA公共加密

[英]RSA public encryption using public key from X509 certificate c++

任务是使用.crt文件-X509证书文件中的RSA公钥加密某些消息。

在下面的问题中,我成功获取了相关信息,但找不到如何使用x中的公钥使用RSA算法对消息进行加密的任何问题。

当我尝试使用密钥数据创建BIO缓冲区并使用PEM_read_bio_RSA_PUBKEY函数将密钥写入RSA结构时,它返回错误“错误:0906D06C:PEM例程:PEM_read_bio:no开始行” ,这很清楚为什么会出现,但不清楚如何正确处理解决。 在不创建另一个缓冲区并使用“ ----- BEGIN RSA PUBLIC KEY -----”“ ----- END RSA PUBLIC KEY -----”添加手动行的情况下,如何进行加密有任何问题?

这是我这份工作的代码:

unsigned char message[] = "Hello cryptographic world!";
unsigned char *encrypted_text;

int CyferWithHostKeyPub()
{
    ERR_load_crypto_strings();

    int res_length = 0;

    RSA *public_key;
    X509 *x;
    BIO *fp = BIO_new_file("cert.crt", "r");

    if (!fp)
    {
        printf("\nCan't open file.\n");
        return -1;
    }

    x = PEM_read_bio_X509(fp, 0, 0, NULL);

    if (!x) {
        printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
        return 1;
    }

    BIO *membuf = BIO_new_mem_buf((void*)x->cert_info->key->public_key->data, x->cert_info->key->public_key->length);

    public_key = PEM_read_bio_RSA_PUBKEY(membuf, &public_key, NULL, NULL);
    if (!public_key) {
        printf("%s\n", ERR_error_string(ERR_get_error(), NULL));
        return 1;
    }

    int encrypted_length = RSA_size(public_key);
    encrypted_text = new unsigned char[ encrypted_length ];
    RSA_public_encrypt(sizeof(message), message, encrypted_text, public_key, RSA_PKCS1_PADDING);

    RSA_free(public_key);
    X509_free(x);
    BIO_free(membuf);
    BIO_free(fp);

    return encrypted_length;
}

那么,如何正确执行此操作? 谢谢!

使用X509_get_pubkey()函数可获得对X509结构中包含的EVP_PKEY结构的引用。 然后,您可以使用EVP_PKEY_get1_RSA()获得对RSA结构的引用。

有关更多信息,请参见这些手册页:

https://www.openssl.org/docs/man1.1.0/crypto/X509_get_pubkey.html https://www.openssl.org/docs/man1.1.0/crypto/EVP_PKEY_get1_RSA.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM