高级I/O操作:文件加密和压缩
1. 文件加密
- 文件加密是通过对文件内容进行加密算法处理,以保护文件的安全性和隐私性。
- 下面是一个简单的文件加密的示例代码:
```c
#include <stdio.h>
void encryptFile(const char* inputFile, const char* outputFile, int key) {
FILE* input = fopen(inputFile, "rb");
FILE* output = fopen(outputFile, "wb");
int ch;
while ((ch = fgetc(input)) != EOF) {
ch = ch ^ key; // 使用异或运算进行加密
fputc(ch, output);
}
fclose(input);
fclose(output);
}
int main() {
const char* inputFile = "input.txt";
const char* outputFile = "output.txt";
int key = 10;
encryptFile(inputFile, outputFile, key);
printf("File encrypted successfully.\n");
return 0;
}
```
在上面的示例中,`encryptFile`函数打开输入文件和输出文件,然后逐个字节读取输入文件中的字符,使用异或运算对字符进行加密,然后将加密后的字符写入输出文件。
2. 文件压缩
- 文件压缩是通过使用压缩算法减少文件的大小,以便更有效地存储和传输文件。
- 常见的文件压缩算法包括gzip、zip和zlib等。
- 下面是一个使用zlib库进行文件压缩的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zlib.h>
void compressFile(const char* inputFile, const char* outputFile) {
FILE* input = fopen(inputFile, "rb");
FILE* output = fopen(outputFile, "wb");
int ret;
const int CHUNK_SIZE = 16384;
unsigned char inputBuffer[CHUNK_SIZE];
unsigned char outputBuffer[CHUNK_SIZE];
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
ret = deflateInit(&strm, Z_DEFAULT_COMPRESSION);
if (ret != Z_OK) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to initialize zlib\n");
exit(EXIT_FAILURE);
}
do {
strm.avail_in = fread(inputBuffer, 1, CHUNK_SIZE, input);
if (ferror(input)) {
deflateEnd(&strm);
fclose(input);
fclose(output);
fprintf(stderr, "Failed to read input file\n");
exit(EXIT_FAILURE);
}
strm.next_in = inputBuffer;
do {
strm.avail_out = CHUNK_SIZE;
strm.next_out = outputBuffer;
ret = deflate(&strm, Z_FINISH);
if (ret == Z_STREAM_ERROR) {
deflateEnd(&strm);
fclose(input);
fclose(output);
fprintf(stderr, "Failed to compress file\n");
exit(EXIT_FAILURE);
}
int compressedSize = CHUNK_SIZE - strm.avail_out;
fwrite(outputBuffer, 1, compressedSize, output);
i
当涉及到文件加密时,C语言也提供了许多常用的加密算法和库。下面是一个示例,展示了如何使用OpenSSL库进行文件加密和解密。
首先,你需要确保已经安装了OpenSSL库,并且在编译时链接了正确的库文件。接下来,我们将使用AES对称加密算法进行文件加密和解密。
```c
#include <stdio.h>
#include <stdlib.h>
#include <openssl/aes.h>
// 加密文件
void encryptFile(const char* inputFile, const char* outputFile, const char* key) {
FILE* input = fopen(inputFile, "rb");
FILE* output = fopen(outputFile, "wb");
if (!input || !output) {
fprintf(stderr, "Failed to open file\n");
exit(EXIT_FAILURE);
}
// 设置加密密钥
AES_KEY aesKey;
if (AES_set_encrypt_key((const unsigned char*)key, 128, &aesKey) < 0) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to set encryption key\n");
exit(EXIT_FAILURE);
}
unsigned char inputBuffer[AES_BLOCK_SIZE];
unsigned char outputBuffer[AES_BLOCK_SIZE];
int bytesRead = 0;
int bytesWritten = 0;
// 逐块读取输入文件,并进行加密
while ((bytesRead = fread(inputBuffer, 1, AES_BLOCK_SIZE, input)) > 0) {
AES_encrypt(inputBuffer, outputBuffer, &aesKey);
bytesWritten = fwrite(outputBuffer, 1, bytesRead, output);
if (bytesWritten != bytesRead) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to write encrypted data\n");
exit(EXIT_FAILURE);
}
}
fclose(input);
fclose(output);
}
// 解密文件
void decryptFile(const char* inputFile, const char* outputFile, const char* key) {
FILE* input = fopen(inputFile, "rb");
FILE* output = fopen(outputFile, "wb");
if (!input || !output) {
fprintf(stderr, "Failed to open file\n");
exit(EXIT_FAILURE);
}
// 设置解密密钥
AES_KEY aesKey;
if (AES_set_decrypt_key((const unsigned char*)key, 128, &aesKey) < 0) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to set decryption key\n");
exit(EXIT_FAILURE);
}
unsigned char inputBuffer[AES_BLOCK_SIZE];
unsigned char outputBuffer[AES_BLOCK_SIZE];
int bytesRead = 0;
int bytesWritten = 0;
// 逐块读取输入文件,并进行解密
while ((bytesRead = fread(inputBuffer, 1, AES_BLOCK_SIZE, input)) > 0) {
AES_decrypt(inputBuffer, outputBuffer, &aesKey);
bytesWritten = fwrite(outputBuffer, 1, bytesRead, output);
if (bytesWritten != bytesRead) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to write decrypted data\n");
exit(EXIT_FAILURE);
}
}
fclose(input);
fclose(output);
}
int main() {
const char* inputFile = "input.txt";
const char* encryptedFile = "encrypted.bin";
const char* decryptedFile = "decrypted.txt";
const char* key = "0123456789abcdef"; // 128位密
当涉及到文件加密时,C语言也提供了许多常用的加密算法和库。下面是一个示例,展示了如何使用OpenSSL库进行文件加密和解密。
首先,你需要确保已经安装了OpenSSL库,并且在编译时链接了正确的库文件。接下来,我们将使用AES对称加密算法进行文件加密和解密。
```c
#include <stdio.h>
#include <stdlib.h>
#include <openssl/aes.h>
// 加密文件
void encryptFile(const char* inputFile, const char* outputFile, const char* key) {
FILE* input = fopen(inputFile, "rb");
FILE* output = fopen(outputFile, "wb");
if (!input || !output) {
fprintf(stderr, "Failed to open file\n");
exit(EXIT_FAILURE);
}
// 设置加密密钥
AES_KEY aesKey;
if (AES_set_encrypt_key((const unsigned char*)key, 128, &aesKey) < 0) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to set encryption key\n");
exit(EXIT_FAILURE);
}
unsigned char inputBuffer[AES_BLOCK_SIZE];
unsigned char outputBuffer[AES_BLOCK_SIZE];
int bytesRead = 0;
int bytesWritten = 0;
// 逐块读取输入文件,并进行加密
while ((bytesRead = fread(inputBuffer, 1, AES_BLOCK_SIZE, input)) > 0) {
AES_encrypt(inputBuffer, outputBuffer, &aesKey);
bytesWritten = fwrite(outputBuffer, 1, bytesRead, output);
if (bytesWritten != bytesRead) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to write encrypted data\n");
exit(EXIT_FAILURE);
}
}
fclose(input);
fclose(output);
}
// 解密文件
void decryptFile(const char* inputFile, const char* outputFile, const char* key) {
FILE* input = fopen(inputFile, "rb");
FILE* output = fopen(outputFile, "wb");
if (!input || !output) {
fprintf(stderr, "Failed to open file\n");
exit(EXIT_FAILURE);
}
// 设置解密密钥
AES_KEY aesKey;
if (AES_set_decrypt_key((const unsigned char*)key, 128, &aesKey) < 0) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to set decryption key\n");
exit(EXIT_FAILURE);
}
unsigned char inputBuffer[AES_BLOCK_SIZE];
unsigned char outputBuffer[AES_BLOCK_SIZE];
int bytesRead = 0;
int bytesWritten = 0;
// 逐块读取输入文件,并进行解密
while ((bytesRead = fread(inputBuffer, 1, AES_BLOCK_SIZE, input)) > 0) {
AES_decrypt(inputBuffer, outputBuffer, &aesKey);
bytesWritten = fwrite(outputBuffer, 1, bytesRead, output);
if (bytesWritten != bytesRead) {
fclose(input);
fclose(output);
fprintf(stderr, "Failed to write decrypted data\n");
exit(EXIT_FAILURE);
}
}
fclose(input);
fclose(output);
}
int main() {
const char* inputFile = "input.txt";
const char* encryptedFile = "encrypted.bin";
const char* decryptedFile = "decrypted.txt";
const char* key = "0123456789abcdef"; // 128位密钥
// 加密文件
encryptFile(inputFile, encryptedFile, key);
// 解密文件
decryptFile(encryptedFile, decryptedFile, key);
printf("File encryption and decryption completed successfully\n");
return 0;
}
```
在上述示例中,我们使用了OpenSSL提供的AES_set_encrypt_key和AES_set_decrypt_key函数来设置加密和解密的密钥。然后,我们使用AES_encrypt和AES_decrypt函数对输入文件进行逐块的加密和解密操作。
在实际应用中,你可以根据需要调整文件路径、密钥和加密算法等参数。此外,你还可以进一步优化代码,添加错误处理和异常情况处理,以确保文件加密和解密的安全性和稳定性。
请注意,文件加密只是数据保护的一种手段,对于敏感数据的保护还需要综合考虑其他因素,如密钥管理、访问控制等。在实际开发中,请遵循相关的安全最佳实践,并使用适当的加密算法和工具来保护数据的安全性。