C语言OpenSSL安装和使用

安装

要使用OpenSSL库进行C语言编程,你需要完成以下步骤:

1. **安装OpenSSL库**:

   首先,你需要确保在你的系统上安装了OpenSSL库。如果你使用的是Linux或类Unix系统,你可以使用包管理器安装OpenSSL。例如,在Ubuntu上,你可以运行以下命令:

   ```bash
   sudo apt-get install libssl-dev
   ```

   如果你使用的是Windows,你可以从OpenSSL官方网站(https://www.openssl.org/)下载预编译的Windows版本。

2. **包含头文件**:

   在你的C代码中,你需要包含OpenSSL的头文件。这些头文件包含了OpenSSL库中定义的函数和数据结构。

   ```c
   #include <openssl/rsa.h>
   #include <openssl/pem.h>
   ```

3. **初始化OpenSSL库**:

   在使用OpenSSL之前,需要初始化OpenSSL库。这可以通过调用以下函数来完成:

   ```c
   OpenSSL_add_all_algorithms();
   ERR_load_crypto_strings();
   ```

   这些函数将加载OpenSSL支持的所有密码学算法以及错误处理信息。

4. **使用OpenSSL功能**:

   现在,你可以使用OpenSSL库中提供的函数来执行各种密码学操作,例如生成密钥对、加密、解密、签名和验证等。

5. **清理资源**:

   在程序结束时,确保释放分配的资源。例如,释放RSA密钥对可以使用以下函数:

   ```c
   RSA_free(keypair);
   ```

   释放BIO(OpenSSL的I/O抽象)可以使用以下函数:

   ```c
   BIO_free_all(bp_public);
   BIO_free_all(bp_private);
   ```

这是一个基本的OpenSSL使用示例。请注意,OpenSSL库具有广泛的功能和配置选项,具体取决于你要执行的任务。在实际项目中,你可能需要查阅OpenSSL的文档以获取更详细的信息和示例代码。要构建包含OpenSSL库的C程序,你需要使用适当的编译器选项,以确保正确链接OpenSSL库。

使用

这个错误消息表明编译器找不到链接到OpenSSL库的符号。你需要确保在编译时正确链接OpenSSL库。在使用gcc编译器时,需要添加 `-lssl -lcrypto` 选项来链接OpenSSL库。

尝试以下步骤:

1. 编译你的程序时,请确保添加 `-lssl -lcrypto` 选项来链接OpenSSL库。例如:

   ```bash
   gcc -o myprogram myprogram.c -lssl -lcrypto
   ```

   这将告诉编译器去链接OpenSSL库中的符号。

2. 确保OpenSSL库在你的系统中正确安装。你可以使用以下命令来查找OpenSSL的安装路径:

   ```bash
   pkg-config --cflags --libs openssl
   ```

   这将输出OpenSSL的编译和链接选项。

3. 如果你使用了自定义的安装路径,请确保将这些路径包含在编译命令中,例如:

   ```bash
   gcc -o myprogram myprogram.c -I/path/to/openssl/include -L/path/to/openssl/lib -lssl -lcrypto
   ```

   其中 `/path/to/openssl/include` 是 OpenSSL 头文件的路径,`/path/to/openssl/lib` 是 OpenSSL 库文件的路径。

通过这些步骤,你应该能够解决链接错误并成功编译你的程序。确保你的编译器可以找到OpenSSL库,以便能够使用OpenSSL函数。

例程

#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h> // 引入错误处理头文件

int main() {
    RSA *keypair;
    BIGNUM *bne;
    BIO *bp_public = NULL, *bp_private = NULL;
    int bits = 2048; // 密钥位数

    // 初始化OpenSSL
    OpenSSL_add_all_algorithms();
    
    // 根据OpenSSL版本使用正确的函数
    #if OPENSSL_VERSION_NUMBER >= 0x30000000L
    OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
    #else
    ERR_load_crypto_strings();
    #endif

    // 创建RSA密钥对生成器
    bne = BN_new();
    if (BN_set_word(bne, RSA_F4) != 1) {
        fprintf(stderr, "BN_set_word failed\n");
        return 1;
    }

    // 生成RSA密钥对
    keypair = RSA_new();
    if (RSA_generate_key_ex(keypair, bits, bne, NULL) != 1) {
        fprintf(stderr, "RSA_generate_key_ex failed\n");
        return 1;
    }

    // 保存公钥和私钥到文件
    bp_public = BIO_new_file("public.pem", "w");
    bp_private = BIO_new_file("private.pem", "w");
    if (PEM_write_bio_RSAPublicKey(bp_public, keypair) != 1) {
        fprintf(stderr, "PEM_write_bio_RSAPublicKey failed\n");
        return 1;
    }
    if (PEM_write_bio_RSAPrivateKey(bp_private, keypair, NULL, NULL, 0, NULL, NULL) != 1) {
        fprintf(stderr, "PEM_write_bio_RSAPrivateKey failed\n");
        return 1;
    }

    // 释放资源
    RSA_free(keypair);
    BIO_free_all(bp_public);
    BIO_free_all(bp_private);
    BN_free(bne);

    return 0;
}

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用C语言OpenSSL库编写RSA算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main(void) { RSA *rsa = NULL; BIO *bio = NULL; char *pubkey = "-----BEGIN PUBLIC KEY-----\n\ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3SHxX3Qv3RrXn7WUuqE2\n\ 6fL6Nz7mTfjTgJZv5j4Jl9QyJZzJF9eQ3oLJHJG3cBfXWw1XH+df/g8pB3xhVJb7\n\ 4xTmTnGpQ5FezX8Wjh7ACs1xuMfDLG7/JJWvI1D4Y5mB9GZc82XbYJZ2vYBDCs0i\n\ fK8rlnP1n7k1Y0myY9tQ3rKv7lW9HJkLw3O7Xo0lJL1+3dCjJf8z7QaQ8SjvD7XZ\n\ 8ia5S2TJLmNi2bGKmRzGZnKJmQOqoe9sJZlUyOJyv/8fLmJQvZc9OJ5yv5BHJm3D\n\ bXAyNzdZ9QF4JW6ZzvRn9t+JQ1uXw8yCQ7KEv8kX8hxXg3Zj8o1sP3Vn7ZiEIN6V\n\ n2U5zvLZ0rN7tXrW1U3j4C8e3YJ0Df2KXyRqZDrm0ZlZz4L3h3JF7qWx3eQwVMtU\n\ fWV1PvoqJ2OQzILU1FJ3oVJ5d5PpRhXeKlD4Z0JvL8F2DY7Kjy+4mL3g1jX9W1JJ\n\ 2+8eW4w8z6Y+3WpL3n8kBuRRkS5hRv1Cw6dRQ9Q4dM7xKlJjU7W9C5H4K6c+YwCJ\n\ 9YApdJqR1Pz3YfJ2c5bM67Jc0n9zGdH5JZyyqoI6bKzqjpfC3ZcR5I7Q9pFJmzWu\n\ k5A0yy/4yxPnDw5txrNZtL1DemyKv4XUrC9VZl98y3KZyYK+7UgZb3Z6QZQu3IjL\n\ 3xj2tJz6GtDfX7J7H+2c4jECAwEAAQ==\n\ -----END PUBLIC KEY-----"; char *privkey = "-----BEGIN PRIVATE KEY-----\n\ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDdIfFfdC/dGted\n\ +1lLqhNuny+jc+5k3484CZb+Y+CZfUMiWcyRfXkN6CyRyRt3AX11sNVx/nX/4PKQ\n\ f8YVSW++MU5k5xqUORXs1/Fo4ewArNcbjHwyxu/ySVryNQ+GOZgfRmXPNl22CWdr\n\ 9gEMKzSJ8ryuWc/WfuTVjSbJj21Desq/uVb0cmQvDc7tejSUkvX7d0KMl/zPtBpD\n\ xKO8PtdnyJrlLZMkuaNjZsYqZHMZmcomZA6qh72wlmVTI4nK//x8uYlC9lz04nnK\n\ /kEcmbcNtcDI3N1n1AXglbpnO9Gf234lDW5fDzIJDsoS/yRfyHFeDdmPyjWw/dWf\n\ tmIQg3pWfZTnO8tnSs3u1etbVTePgLx7dgnQN/YpfJGpkOubRmVnPgve

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值