【CUPK小学期】笔记1:文件加密解密(1)

该文介绍了如何使用C语言编程实现文件的加密和解密功能,主要通过位运算中的异或操作实现。程序包括加密函数encryptFile和解密函数decryptFile,主函数中用户可以选择加密或解密操作,并输入密钥和目标文件名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求功能

  1. 将输入的字符串信息(包含字母和数字)保存至文件。

  2. 实现在C语言程序中对该文件的加密和解密功能。


必备知识

C语言程序设计:文件、位运算


程序展示

加密

 加密后的结果:

 解密

解密后的结果


代码思路

1.加密函数

void encryptFile(FILE *srcFile, FILE *destFile, char key) {
}

函数名为encryptFile,接受三个参数:源文件指针srcFile、目标文件指针destFile和加密密钥key

函数的具体步骤如下:

(1). 声明一个字符变量ch,用于存储读取到的字符。

char ch;

(2). 使用一个循环,不断从源文件中读取字符,直到文件结束(EOF)。
(3). 在循环中,对读取到的字符进行异或操作,密钥为`key`。这个操作会对字符进行加密。
(4). 将加密后的字符写入目标文件中。

while ((ch = fgetc(srcFile)) != EOF) {
        // 对字符进行异或操作
        ch = ch ^ key;
        fputc(ch, destFile);
    }
  • ch = ch ^ key 是一个异或运算(XOR),表示对变量 chkey 进行逐位异或操作。
  • 异或运算的规则是:如果两个对应位的值相同,则结果为0;如果两个对应位的值不同,则结果为1。
  • 这个操作可以实现一些简单的加密和解密操作。在加密中,可以用一个密钥(key)对明文进行异或运算,得到密文。在解密中,再用相同的密钥对密文进行异或运算,可以得到原来的明文。

(5). 循环结束后,表示文件已经全部加密完成。

2.解密函数

解密操作与加密操作是互逆的,即通过解密函数对加密后的文件进行解密,可以还原为原始的文件内容。

void decryptFile(FILE *srcFile, FILE *destFile, char key) {
}

函数名为decryptFile,接受三个参数:源文件指针srcFile、目标文件指针destFile和解密密钥key

函数的具体步骤与加密函数类似:

(1)声明一个字符变量ch,用于存储读取到的字符。

char ch;

(2)使用一个循环,不断从源文件中读取字符,直到文件结束(EOF)。
(3)在循环中,对读取到的字符进行异或操作,密钥为key。这个操作会对字符进行解密。
(4)将解密后的字符写入目标文件中。

while ((ch = fgetc(srcFile)) != EOF) {
        // 对字符进行异或操作
        ch = ch ^ key;
        fputc(ch, destFile);
    }

(5)循环结束后,表示文件已经全部解密完成。

原理 

加密1010 (ch)
1100(key)
 0110  (结果)
解密^1100 (key)
1010 (ch)
必须保证输入的密钥要保持一致。

3.主函数

首先,用户输入要操作的文件名。然后,用户需要选择是加密还是解密操作,并输入密钥。根据用户的选择,程序会打开源文件和目标文件,并调用相应的加密或解密函数将文件内容进行处理。最后,程序会关闭文件并输出相应的完成提示。

具体思路如下:

(1)声明变量:srcFileNamedestFileName用于存储文件名,key用于存储密钥,choice用于存储用户选择的操作。同时,声明srcFiledestFile两个文件指针变量。

char srcFileName[100], destFileName[100], key;
int choice;
FILE *srcFile, *destFile;

(2)提示用户输入要操作的文件名,并将输入存储到srcFileName变量中。

printf("请输入要操作的文件名:");
scanf("%s", srcFileName);

(3)打开源文件:使用fopen函数打开srcFileName指定的文件,并将返回的文件指针赋值给srcFile变量。如果打开失败(srcFile为NULL),则输出错误信息并返回1。

 srcFile = fopen(srcFileName, "r");
    if (srcFile == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }

(4)提示用户选择操作,并将选择存储到choice变量中。

    printf("请选择操作:\n");
    printf("1. 加密\n");
    printf("2. 解密\n");
    printf("请输入选项:");
    scanf("%d", &choice);

(5)提示用户输入密钥,并将输入存储到key变量中。

    printf("请输入密钥:");
    scanf(" %c", &key);

(6)如果用户选择加密操作(choice为1):
a. 提示用户输入加密后的文件名,并将输入存储到destFileName变量中。
b. 打开目标文件:使用fopen函数打开destFileName指定的文件,并将返回的文件指针赋值给destFile变量。如果打开失败(destFile为NULL),则输出错误信息并返回1。

  if (choice == 1) {
        printf("请输入加密后的文件名:");
        scanf("%s", destFileName);

        // 打开目标文件,如果文件不存在则创建
        destFile = fopen(destFileName, "w");
        if (destFile == NULL) {
            printf("无法创建文件!\n");
            return 1;
        }

c. 调用加密函数:将srcFile、destFile和key作为参数传递给encryptFile函数,对源文件进行加密处理。
d. 输出加密完成的提示信息。

   encryptFile(srcFile, destFile, key);

        printf("加密完成!\n");
    } else if (choice == 2) {
        printf("请输入解密后的文件名:");
        scanf("%s", destFileName);

        // 打开目标文件,如果文件不存在则创建
        destFile = fopen(destFileName, "w");
        if (destFile == NULL) {
            printf("无法创建文件!\n");
            return 1;
        }

(7)如果用户选择解密操作(choice为2):
a. 提示用户输入解密后的文件名,并将输入存储到destFileName变量中。
b. 打开目标文件:使用fopen函数打开destFileName指定的文件,并将返回的文件指针赋值给destFile变量。如果打开失败(destFile为NULL),则输出错误信息并返回1。
c. 调用解密函数:将srcFile、destFile和key作为参数传递给decryptFile函数,对源文件进行解密处理。
d. 输出解密完成的提示信息。

(8)如果用户选择的操作既不是加密也不是解密(choice不为1或2),则输出无效选项的提示信息。

decryptFile(srcFile, destFile, key);

        printf("解密完成!\n");
    } else {
        printf("无效的选项!\n");
    }

(9)关闭文件:使用fclose函数分别关闭srcFile和destFile。

(10)返回0,表示程序执行成功。

 fclose(srcFile);
fclose(destFile);

return 0;

完整代码

#include <stdio.h>

// 加密函数
void encryptFile(FILE *srcFile, FILE *destFile, char key) {
    char ch;
    while ((ch = fgetc(srcFile)) != EOF) {
        // 对字符进行异或操作
        ch = ch ^ key;
        fputc(ch, destFile);
    }
}

// 解密函数
void decryptFile(FILE *srcFile, FILE *destFile, char key) {
    char ch;
    while ((ch = fgetc(srcFile)) != EOF) {
        // 对字符进行异或操作
        ch = ch ^ key;
        fputc(ch, destFile);
    }
}

int main() {
    char srcFileName[100], destFileName[100], key;
    int choice;
    FILE *srcFile, *destFile;

    printf("请输入要操作的文件名:");
    scanf("%s", srcFileName);

    // 打开源文件
    srcFile = fopen(srcFileName, "r");
    if (srcFile == NULL) {
        printf("无法打开文件!\n");
        return 1;
    }

    printf("请选择操作:\n");
    printf("1. 加密\n");
    printf("2. 解密\n");
    printf("请输入选项:");
    scanf("%d", &choice);

    printf("请输入密钥:");
    scanf(" %c", &key);

    if (choice == 1) {
        printf("请输入加密后的文件名:");
        scanf("%s", destFileName);

        // 打开目标文件,如果文件不存在则创建
        destFile = fopen(destFileName, "w");
        if (destFile == NULL) {
            printf("无法创建文件!\n");
            return 1;
        }

        // 调用加密函数
        encryptFile(srcFile, destFile, key);

        printf("加密完成!\n");
    } else if (choice == 2) {
        printf("请输入解密后的文件名:");
        scanf("%s", destFileName);

        // 打开目标文件,如果文件不存在则创建
        destFile = fopen(destFileName, "w");
        if (destFile == NULL) {
            printf("无法创建文件!\n");
            return 1;
        }

        // 调用解密函数
        decryptFile(srcFile, destFile, key);

        printf("解密完成!\n");
    } else {
        printf("无效的选项!\n");
    }

    // 关闭文件
    fclose(srcFile);
    fclose(destFile);

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值