C语言---14文件操作---03文件加密器

一、原理分析

  • 对称加密体制是传统而经典的加密体制策略

  • 加密方A使用该密钥key对要保密的文件进行加密操作,从而生成密文

  • 解密方B同样使用该密钥key对加密文件实施解密操作,从而生成明文

(一)加密过程

(二)解密过程

  • 只有输入正确的密码才能解密加密文件,不然得到的文件不是原来的

二、项目提示

1、打开文件的时候用二进制方式打开进行读写

2、测文件大小方法

  • 用fseek() 定位流指针到文件的末尾

  • 用ftell()函数测流指针的位置,即文件的大小

3、读文件内容

  • 根据文件的大小用malloc申请内存空间保存读出的内容

  • 读文件数据的时候要从文件的开始读(rewind())

三、程序编写

(一)框架的搭建

  • 根据项目提示与要求搭建基本的输入输出框架 

(二)fun.h

// 防止头文件重复包含
#pragma once
#ifndef __FUN_H__
#define __FUN_H__

// 功能函数声明
extern void print_help(void);
extern void get_file_name(char* dest_file_name, char* src_file_name);
extern char* read_src_file(unsigned long* file_length, char* src_file_name);
extern char* file_text_encrypt(char* src_file_text, unsigned long int length, unsigned int password);

extern void save_file(char* text, unsigned long int length, char* file_name);
#endif

(三)fun.c

  • 包含头文件

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

1、从键盘获取原文件和目的文件名字

  • void get_file_name(char * dest_file_name,char * src_file_name)

  • 函数功能:获取目的文件和原文件的名字

  • 参数

  • src_file_name:原文件名字字符数组首地址

  • dest_file_name:目的文件的名字字符数组首地址

void get_file_name(char* dest_file_name, char* src_file_name)
{
    printf("请输入你的源文件名称(30个字符):");
    scanf("%s", src_file_name);
    printf("请输入你的目的文件名称(30个字符):");
    scanf("%s", dest_file_name);
    return;
}

2、从文件中读出内容

  • char * read_src_file(unsigned long int *file_length,char *src_file_name)

  • 函数功能:在此函数中测文件的大小,并通过calloc函数开辟空间。再把文件内容读出,并返回读出字符数组的首地址

  • 参数

  • file_length:整型指针,此地址中保存文件字节数

  • src_file_name:文件名字,从此文件中读取内容

  • 返回值:读出字符串的首地址

char* read_src_file(unsigned long* file_length, char* src_file_name)
{
    // 1、创建文件指针
    char* data = NULL;
    FILE* fp = NULL;
    fp = fopen(src_file_name, "r");
    if (fp == NULL)
    {
        perror("fopen");
        return NULL;
    }

    // 2、获取文件总长度
    fseek(fp, 0, 2); // 将文件流指针定位到文件尾部  
    *file_length = ftell(fp); // 获取文件长度
    rewind(fp); // 复位文件流指针

    // 3、根据文件的长度申请堆区空间
    data = (char*)calloc(1, *file_length);
    if (data == NULL)
    {
        perror("calloc");
        return NULL;
    }

    // 4、一次性读取文件内容
    fread(data, *file_length, 1, fp);
    fclose(fp);

    // 5、将空间首地址返回
    return data;
}

3、字符数组加密

  • char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)

  • 加密原理:字符数组中每个元素加上password

  • 函数功能:对字符串进行加密

  • 参数

  • src_file_text:要加密的字符串

  • length:字符串的长度

  • password:加密密码

  • 返回值:加密后的字符串的首地址

char* file_text_encrypt(char* src_file_text, unsigned long int length, unsigned int password)
{
    int i = 0;
    for (i = 0; i < length; i++)
    {
        src_file_text[i] += password; // 加密的过程
    }
    return src_file_text;
}

4、解密字符串

  • char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned
    int password)

  • 思想:把数组中的每个元素减去password给自己赋值

  • 函数功能:解密字符

  • 参数

  • src_file_text:要解密的字符串
  • length:字符串的长度
  • password:解密密码
  • 返回值:解密后的字符串的首地址
char* file_text_decrypt(char* src_file_text, unsigned long int length, unsigned int password)
{
    int i = 0;
    for (i = 0; i < length; i++)
    {
        src_file_text[i] -= password; // 解密的过程
    }
    return src_file_text;
}

5、保存文件

  • void save_file(char* text,unsigned long int length,char * file_name)

  • 思想:传入字符数组的首地址和数组的大小及保存后的文件的名字,即可保存数组到文件中

  • 函数功能:将字符串保存到目的文件中

  • 参数:

  • text:要保存的字符串首地址

  • file_name:目的文件的名字

  • length:字符串的长度

void save_file(char* text, unsigned long int length, char* file_name)
{
    FILE* fp = NULL;
    fp = fopen(file_name, "w");
    if (fp == NULL)
    {
        perror("fopen");
        return;
    }

    // 将data数据保存到文件中
    fwrite(text, length, 1, fp);
    fclose(fp);

    // 释放text指向堆区空间
    if (text != NULL)
    {
        free(text);
        text = NULL;
    }

    printf("保存成功!\n");
    return;
}

6、打印文件信息

  • 函数功能:打印帮助信息

void print_help()
{
    printf("********1:加密文件***********\n");
    printf("********2:解密文件***********\n");
    printf("********3:退出程序***********\n");
}

(四)main.c

#include<stdio.h>
#include"fun.h"
int main(int argc, char* argv[])
{
    while (1)
    {
        int cmd = 0;
        print_help();
        scanf("%d", &cmd); // 获取想要进行的操作

        if (cmd == 1)
        {
            char src_file[31] = ""; // 给一个字节空间给'\0'
            char dst_file[31] = "";
            char* file_data = NULL;
            unsigned long file_length = 0;
            unsigned int passwd = 0;

            // 1、获取源文件 目的文件名
            get_file_name(dst_file, src_file);

            // 2、获取源文件名对应的文件
            file_data = read_src_file(&file_length, src_file);

            // 3、获取用户输入的密码
            printf("请输入你的密码:");
            scanf("%u", &passwd);

            // 4、对文件内容加密
            file_data = file_text_encrypt(file_data, file_length, passwd);
           
            // 5、对加密好的文件内容保存到目的文件名中
            save_file(file_data, file_length, dst_file);
        }
        else if (cmd == 2)
        {
            char src_file[31] = "";
            char dst_file[31] = "";
            char* file_data = NULL;
            unsigned long file_length = 0;
            unsigned int passwd = 0;

            // 1、获取源文件目的文件名
            get_file_name(dst_file, src_file);

            // 2、获取源文件名对应的文件内容
            file_data = read_src_file(&file_length, src_file);

            // 3、获取用户输入的密码
            printf("请输入你的密码:");
            scanf("%u", &passwd);

            // 4、对文件内容解密
            file_data = file_text_decrypt(file_data, file_length, passwd);

            // 5、对解密好的文件内容保存到目的文件名中
            save_file(file_data, file_length, dst_file);
        }
        else if (cmd == 3)
        {
            break;
        }
        else
        {
            printf("请输入一个正确的选项\n");
        }
    }
    return 0;
}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盾山狂热粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值