当前位置: 首页 > 文档资料 > C 语言程序设计 >

文件加密

优质
小牛编辑
146浏览
2023-12-01

文件加密

案例描述

近些年来,因为信息泄露造成财产损失的事件时有发生。随着科技的发展,信息的传播与获取越来越方便,为了防止因信息泄露造成的各种危机,信息加密技术应得到充分的重视。本案例要求设计程序,对已经存在的文件进行加密和解密。

案例分析

文件加密的目的是保证信息的安全,加密的原理是根据某种原则,对源文件中的信息进行修改,使加密后的文件在与源文件仍保持联系的情况下,不会直接反映出源文件中存储的信息,并且加密后的文件能根据某种原则,还原出源文件的内容。

案例实现

根据案例分析,本案例中的文件可分为三个:源文件,加密文件和解密后的文件。

使用异或的方式对源文件进行加密。为了保证源文件的完整,这里将加密后的信息存放到新的文件中,所以将运算的结果存储到加密文件。

若要根据加密文件获取源文件中存储的信息,需要逐个读取加密文件中的字符,使其与密码再次异或,获取解密后的信息。 ​

案例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//加密函数
void encrypt(char *sfile, char *cfile)
{
    printf("文件加密中...\n");
    int i = 0;
    //定义两个文件指针,分别指向源文件和加密后的文件
    FILE *fp1, *fp2;                    
    int ch;                                        //记录从源文件中获取的字符
    //以只读的方式打开源文件
    fp1 = fopen(sfile, "rb");                    
    if (fp1 == NULL)
    {
        printf("无法打开源文件%s\n",sfile);
        return;
    }
    //以只写的方式打开加密文件
    fp2 = fopen(cfile, "wb");
    if (fp2 == NULL)
    {
        printf("无法打开加密文件%s\n", cfile);
        return;
    }
    ch = fgetc(fp1);//从源文件中读取一个字符
    while (!feof(fp1))
    {
        //采用异或方式,使用密码"123+i"对字符逐个加密
        ch = (123 + i) ^ ch;                
        i++;                                    
        fputc(ch, fp2);    //将加密后的字符写入加密文件fp2
        ch = fgetc(fp1);//继续从源文件中获取字符
        if (i > 5)
            i = 0;                                
    }
    printf("加密完成!\n");
    //关闭文件
    fclose(fp1);
    fclose(fp2);
}

//解密函数
void decrypt(char *cfile, char *dfile)
{
    int i = 0;
    //定义两个文件指针,分别指向加密文件和解密后的文件
    FILE *fp1, *fp2;            
    int ch;
    //以只读的方式打开加密文件
    fp1 = fopen(cfile, "rb");
    if (fp1 == NULL)
    {
        printf("无法打开加密文件%s\n", cfile);
        return;
    }
    //以只写的方式打开解密后的文件
    fp2 = fopen(dfile, "wb");
    if (fp2 == NULL)
    {
        printf("无法打开解密后的文件%s\n", cfile);
        return;
    }
    //解密
    ch = fgetc(fp1);//获取文件fp1中的字符
    while (!feof(fp1))
    {
        ch = (123 + i) ^ ch;//对已加密的字符逐个解密
        i++;
        fputc(ch, fp2);    //将解密后的字符写入文件fp2
        ch = fgetc(fp1);
        if (i > 5)
            i = 0;
    }
    //关闭文件
    fclose(fp1);
    fclose(fp2);
}

int main()
{
    //定义源文件、加密文件、解密后的文件
    char sourcefile[50];                    
    char codefile[50];
    char decodefile[50];
    printf("请输入源文件的文件名:\n");
    gets(sourcefile);
    printf("请输入加密文件的文件名:\n");
    gets(codefile);
    //调用加密函数对源文件进行加密
    encrypt(sourcefile, codefile);

    //文件解密
    printf("请输入解密后的文件名:\n");
    gets(decodefile);
    //调用解密函数对加密文件进行解密
    decrypt(codefile, decodefile);
    return 0;
}