一、原理分析

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

  • 加密方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;
}

C语言---14文件操作---03文件加密器相关推荐

  1. 文件操作03 - 零基础入门学习C语言62

    第十一章:文件操作03 让编程改变世界 Change the world by program 字符串读写函数:fgets和fputs fgets函数 函数调用形式如:fgets(str,n,fp); ...

  2. C++ 学习笔记之——文件操作和文件流

    1. 文件的概念 对于用户来说,常用到的文件有两大类:程序文件和数据文件.而根据文件中数据的组织方式,则可以将文件分为 ASCII 文件和二进制文件. ASCII 文件,又称字符文件或者文本文件,它的 ...

  3. python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

  4. Kettle使用_15 文件操作复制文件到结果

    Kettle使用_15 文件操作复制文件到结果 需求: 通过Kettle的组件实现文件夹下所有文件的复制到另外个文件夹. 解决方法:结合获取文件名.复制文件名到结果.执行作业.添加到结果文件列表.复制 ...

  5. java删除相对路径文件夹_Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录...

    Java IO,io,文件操作,删除文件,删除文件夹,获取文件父级目录 这里先简单的贴下常用的方法: File.separator //当前系统文件分隔符 File.pathSeparator// F ...

  6. .NET基础-11-ArrayList|Hashtable|File文件操作|Dircetioy文件夹操作|Path路径操作

    集合 ArrayList与Hashtable应为存在拆箱与装箱,所以性能不怎么好,尽量不要使用,而使用泛型集合 可以使用下面的方式输出所消耗的时间 //ArrayList arl = new Arra ...

  7. python以写模式打开的文件无法进读操作_Python文件操作:文件的打开关闭读取写入...

    Python文件操作:文件的打开关闭读取写入 一.文件的打开关闭 Python能以文本和二进制两种方式处理文件,本文主要讨论在Python3中文本文件的操作. 文件操作都分为以下几个步骤: 1.打开文 ...

  8. 今天的码农女孩做了关于文件操作和文件拖拽的笔记 2022/1/21

    文件操作和文件拖拽 文件操作: js有两种机制:一个是事件机制,一个是io机制 文件操作对象: Blob通过二进制数据读取 file读取单个文件对象 fileList读取多个文件对象 fileRead ...

  9. C语言---14文件操作---01文件内容的顺序读写

    文中的源码都在这里哦!!! 文中的源码都在这里哦!!! 一.文件的基本概念 一个文件通常是磁盘上一段命名的存储区 磁盘文件(通常用的文件):指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使 ...

最新文章

  1. 信不信?以面向对象的思想是可以写好高并发程序的!
  2. Flutter事件与手势识别
  3. python爬虫案例-python爬虫详细解析附案例
  4. camuda流程引擎如此简单「五」
  5. 《动森》里那些看不见的声音设计
  6. 值得借鉴的30条好习惯
  7. java二维数组遍历排序,实现二维数组的按次序排序!!!
  8. golang python扩展_Python 利用Go语言编写 CPython 扩展 goPy的简单示例
  9. nbi可视化_2020最受欢迎的5个数据可视化工具分享
  10. 从Slice_Header学习H.264(三.2)--相关细节之 参考图像列表
  11. 层次分析法软件操作步骤(yaahp)
  12. 最强Redis实战学习笔记,没有之一!
  13. 《客户端性能测试基本流程》
  14. antdesign图片点击放大_vue图片点击放大功能
  15. 递归算法php,PHP递归算法的详细示例分析
  16. 使用DGV列获取Combox绑定所有的列为筛选条件
  17. 和外国人聊天的简化英语
  18. JSP: quoted with which must be escaped when used within the value 报错问题解决
  19. HTML与CSS详细介绍
  20. 网络流(最大流和最小费用流)

热门文章

  1. HTTP, 网络七层模型
  2. [CSS]CSS 的背景
  3. win10解除usb禁用_win10 禁用了usb设备功能怎么处理
  4. 2022年R2移动式压力容器充装考试试题及答案
  5. vue使用javascript动态创建script - 动态引入外部js文件
  6. Java打印1900年到2100年之间的闰年,一行打印4个
  7. CTF Web学习(三)----python脚本的编写及应用
  8. 用计算机弹卡路里数字,RER:猫卡路里摄入计算器,让猫保持完美身材的利器
  9. 网站内容链接优化SEO工具
  10. MySql删除列(多列)