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

news/2024/5/6 20:42:51/文章来源:https://blog.csdn.net/soaipipiop/article/details/127166458

一、原理分析

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

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


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_19531.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu启动菜单的默认项】

【Ubuntu启动菜单的默认项】1. 摘要2. 具体实现2.1 打开grub配置2.2 修改默认启动4. 总结欢迎大家阅读2345VOR的博客【Ubuntu同步系统时间】&#x1f973;&#x1f973;&#x1f973; 本人主页&#xff1a; 已获得CSDN《嵌入式领域新星创作者》称号&#x1f47b;&#x1f47b;&…

【PyTorch深度学习项目实战100例】—— 使用GRU进行天气变化的时间序列预测 | 第11例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

Python-入门-模块和包(十三)

文章目录Python-入门-模块和包导入模块自定义模块自定义模块编写说明文档导入文件名中带空格与文件名以数字开头的模块\_\_name\_\_\_\_main\_\_作用详解导入模块的3种扩展方式动态执行模块模块内成员私有 多模块管理(包的概念)查看模块&#xff08;变量、函数、类&#xff09;…

上手全局锁,死锁

全局锁 就是对 整个数据库实例 加锁。当你需要让整个库处于 只读状态 的时候&#xff0c;可以使用这个命令&#xff0c;之后 其他线程的以下语句会被阻塞&#xff1a;数据更新语句&#xff08;数据的增删改&#xff09;、数据定义语句&#xff08;包括建表、修改表结 构等&…

《uni-app》一个非canvas的飞机对战小游戏实现(一)准备

这是一个没有套路的前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e;接下来的几篇都是uni-app的小实战&#xff0c;有助于我们更好的去学习u…

【论文阅读】Multitask Prompted Training Enables Zero-shot Task Generalization

文章目录AbstractIntroductionMeasuring generalization to held-out tasksA unfied prompt formatExperimental setupResultsConclusionAbstract 大模型在多种任务上学习提高了 zero-shot 泛化能力&#xff0c;有人假设这是语言模型在隐式多任务学习的结果。 zero-shot 泛化…

【C++】类和对象(上篇)——类的定义,访问限定符与this指针

前言 C 语言和 C 最大的区别就是一个面向过程&#xff0c;一个面向对象。而提到面向对象就不得部提到类&#xff0c;这一篇文章&#xff0c;我们主要探讨一下 C 中类的定义以及一些基本的权限。 目录 一、类的引入 二、类的定义 三、访问限定符 3.1 public 3.2 private / …

PTA - 数据库合集11

目录 10-74 修改学生选课成绩 10-75 添加成绩等级rank字段 10-77 删除成绩为空的学生选课记录 10-74 修改学生选课成绩 分数 5 全屏浏览题目 切换布局 作者 张庆 单位 集美大学 本题目要求编写UPDATE语句&#xff0c; 在SC表中修改‘C001’课程的成绩&#xff0c;若成绩小…

【自学】利用python进行数据分析 LESSON6 <pandas入门——pandas数据结构介绍2>

目录 前言 一、DataFrame 1. 列的选取 2. 行的选取 3. 列的修改 4. 列的删除 5. 嵌套字典赋给DataFrame 总结 前言 继续上一节的内容。往期内容如下&#xff1a; 【自学】利用python进行数据分析 LESSON5 &#xff1c;pandas入门——pandas数据结构介绍1&#xff1e;_…

数据结构初阶 顺序表补充

一. 题目的要求 写出三种链表的接口函数 它们的功能分别是 1 查找数的位置 2 在pos位置插入值 3 在pos位置删除值 二. 实现pos 这个其实很简单 找到一步步遍历 找到这个数字就返回 找不到就提示用户下 这 个数字不存在 int SeqListFind(SL* ps,int x) {int i;for ( i …

Red Hat Enterprise Linux release 8.0 (Ootpa)-性能调优工具Tuned

一、Tuned简介Tuned是Red Hat Linux操作系统自带的性能调优工具,通过针对特定应用场景提供配置来改善系统性能,自Red Hat Enterprise Linux/CentOS的6.3版本开始出现,包括两部分tuned和tuned-adm,其中tuned是服务端程序,用来监控和收集系统各个组件的数据,并依据数据提供…

SpringBoot二十六课大纲和目录

目录 ​​ 即使是在憎恨和杀戮中&#xff0c;仍然有些东西值得人们为之活下去。一次美丽的相遇&#xff0c;或是为了美丽事物的存在。我们描绘憎恨&#xff0c;是为了描写更重要的东西。我们描绘诅咒&#xff0c;是为了描写解放后的喜悦。 SpringBoot《第一课》_星辰镜的博客…

clickhouse常见部署图及LowCardinality低基数类型优缺点

clickhouse使用jdbc进行查询插入数据操作的部署图 一.读sql的核心是 读分布式表的数据&#xff08;分布式表可以读取互为副本的本地表的数据&#xff0c;起到容灾的目的&#xff09;&#xff0c;然后使用nginx作为负载均衡器和反向代理&#xff0c;代理后端clickhouse的分布式…

什么是低代码

文章目录no code / low code / pro code按适用范围的维度来分类低代码的技术意义与商业价值技术意义商业价值行业状态速读平台分类不同的实现方式不同的使用群体不同的使用方式优秀开源项目推荐no code / low code / pro code no code&#xff1a;自己编程给自己用&#xff0c…

Yao‘s GC 的通信最优解:Half Gate

参考文献&#xff1a; Bellare M, Hoang V T, Rogaway P. Foundations of garbled circuits[C]//Proceedings of the 2012 ACM conference on Computer and communications security. 2012: 784-796.Zahur S, Rosulek M, Evans D. Two halves make a whole[C]//Annual Interna…

MyBatisPlus入门宝典(二)CRUD

目录 一.添加 二.相关注解 三.修改 四.删除 五.查询 六.条件构造器 七.分页查询 八.全局配置 一.添加 1.配置文件开启SQL日志打印 # 开启SQL日志 mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 2.测试添加方法&#xff1a; …

Unity URP 色彩之旅

Unity URP 色彩之旅 这一切只是色彩科学的冰山一角… 文章目录Unity URP 色彩之旅1 我们是如何感知世界的&#xff1f;1.1 首先要有光&#xff01;1.2 人眼响应1.3 奇怪的大脑2 我们是如何描述颜色的&#xff1f;2.1 CIE 1931 RGB Color Space2.2 CIE 1931 XYZ Color Space2.3 …

JavaScript高级学习笔记:数据_变量_内存

1. 什么是数据? 2. 什么是内存? 3. 什么是变量? 4. 内存,数据, 变量三者之间的关系 变量保存的是内存中存储的地址值&#xff0c;而变量赋值就是将一个变量保存的内容拷贝一份到另一个变量中 这里面的.就是找obj对应地址值&#xff0c;中内存保存的相应数据 那么是不是所有…

SRv6----报文转发流程

按照下图路径&#xff0c;报文需要从主机H1转发到主机H2,H1将报文发送给节点A处理。节点A、B、D和F均为支持SRv6的设备&#xff0c;节点C和节点E为不支持SRv6的设备。 我们在SRv6源节点A上进行了网络编程&#xff0c;希望报文经过B-C和D-E这两条链路&#xff0c;然后送达节点F&…

华为面向5G的室内覆盖数字化概述

概述 数字化技术催生各行业的不断创新&#xff1a;ICT、媒体、金融、保险在数字化发展 曲线中已经独占鳌头&#xff0c;零售、汽车、油气化工、健康、矿业、农业等也在加速 其进程。促进数字化进程的关键技术包括软件定义设备、大数据、云计算、区 块链、网络安全、时延敏感网…