legongju.com
我们一直在努力
2025-01-07 18:22 | 星期二

C语言socket如何进行SSL/TLS加密

在C语言中,使用socket进行SSL/TLS加密通信需要使用第三方库,如OpenSSL。下面是一个简单的示例,展示了如何使用OpenSSL库创建一个SSL/TLS客户端和服务器。

  1. 首先,确保已经安装了OpenSSL库。在大多数Linux发行版中,可以使用包管理器安装,例如:

    sudo apt-get install libssl-dev
    
  2. 创建一个SSL/TLS服务器:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT 8443
#define BUFFER_SIZE 1024

int main() {
    SSL_CTX *ctx = NULL;
    SSL *ssl = NULL;
    int server_fd, client_fd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(client_addr);
    char buffer[BUFFER_SIZE];

    // 初始化SSL上下文
    SSL_library_init();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();
    ctx = SSL_CTX_new(TLSv1_2_client_method());
    if (!ctx) {
        fprintf(stderr, "Failed to create SSL context\n");
        return 1;
    }

    // 创建socket
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("socket");
        return 1;
    }

    // 配置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // 绑定并监听socket
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind");
        return 1;
    }
    if (listen(server_fd, 5) < 0) {
        perror("listen");
        return 1;
    }

    printf("Server listening on port %d\n", PORT);

    // 接受客户端连接
    client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
    if (client_fd < 0) {
        perror("accept");
        return 1;
    }

    // 创建SSL对象
    ssl = SSL_new(ctx);
    if (!ssl) {
        fprintf(stderr, "Failed to create SSL object\n");
        return 1;
    }

    // 绑定socket到SSL对象
    SSL_set_fd(ssl, client_fd);

    // 建立SSL连接
    if (SSL_accept(ssl) <= 0) {
        fprintf(stderr, "Failed to establish SSL connection\n");
        return 1;
    }

    // 读取并打印客户端发送的数据
    while (1) {
        int len = SSL_read(ssl, buffer, BUFFER_SIZE);
        if (len > 0) {
            printf("Received from client: %s\n", buffer);
        } else if (len == 0) {
            break;
        } else {
            perror("SSL_read");
            break;
        }
    }

    // 清理资源
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    close(client_fd);
    close(server_fd);

    return 0;
}
  1. 创建一个SSL/TLS客户端:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PORT 8443
#define BUFFER_SIZE 1024

int main() {
    SSL_CTX *ctx = NULL;
    SSL *ssl = NULL;
    int client_fd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];

    // 初始化SSL上下文
    SSL_library_init();
    SSL_load_error_strings();
    OpenSSL_add_all_algorithms();
    ctx = SSL_CTX_new(TLSv1_2_client_method());
    if (!ctx) {
        fprintf(stderr, "Failed to create SSL context\n");
        return 1;
    }

    // 创建socket
    client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd < 0) {
        perror("socket");
        return 1;
    }

    // 配置服务器地址
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(PORT);

    // 连接到服务器
    if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect");
        return 1;
    }

    // 创建SSL对象
    ssl = SSL_new(ctx);
    if (!ssl) {
        fprintf(stderr, "Failed to create SSL object\n");
        return 1;
    }

    // 绑定socket到SSL对象
    SSL_set_fd(ssl, client_fd);

    // 建立SSL连接
    if (SSL_connect(ssl) <= 0) {
        fprintf(stderr, "Failed to establish SSL connection\n");
        return 1;
    }

    // 向服务器发送数据
    const char *message = "Hello, server!";
    SSL_write(ssl, message, strlen(message));

    // 读取并打印服务器发送的数据
    while (1) {
        int len = SSL_read(ssl, buffer, BUFFER_SIZE);
        if (len > 0) {
            printf("Received from server: %s\n", buffer);
        } else if (len == 0) {
            break;
        } else {
            perror("SSL_read");
            break;
        }
    }

    // 清理资源
    SSL_free(ssl);
    SSL_CTX_free(ctx);
    close(client_fd);

    return 0;
}
  1. 编译并运行服务器和客户端:

对于服务器:

gcc server.c -o server -lssl -lcrypto
./server

对于客户端:

gcc client.c -o client -lssl -lcrypto
./client

现在,服务器和客户端应该通过SSL/TLS加密进行通信。请注意,这个示例仅用于演示目的,实际应用中可能需要更多的错误处理和功能。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/71102.html

相关推荐

  • C语言time()函数与日期时间的关系

    C语言time()函数与日期时间的关系

    time() 是 C 语言中的一个函数,它用于获取当前日几时间的秒数。这个函数返回的是从 1970 年 1 月 1 日 00:00:00(UTC)到现在所经过的秒数。这个值通常被称为 “...

  • 在C语言程序中如何正确调用time()函数

    在C语言程序中如何正确调用time()函数

    在C语言中,time()函数是用来获取当前日历时间的一个函数,它的原型定义在头文件中。time()函数返回从1970年1月1日00:00:00(UTC)至今的秒数。
    要正确调用...

  • C语言time()函数的时间精度如何

    C语言time()函数的时间精度如何

    time() 函数在 C 语言中用于获取当前日历时间,它返回一个 time_t 类型的值,表示从 1970 年 1 月 1 日 00:00:00 UTC(协调世界时)至今的秒数。time() 函数的时...

  • 如何利用C语言的time()函数进行计时

    如何利用C语言的time()函数进行计时

    在C语言中,你可以使用time()函数和difftime()函数来进行计时
    #include
    #include int main() { time_t start, end; double diff; // 记录开始时间 tim...

  • Meanshift算法怎样进行特征空间转换

    Meanshift算法怎样进行特征空间转换

    Meanshift算法是一种基于密度的聚类方法,它通过在特征空间中寻找数据的分布密度来形成聚类。在进行特征空间转换时,Meanshift算法主要遵循以下步骤: 选择合适的...

  • Meanshift算法如何处理颜色空间

    Meanshift算法如何处理颜色空间

    Meanshift算法在处理颜色空间时,通常会将图像从RGB颜色空间转换到HSV颜色空间,因为HSV颜色空间更符合人类视觉系统的感知方式,其中H(色相)通道能够很好地反映...

  • keyvaluepair存储方式如何

    keyvaluepair存储方式如何

    KeyValuePair存储方式是一种将键(Key)和值(Value)以成对的形式存储在数据结构中的方法。在不同的编程语言和环境中,这种存储方式有多种实现。以下是几种常见...

  • oracle游标在不同版本中的差异

    oracle游标在不同版本中的差异

    Oracle游标在不同版本中确实存在一些差异。以下是一些主要差异的概述: 游标声明:在Oracle 12c及更高版本中,可以使用CURSOR关键字声明游标,而在早期版本中,可...