【问题标题】:How to send and then encrypt a message using OpenSSL public key via socket in C?如何通过 C 中的套接字使用 OpenSSL 公钥发送然后加密消息?
【发布时间】:2016-02-03 21:32:42
【问题描述】:

我正在使用 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);

我的问题是我无法以这种方式加载公钥。

【问题讨论】:

    标签: c sockets encryption openssl


    【解决方案1】:

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

    没有。它甚至不是保存密钥的有效方法。对二进制数据使用strcpy() 是无效的。你应该使用memcpy().

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

    您需要显示一些代码以供评论。

    有可能吗?

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

    【讨论】:

    • 我已更新代码以显示客户端加密问题
    • 但不是您如何接收公钥。假设必须是您从中加载的数据不正确,因此您如何获取该数据至关重要。在任何情况下,您都应该在此处发布完整的可重现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2017-02-08
    相关资源
    最近更新 更多