C语言实现任何文件的加密解密功能
背景介绍
在实际开发中,有时会需要对一些敏感信息或重要文件进行加密操作,以保证数据安全性。在C语言中,可以通过一些加密算法,对文件进行加密和解密操作,从而实现对文件的保护。
实现步骤
整个加密解密过程可以分为以下几个步骤:
- 读取需要进行加密/解密的文件;
- 对读取到的内容进行转换,如加密算法的处理;
- 将转换后的内容写入到新的文件中,实现加密/解密结果的输出;
- 关闭文件。
下面以示例说明具体的实现过程。
示例1:简单的异或加密解密算法
下面简单介绍一种通过异或操作进行加密解密的算法,对于加密/解密操作,只需要将明文或密文与一个特定的密钥进行异或操作即可。
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#define KEY 0x07 // 定义密钥
void encryptDecrypt(char *input)
{
char *output = input;
while (*input) {
*output = *input ^ KEY;
output++;
input++;
}
}
int main()
{
FILE *fp_in, *fp_out;
char ch;
char fname[100];
printf("请输入需要加密或解密的文件名(如:test.txt): ");
scanf("%s", fname);
// 打开文件,并进行读写操作
fp_in = fopen(fname, "rb");
fp_out = fopen("temp.txt", "wb");
if (fp_in == NULL) {
printf("无法打开文件!\n");
exit(1);
}
while ((ch = fgetc(fp_in)) != EOF) {
fputc(ch, fp_out);
}
fclose(fp_in);
fclose(fp_out);
fp_in = fopen("temp.txt", "rb+");
fp_out = fopen(fname, "wb");
if (fp_in == NULL || fp_out == NULL) {
printf("无法打开文件!\n");
exit(1);
}
// 对读取到的文件内容进行加密或解密操作
while ((ch = fgetc(fp_in)) != EOF) {
char newCh = ch;
encryptDecrypt(&newCh);
fputc(newCh, fp_out);
}
fclose(fp_in);
fclose(fp_out);
// 删除中间文件
remove("temp.txt");
printf("文件加密/解密完成!\n");
return 0;
}
运行这个程序,输入需要进行加密解密的文件名,程序将会自动进行加密解密操作,并输出加密/解密完成的提示。
示例2:AES对称加密算法
AES加密算法是对称加密算法中相对比较安全和流行的一种加密方式。在C语言中,可以使用第三方库openssl来实现AES加密解密操作。需要手动安装libssl-dev,在Ubuntu系统中,可以通过以下代码来进行安装
sudo apt-get install libssl-dev
具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/aes.h>
#define CHUNK_SIZE 1024
#define KEY_SIZE 256
void encryptAES(char *inFileName, char *outFileName, char *key)
{
FILE *inFile, *outFile;
unsigned char *inBuffer, *outBuffer;
unsigned char iv[AES_BLOCK_SIZE];
size_t fileSize, blockSize;
inFile = fopen(inFileName, "rb");
if (inFile == NULL) {
printf("无法打开文件!\n");
exit(1);
}
// 获取文件大小
fseek(inFile, 0, SEEK_END);
fileSize = ftell(inFile);
rewind(inFile);
blockSize = (fileSize < CHUNK_SIZE) ? (fileSize + AES_BLOCK_SIZE) : CHUNK_SIZE;
inBuffer = (unsigned char*)malloc(blockSize * sizeof(unsigned char));
outBuffer = (unsigned char*)malloc(blockSize * sizeof(unsigned char));
// 随机生成iv向量
RAND_bytes(iv, AES_BLOCK_SIZE);
// 初始化加密器
AES_KEY aesKey;
AES_set_encrypt_key((unsigned char*)key, KEY_SIZE, &aesKey);
// 写入iv向量到输出文件中
outFile = fopen(outFileName, "wb");
fwrite(iv, sizeof(unsigned char), AES_BLOCK_SIZE, outFile);
while (1) {
size_t blockRead = fread(inBuffer, sizeof(unsigned char), blockSize, inFile);
if (blockRead <= 0) {
break;
}
// 使用AES算法加密数据块
AES_cbc_encrypt(inBuffer, outBuffer, blockRead, &aesKey, iv, AES_ENCRYPT);
fwrite(outBuffer, sizeof(unsigned char), blockRead, outFile);
}
fclose(inFile);
fclose(outFile);
free(inBuffer);
free(outBuffer);
printf("文件加密完成!\n");
}
void decryptAES(char *inFileName, char *outFileName, char *key)
{
FILE *inFile, *outFile;
unsigned char *inBuffer, *outBuffer;
unsigned char iv[AES_BLOCK_SIZE];
size_t fileSize, blockSize;
inFile = fopen(inFileName, "rb");
if (inFile == NULL) {
printf("无法打开文件!\n");
exit(1);
}
// 获取文件大小
fseek(inFile, 0, SEEK_END);
fileSize = ftell(inFile);
rewind(inFile);
blockSize = (fileSize < CHUNK_SIZE + AES_BLOCK_SIZE) ? (fileSize - AES_BLOCK_SIZE) : CHUNK_SIZE;
inBuffer = (unsigned char*)malloc(blockSize * sizeof(unsigned char));
outBuffer = (unsigned char*)malloc(blockSize * sizeof(unsigned char));
// 读入iv向量数据
size_t tmpRead = fread(iv, sizeof(unsigned char), AES_BLOCK_SIZE, inFile);
if (tmpRead != AES_BLOCK_SIZE) {
printf("文件不正确!\n");
fclose(inFile);
exit(1);
}
// 初始化解密器
AES_KEY aesKey;
AES_set_decrypt_key((unsigned char*)key, KEY_SIZE, &aesKey);
// 按照块读取文件,使用AES算法解密数据块
outFile = fopen(outFileName, "wb");
while (1) {
size_t blockRead = fread(inBuffer, sizeof(unsigned char), blockSize, inFile);
if (blockRead <= 0) {
break;
}
AES_cbc_encrypt(inBuffer, outBuffer, blockRead, &aesKey, iv, AES_DECRYPT);
fwrite(outBuffer, sizeof(unsigned char), blockRead, outFile);
// 最后一块需要特殊处理
if (blockRead < blockSize) {
if (!AES_cbc_encrypt(inBuffer, outBuffer, blockSize, &aesKey, iv, AES_DECRYPT)) {
printf("最后一块解密失败!\n");
exit(1);
} else {
fwrite(outBuffer, sizeof(unsigned char), fileSize - blockRead, outFile);
}
}
}
fclose(inFile);
fclose(outFile);
free(inBuffer);
free(outBuffer);
printf("文件解密完成!\n");
}
int main()
{
char inFileName[100], outFileName[100], key[KEY_SIZE/8];
printf("请输入需要加密的文件名: ");
scanf("%s", inFileName);
printf("请输入输出的加密文件名: ");
scanf("%s", outFileName);
printf("请输入密钥(长度为%d位): ", KEY_SIZE/8);
scanf("%s", key);
encryptAES(inFileName, outFileName, key);
printf("请输入需要解密的文件名: ");
scanf("%s", inFileName);
printf("请输入输出的解密文件名: ");
scanf("%s", outFileName);
printf("请输入密钥(长度为%d位): ", KEY_SIZE/8);
scanf("%s", key);
decryptAES(inFileName, outFileName, key);
return 0;
}
运行这个程序,输入需要加密的文件名和密钥,程序将会自动进行加密操作,并输出加密完成的提示。输入需要解密的文件名和密钥,程序将会自动进行解密操作,并输出解密完成的提示。
总结
通过C语言中的一些加密算法,可以对任意类型的文件进行加密解密操作,在实际开发中可以使用这些算法来保护文件的安全性,避免敏感信息泄露。同时,需要注意在进行加密解密操作时,文件的读取和写入操作是否正确,以及所使用的算法的安全性和可靠性等因素。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现任何文件的加密解密功能 - Python技术站