使用openssl实现rsa非对称加密算法示例


以下是使用OpenSSL库在C语言环境中实现RSA非对称加密算法的一个基本示例。请注意,这个示例仅用于展示如何生成密钥、进行加密和解密操作的基本流程。在实际应用中,你可能需要更复杂的错误处理和数据管理。

首先,你需要确保你的系统中安装了OpenSSL库。以下示例代码包括密钥生成、加密和解密过程:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>

// 初始化OpenSSL库
void init_openssl() {
    OpenSSL_add_all_algorithms();
    ERR_load_crypto_strings();
}

// 清理OpenSSL库使用的资源
void cleanup_openssl() {
    ERR_free_strings();
}

// RSA密钥生成
RSA *generate_rsa_keys(unsigned long e, unsigned long key_length) {
    RSA *rsa = RSA_new();
    BIGNUM *bne = BN_new();
    BN_set_word(bne, e);
    RSA_generate_key_ex(rsa, key_length, bne, NULL);
    BN_free(bne);
    return rsa;
}

// RSA公钥加密
int rsa_public_encrypt(unsigned char *data, int data_len, unsigned char *encrypted, RSA *rsa, int padding) {
    return RSA_public_encrypt(data_len, data, encrypted, rsa, padding);
}

// RSA私钥解密
int rsa_private_decrypt(unsigned char *encrypted, int encrypted_len, unsigned char *decrypted, RSA *rsa, int padding) {
    return RSA_private_decrypt(encrypted_len, encrypted, decrypted, rsa, padding);
}

int main() {
    init_openssl();

    RSA *rsa = generate_rsa_keys(RSA_F4, 2048); // 使用RSA_F4作为公钥指数,密钥长度为2048位
    if (!rsa) {
        perror("RSA key generation failed");
        exit(EXIT_FAILURE);
    }

    // 示例数据
    unsigned char original_data[] = "Hello, RSA!";
    int original_data_len = strlen((char *)original_data);

    // 加密缓冲区
    unsigned char encrypted_data[4096];
    int encrypted_data_len = rsa_public_encrypt(original_data, original_data_len, encrypted_data, rsa, RSA_PKCS1_PADDING);
    if (encrypted_data_len == -1) {
        perror("RSA public encryption failed");
        exit(EXIT_FAILURE);
    }

    // 解密缓冲区
    unsigned char decrypted_data[4096];
    int decrypted_data_len = rsa_private_decrypt(encrypted_data, encrypted_data_len, decrypted_data, rsa, RSA_PKCS1_PADDING);
    if (decrypted_data_len == -1) {
        perror("RSA private decryption failed");
        exit(EXIT_FAILURE);
    }

    printf("Original: %s\n", original_data);
    printf("Decrypted: %s\n", decrypted_data);

    RSA_free(rsa);
    cleanup_openssl();

    return 0;
}

注意:

- 这个示例使用了RSA_PKCS1_PADDING作为填充模式,这是RSA加密中常用的填充方式之一。

- 密钥生成使用了RSA_F4(即65537)作为公钥的指数,这是一个常见的选择,因为它既安全又有效。

- 请确保在实际部署中处理所有可能的错误情况,并适当地管理内存和资源。

- 编译这个程序时,需要链接OpenSSL库。如果你使用的是gcc,可以添加`-lcrypto`标志来链接OpenSSL的加密库。