在信息安全领域,文件加密与解密是一项基本技能。掌握C语言,你可以轻松实现文件的加密与解密。本文将详细介绍如何使用C语言进行文件加密和解密,包括常用的加密算法和示例代码。
加密算法简介
加密算法是确保信息安全的关键。常见的加密算法包括:
- 对称加密:使用相同的密钥进行加密和解密,如AES、DES。
- 非对称加密:使用一对密钥,公钥用于加密,私钥用于解密,如RSA。
本文将重点介绍对称加密算法,以AES为例。
使用AES加密文件
AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法。以下是一个使用AES加密文件的示例:
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <stdlib.h>
#define KEY_SIZE 16
#define IV_SIZE 16
int encrypt_file(const char *input_file, const char *output_file, const unsigned char *key, const unsigned char *iv) {
FILE *in = fopen(input_file, "rb");
FILE *out = fopen(output_file, "wb");
if (!in || !out) {
perror("File opening failed");
return -1;
}
EVP_CIPHER_CTX *ctx;
int len;
int ciphertext_len;
ctx = EVP_CIPHER_CTX_new();
if (!ctx) {
perror("Context allocation failed");
return -1;
}
if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) {
EVP_CIPHER_CTX_free(ctx);
return -1;
}
while ((len = fread(input_buffer, 1, BUFFER_SIZE, in)) > 0) {
if (1 != EVP_EncryptUpdate(ctx, output_buffer, &ciphertext_len, input_buffer, len)) {
EVP_CIPHER_CTX_free(ctx);
return -1;
}
fwrite(output_buffer, 1, ciphertext_len, out);
}
if (1 != EVP_EncryptFinal_ex(ctx, output_buffer, &ciphertext_len)) {
EVP_CIPHER_CTX_free(ctx);
return -1;
}
fwrite(output_buffer, 1, ciphertext_len, out);
EVP_CIPHER_CTX_free(ctx);
fclose(in);
fclose(out);
return 0;
}
在上面的代码中,我们使用AES加密算法对文件进行加密。首先,我们需要创建一个EVP_CIPHER_CTX结构体来存储加密上下文。然后,使用EVP_EncryptInit_ex函数初始化加密上下文,并设置密钥和初始化向量。接下来,使用EVP_EncryptUpdate函数对文件内容进行加密,并将加密后的数据写入输出文件。最后,使用EVP_EncryptFinal_ex函数完成加密过程。
使用AES解密文件
解密文件的过程与加密类似,只是使用EVP_DecryptInit_ex、EVP_DecryptUpdate和EVP_DecryptFinal_ex函数进行解密操作。
int decrypt_file(const char *input_file, const char *output_file, const unsigned char *key, const unsigned char *iv) {
FILE *in = fopen(input_file, "rb");
FILE *out = fopen(output_file, "wb");
if (!in || !out) {
perror("File opening failed");
return -1;
}
EVP_CIPHER_CTX *ctx;
int len;
int plaintext_len;
ctx = EVP_CIPHER_CTX_new();
if (!ctx) {
perror("Context allocation failed");
return -1;
}
if (1 != EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv)) {
EVP_CIPHER_CTX_free(ctx);
return -1;
}
while ((len = fread(input_buffer, 1, BUFFER_SIZE, in)) > 0) {
if (1 != EVP_DecryptUpdate(ctx, output_buffer, &plaintext_len, input_buffer, len)) {
EVP_CIPHER_CTX_free(ctx);
return -1;
}
fwrite(output_buffer, 1, plaintext_len, out);
}
if (1 != EVP_DecryptFinal_ex(ctx, output_buffer, &plaintext_len)) {
EVP_CIPHER_CTX_free(ctx);
return -1;
}
fwrite(output_buffer, 1, plaintext_len, out);
EVP_CIPHER_CTX_free(ctx);
fclose(in);
fclose(out);
return 0;
}
在解密文件时,我们使用相同的密钥和初始化向量进行解密操作。
总结
掌握C语言,你可以轻松实现文件的加密与解密。本文介绍了使用AES加密算法对文件进行加密和解密的示例代码。在实际应用中,你可以根据需要选择合适的加密算法和密钥管理方案,以确保信息安全。
