Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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中通过套接字使用OpenSSL公钥发送并加密消息?_C_Sockets_Encryption_Openssl - Fatal编程技术网

如何在C中通过套接字使用OpenSSL公钥发送并加密消息?

如何在C中通过套接字使用OpenSSL公钥发送并加密消息?,c,sockets,encryption,openssl,C,Sockets,Encryption,Openssl,我正在使用C和本地套接字编写一个简单的服务器和客户端程序。我已使用openSSL成功生成公钥和私钥,代码如下: int generateKeys(char* publicDest, char* privateDest) { RSA *keypair = RSA_generate_key(2048, 3, NULL, NULL); BIO *pri = BIO_new(BIO_s_mem()); BIO *pub = BIO_new(BIO_s_mem());

我正在使用C和本地套接字编写一个简单的服务器和客户端程序。我已使用openSSL成功生成公钥和私钥,代码如下:

int generateKeys(char* publicDest, char* privateDest) {

    RSA *keypair = RSA_generate_key(2048, 3, NULL, NULL);

    BIO *pri = BIO_new(BIO_s_mem());
    BIO *pub = BIO_new(BIO_s_mem());

    PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);
    PEM_write_bio_RSAPublicKey(pub, keypair);

    size_t pri_len = BIO_pending(pri);
    size_t pub_len = BIO_pending(pub);

    char *pri_key = malloc(pri_len + 1);
    char *pub_key = malloc(pub_len + 1);

    BIO_read(pri, pri_key, pri_len);
    BIO_read(pub, pub_key, pub_len);

    pri_key[pri_len] = '\0';
    pub_key[pub_len] = '\0';

    strcpy(publicDest, pub_key);
    strcpy(privateDest, pri_key);

}
我现在需要将公钥发送到客户机,以便他们能够为服务器加密消息。我的做法如下:

    char publicKey[2048];
    char privateKey[2048];
    generateKeys(publicKey, privateKey);
    write(clientSocket, publicKey, 2048);
首先,这是向客户端发送公钥的正确方法吗

这就是我现在遇到的问题,如何仅使用公钥在客户端加密消息?可能吗

编辑-这是我试图加密消息的客户端上的代码:

    char dest[2048];
    BIO *pubBio = BIO_new_mem_buf(publicKey, -1);

    RSA *pubRSA = PEM_read_bio_RSA_PUBKEY(pubBio, NULL, NULL, NULL);
    if(!pubRSA) {
            printf("Issue loading public key...");
    }
    RSA_public_encrypt(sizeof(sigMessage), sigMessage, dest, pubRSA, RSA_PKCS1_PADDING);
我的问题是无法以这种方式加载公钥

首先,这是向客户端发送公钥的正确方法吗

不,这甚至不是保存钥匙的有效方法。对二进制数据使用
strcpy()
无效。您应该使用
memcpy()。

如何仅使用公钥在客户端加密消息

您需要显示一些代码以供注释

可能吗

当然,但是为什么呢?为什么不使用SSL/TLS

首先,这是向客户端发送公钥的正确方法吗

不,这甚至不是保存钥匙的有效方法。对二进制数据使用
strcpy()
无效。您应该使用
memcpy()。

如何仅使用公钥在客户端加密消息

您需要显示一些代码以供注释

可能吗


当然,但是为什么呢?为什么不使用SSL/TLS?

我已经更新了代码,以显示客户端加密问题,而不是您如何接收公钥。必须假定加载数据的数据不正确,因此如何获取该数据至关重要。在任何情况下,您都应该在此处发布一个完全可复制的问题。我已经更新了代码以显示客户端加密问题,但没有显示您是如何接收公钥的。必须假定加载数据的数据不正确,因此如何获取该数据至关重要。在任何情况下,你都应该在这里发布一个完整的可复制问题。