【信息安全】C语言编程实现文件加解密

	- [2. 编写加解密程序](#2__30)
	- * [1. 程序代码](#1__31)
		* [2. 命令行传参](#2__198)
		* [3. 文件的读写](#3__225)
		* [4. 加解密中的细节](#4__265)
1. OpenSSL导入程序项目
  1. 下载并安装OpenSSL,下载地址
  2. 打开VS,创建控制台应用
    在这里插入图片描述
  3. 记得配置文件位置
    在这里插入图片描述
  4. 右键项目名称,找到属性,并点击打开属性

  1. 在VC++目录中,修改 包含目录 项和 库目录
  • 在包含目录中添加OpenSSL的 include 文件路径(路径间要用 ; 隔开),例如 D:\OpenSSL\OpenSSL-Win64\include
  • 在库目录中添加OpenSSL的 lib 文件路径,例如 D:\OpenSSL\OpenSSL-Win64\lib
    在这里插入图片描述
  1. 链接器输入附加依赖项 中添加一下两项
 libssl.lib;libcrypto.lib

在这里插入图片描述

  1. 在程序中添加以下代码
#include "openssl/aes.h" //这里的aes为自己所需的库函数
#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")

OpenSSL函数库就可以正常使用了!!!

2. 编写加解密程序
1. 程序代码
#define \_CRT\_SECURE\_NO\_DEPRECATE
# include<iostream>
#include <memory.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "openssl/aes.h"
#pragma comment(lib, "libssl.lib")
#pragma comment(lib, "libcrypto.lib")

using namespace std;
void produce\_key\_buf(unsigned char aes_keybuf[32],int pwdlen,char pwd[])
{
	int len;
	memset(aes_keybuf, 0x90, 32);
	if (pwdlen < 32)
	{
		len = pwdlen;
	}
	else
	{
		len = 32;
	}
	for (int i = 0; i < len; i++)
		aes_keybuf[i] = pwd[i];
}

long int get\_file\_read\_write(FILE\* &read,FILE \*&write,char src_filename[],char dest_filename[])
{
	// read读取文件,write写文件
	read = fopen(src_filename, "rb");
	write = fopen(dest_filename, "wb");

	// 判断文件是否存在
	if (read == NULL)
	{
		printf("文件不存在或文件路径有误!");
		return 0;
	}

	//获取文件大小
	fseek(read, 0, SEEK\_END);
	long filesize = ftell(read);
	rewind(read);

	return filesize;
}

void file\_encryption(char filename[], char pwd[], int pwdlen)
{
	unsigned char aes_keybuf[32];
	produce\_key\_buf(aes_keybuf, pwdlen, pwd);
	AES_KEY aeskey;
	AES\_set\_encrypt\_key(aes_keybuf, 256, &aeskey);


	FILE\* read, \* write;
	char dest_filename[20] = "enc\_file.docx";
	long int filesize = get\_file\_read\_write(read, write, filename,dest_filename);
	if (filesize == 0)
	{
		return;
	}

	// 判断循环的轮数,与剩余字节大小
	int nLoop = filesize / 16;
	int nRes = filesize % 16;

	// 获取要填充的字节数
	fwrite(&nRes, sizeof(int), 1, write);

	// 文件读写缓冲区
	unsigned char buffer[16],enc_buffer[16];

	// 文件主体
	for (int i = 0; i < nLoop; i++)
	{
		fread(buffer, 16, 1, read);
		AES\_encrypt(buffer, enc_buffer, &aeskey);
		fwrite(enc_buffer, 16, 1, write);
	}
	// 文件剩余字节
	memset(buffer, 0, 16);
	fread(buffer, nRes, 1, read);
	AES\_encrypt(buffer, enc_buffer, &aeskey);
	fwrite(enc_buffer, 16, 1, write);

	// 关闭流
	fclose(read);
	fclose(write);

}

void file\_decryption(char filename[], char pwd[], int pwdlen)
{
	unsigned char aes_keybuf[32];
	produce\_key\_buf(aes_keybuf, pwdlen, pwd);
	AES_KEY aeskey;
	AES\_set\_decrypt\_key(aes_keybuf, 256, &aeskey);


	FILE\* read, \* write;
	char dest_filename[20] = "dec\_file.docx";
	long int filesize = get\_file\_read\_write(read, write, filename, dest_filename);
	if (filesize == 0)
	{
		return;
	}

	int nRes;
	fread(&nRes, sizeof(int), 1, read);

	// 判断循环的轮数,与剩余字节大小
	int nLoop = (filesize-4) / 16;

	// 文件读写缓冲区
	unsigned char buffer[16], decbuffer[16];
	// 文件主体
	for (int i = 0; i < nLoop-1; i++)
	{
		fread(buffer, 16, 1, read);
		AES\_decrypt(buffer, decbuffer, &aeskey);
		fwrite(decbuffer, 16, 1, write);
	}

	fread(buffer, 16, 1, read);
	AES\_decrypt(buffer, decbuffer, &aeskey);
	fwrite(decbuffer, nRes, 1, write);


	// 关闭流
	fclose(read);
	fclose(write);
}

int main(int argc, char\* argv[])
{
	char op[5], filename[30], pwd[20];
	strcpy(op, argv[1]);
	strcpy(filename, argv[2]);
	strcpy(pwd, argv[3]);

	if (strcmp(op, "enc")==0)
	{
		file\_encryption(filename, pwd, strlen(pwd));
	}
	else if (strcmp(op, "dec") == 0)
	{
		file\_decryption(filename, pwd, strlen(pwd));
	}
	else {
		printf("输入类型有误!");
	}
	return 0;
}

以上代码即为我编写的为文件加密解密的程序,编译运行后可在命令行输入三个参数:

  • 第一个参数为操作类型,输入 enc 代表加密,输入 dec 代表解密
  • 第二个参数为文件的相对路径,相对于 .exe 文件的路径
  • 第三个参数为加密解密所用的密码。

关于下面文章内容我主要讲解自身在编写代码中学到的内容。

2. 命令行传参

如果要实现命令行参数传递可在 mian 函数中加入以下参数:

int main(int argc, char\* argv[])

其中

argc:整数,用来统计你运行程序时送给main函数的命令行参数的个数。
argv[0]:指向程序运行的全路径名。
argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
argv[2]:指向在DOS命令行中执行程序名后的第二个字符串。
...

可用 strcpysscanf 函数将其赋值到自己所需的空间中

char name[10];
int age;
strcpy(name, argv[1]);
sscanf(argv[2], "%d", &age);

若出现 sscanfscanf不可用,可在程序的最前面添加:

#define \_CRT\_SECURE\_NO\_DEPRECATE

3. 文件的读写

本文程序所用的文件读写函数为:freadfwrite

fread 与 fwrite 函数的原型如下面的代码所示:



**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/5a6563304d6c397e149c2b57aed83124.png)
![img](https://img-blog.csdnimg.cn/img_convert/15bd580cccb3eb791b0c01f37dddafe9.png)
![img](https://img-blog.csdnimg.cn/img_convert/64535036ed3a226a2cffd6e80339fbda.png)
![img](https://img-blog.csdnimg.cn/img_convert/542be4a35ca770f82af1c5b3d2a622df.png)
![img](https://img-blog.csdnimg.cn/img_convert/afd9ba6c66ff25edf61da2a086960366.png)
![img](https://img-blog.csdnimg.cn/img_convert/8f56dd0581bc64a8d5a72ec7bfcbd625.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)**
![img](https://img-blog.csdnimg.cn/img_convert/7f7d7c1f3d4ccced0e22df07065389f1.png)




还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)








![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)





![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


😝朋友们如果有需要的话,可以联系领取~

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)


#### 2️⃣视频配套工具&国内外网安书籍、文档


##### ① 工具


![](https://img-blog.csdnimg.cn/img_convert/d3f08d9a26927e48b1332a38401b3369.png#pic_center)


##### ② 视频


![image1](https://img-blog.csdnimg.cn/img_convert/f18acc028dc224b7ace77f2e260ba222.png#pic_center)


##### ③ 书籍


![image2](https://img-blog.csdnimg.cn/img_convert/769b7e13b39771b3a6e4397753dab12e.png#pic_center)

资源较为敏感,未展示全面,需要的最下面获取

![在这里插入图片描述](https://img-blog.csdnimg.cn/e4f9ac066e8c485f8407a99619f9c5b5.png#pic_center)![在这里插入图片描述](https://img-blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png#pic_center)


##### ② 简历模板


![在这里插入图片描述](https://img-blog.csdnimg.cn/504b8be96bfa4dfb8befc2af49aabfa2.png#pic_center)

 **因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆**

  





**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
![img](https://img-blog.csdnimg.cn/img_convert/eb90c954d655b8cf8981463ab015dc96.png)

c5b5.png#pic_center)![在这里插入图片描述](https://img-blog.csdnimg.cn/111f5462e7df433b981dc2430bb9ad39.png#pic_center)


##### ② 简历模板


![在这里插入图片描述](https://img-blog.csdnimg.cn/504b8be96bfa4dfb8befc2af49aabfa2.png#pic_center)

 **因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆**

  





**一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
[外链图片转存中...(img-eljT53zI-1712877859191)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值