当前位置:首页 > C > 正文

C语言加密解密库入门指南(手把手教你用OpenSSL实现AES与DES加解密)

在当今信息安全日益重要的时代,掌握基本的加密解密技术是每个C语言开发者必备的技能。本文将带你从零开始,使用广泛使用的 C语言加密解密库 —— OpenSSL,实现常见的对称加密算法如 AES 和 DES。无论你是编程小白还是有一定基础的开发者,都能轻松上手!

C语言加密解密库入门指南(手把手教你用OpenSSL实现AES与DES加解密) C语言加密解密库  C语言AES加密 C语言DES加密 OpenSSL C语言教程 第1张

什么是OpenSSL?

OpenSSL 是一个开源的 C语言加密解密库,提供了丰富的加密、解密、证书管理等功能。它支持多种加密算法,包括 AES、DES、RSA 等,被广泛应用于 HTTPS、SSH、电子邮件安全等领域。

准备工作:安装OpenSSL

在 Linux 或 macOS 上,通常可以通过包管理器安装:

# Ubuntu/Debiansudo apt-get install libssl-dev# macOS (使用 Homebrew)brew install openssl

Windows 用户可下载预编译的 OpenSSL 库或使用 MSYS2 环境。

示例1:使用AES-128-CBC加密与解密

AES(高级加密标准)是目前最常用的对称加密算法之一。下面是一个完整的 C 语言示例,演示如何使用 OpenSSL 实现 AES 加密和解密。

#include <stdio.h>#include <string.h>#include <openssl/aes.h>#include <openssl/evp.h>// AES-128-CBC 加密函数int aes_encrypt(unsigned char *plaintext, int plaintext_len,                 unsigned char *key, unsigned char *iv,                 unsigned char *ciphertext) {    EVP_CIPHER_CTX *ctx;    int len;    int ciphertext_len;    if (!(ctx = EVP_CIPHER_CTX_new())) return -1;    if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))        return -1;    if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))        return -1;    ciphertext_len = len;    if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))        return -1;    ciphertext_len += len;    EVP_CIPHER_CTX_free(ctx);    return ciphertext_len;}// AES-128-CBC 解密函数int aes_decrypt(unsigned char *ciphertext, int ciphertext_len,                unsigned char *key, unsigned char *iv,                unsigned char *plaintext) {    EVP_CIPHER_CTX *ctx;    int len;    int plaintext_len;    if (!(ctx = EVP_CIPHER_CTX_new())) return -1;    if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))        return -1;    if (1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))        return -1;    plaintext_len = len;    if (1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len))        return -1;    plaintext_len += len;    EVP_CIPHER_CTX_free(ctx);    return plaintext_len;}int main() {    unsigned char key[] = "0123456789abcdef"; // 16字节密钥    unsigned char iv[]  = "abcdefghijklmnop"; // 16字节初始向量    unsigned char *plaintext = (unsigned char *)"Hello, this is a secret message!";    unsigned char ciphertext[128];    unsigned char decryptedtext[128];    int ciphertext_len = aes_encrypt(plaintext, strlen((char *)plaintext), key, iv, ciphertext);    printf("加密后数据长度: %d\n", ciphertext_len);    int decrypted_len = aes_decrypt(ciphertext, ciphertext_len, key, iv, decryptedtext);    decryptedtext[decrypted_len] = '\0';    printf("解密结果: %s\n", decryptedtext);    return 0;}

编译命令(需链接 OpenSSL 库):

gcc -o aes_example aes_example.c -lssl -lcrypto

示例2:使用DES加密(了解即可,不推荐生产使用)

DES 是一种较老的对称加密算法,由于密钥长度短(56位),已不再安全,但作为学习目的仍有价值。以下是简单的 DES 加密示例:

#include <stdio.h>#include <string.h>#include <openssl/des.h>int main() {    DES_cblock key = {0x13, 0x34, 0x57, 0x79, 0x9B, 0xBC, 0xDF, 0xF1};    DES_cblock input = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};    DES_cblock output;    DES_key_schedule schedule;    DES_set_key_unchecked(&key, &schedule);    DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);    printf("DES加密结果: ");    for (int i = 0; i < 8; i++)        printf("%02x", output[i]);    printf("\n");    return 0;}

注意:DES 已被 AES 取代,实际项目中应优先使用 C语言AES加密 方案。

常见问题与最佳实践

  • 密钥和 IV(初始向量)必须保密且不可预测。
  • 不要硬编码密钥到源代码中,应从安全配置文件或环境变量读取。
  • 使用 CBC、GCM 等带认证的模式比 ECB 更安全。
  • 定期更新 OpenSSL 版本以修复安全漏洞。

总结

通过本教程,你已经掌握了如何在 C 语言中使用 OpenSSL 库进行基本的加密解密操作。无论是 C语言AES加密 还是了解 C语言DES加密 的原理,都是构建安全应用的重要一步。希望这篇 OpenSSL C语言教程 能为你打下坚实的基础!

提示:实际开发中,请务必遵循安全编码规范,并参考 OpenSSL 官方文档获取最新 API 信息。