文件操作案例-大文件加解密

文件操作预备知识:

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

//函数功能:从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回0

参数:buffer 用于接收数据的内存地址;size 要读的每个数据项的字节数;count 要读数据项的个数,每个数据项size个字节;

fwrite函数同理


文件操作案例-大文件加解密

1.数据加密解密接口测试

2.数据加密过程分析

   文件数据的move copy_ 数据加密

3.数据加解密功能集成

   数据加密和解密分为两个版本 打Padding和不打Padding

   数据加密解密原理


函数加密:

两个文件在传输过程中,进行加密操作。

那么首先实现两个文件进行搬运的功能,之后再进行加密。

</pre>文件搬运功能代码如下:</p><p><pre name="code" class="cpp">#include "stdafx.h"
#include "des.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string>
#include <stdio.h>
#pragma warning(disable:4996)
int FileSymEnc(const char *pfile1,const char *pfile2){
	int ret = 0;
	FILE *fp1 = NULL, *fp2 = NULL;
	unsigned char plain[4096];
	int plainlen = 0,plainlen2=0;
	fp1 = fopen(pfile1,"rb");
	if (fp1 == NULL){
		goto End;
	}
	fp2 = fopen(pfile2,"wb");
	if (fp2 == NULL){
		goto End;
	}
	//文件打开了,要拷贝数据了
	while (!feof(fp1)){
		plainlen=fread(plain, 1, 4096, fp1);
		if (feof(fp1)){//读完数据以后,判断是否文件结束
			break;
		}
		plainlen2 = fwrite(plain, 1, plainlen, fp2);
		if (plainlen2 != plainlen){
			ret = -3;
			printf("写文件失败,请检查是否磁盘已满\n");
			goto End;
		}
	}
	//小于4k,就直接写
	plainlen2=fwrite(plain, 1, plainlen, fp2);
	if (plainlen2 != plainlen){
		ret = -3;
		printf("写文件失败,请检查是否磁盘已满\n");
		goto End;
	}
End:
	if (fp1 != NULL)
	{
		fclose(fp1);
	}
	if (fp2 != NULL){
		fclose(fp2);
	}
	return 0;
}

void main(){
	int ret = 0;
	const char *file1 = "f:/normalBayes.txt";
	const char *file2 = "f:/normalBayesenc.txt";
	ret = FileSymEnc(file1,file2);
	if (ret != 0){
		printf("FileSymEnc err.\n");
	}
	return;
}

加密基本知识

加密 分为 对称加密和非对称加密

对称加密:指的是加密的密钥和解密的密钥一样

非对称加密:加密的密钥和解密的密钥不一样

加解密三要素:明文 密文 密钥

公式:输入一个明文  经过运算 出来一个密文

对称加密:

应用场景  运算速度快  适合做大数据加密 但是强度稍弱

算法有例如: des 3des AES196 ...

非对称加密:

应用场景 运算速度慢 适合做小数据加密 强度大 不容易攻破

算法有例如:rsa1024 2048 ECC椭圆曲线...

散列 哈希(不可逆 指纹)

对称加密原理:(padding)

分块分组加密   假设一个文件长度为4096+5个字节 而密钥每次都只处理8个字节 最后5个字节 单独处理 (缺几补几) 在最后加上三个字节 例如补上333

这样就会变成8的整数倍,解密的时候,把最后一个字符取出来,假设如果是3,那么将最后三个字符扔掉。

也即有不同的加密函数 对于是否为8的整数倍   

在本例子中 对于处理4k和小于4k的数据 有不同的加密函数进行处理


整个框架如下:

首先 定义头文件 des.h

int DesEnc(
	unsigned char *pInData,
	int            nInDataLen,
	unsigned char *pOutData,
	int           *pOutDataLen
	);
//用户使用函数des解密
int DesDec(
	unsigned char *pInData,
	int           nInDataLen,
	unsigned char *pOutData,
	int           *pOutDataLen
	);
int DesEnc_raw(
	unsigned char *pInData,
	int            nInDataLen,
	unsigned char *pOutData,
	int           *pOutDataLen);

然后 定义 文件加解密.cpp

#include "stdafx.h"
#include "des.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string>
#include <stdio.h>
#pragma warning(disable:4996)
int FileSymEnc(const char *pfile1,const char *pfile2){
	int ret = 0;
	FILE *fp1 = NULL, *fp2 = NULL;
	unsigned char plain[4096];
	int plainlen = 0,plainlen2=0;
	unsigned char cryptbuf[4096] = { 0 };
	int cryptlen = 0;
	fp1 = fopen(pfile1,"rb");
	if (fp1 == NULL){
		goto End;
	}
	fp2 = fopen(pfile2,"wb");
	if (fp2 == NULL){
		goto End;
	}
	//文件打开了,要拷贝数据了
	while (!feof(fp1)){
		plainlen=fread(plain, 1, 4096, fp1);
		if (feof(fp1)){//读完数据以后,判断是否文件结束
			break;
		}

		//加密==4K的数据
		ret = DesEnc_raw(plain, plainlen, cryptbuf, &cryptlen);
		if (ret != 0){
			printf("func DesEnc() err:%d\n",ret);
			goto End;
		}

		plainlen2 = fwrite(cryptbuf, 1, cryptlen, fp2);
		if (plainlen2 != cryptlen){
			ret = -3;
			printf("写文件失败,请检查是否磁盘已满\n");
			goto End;
		}
	}
	//小于4k,就直接写
	//加密
	ret = DesEnc(plain,plainlen,cryptbuf,&cryptlen);
	if (ret != 0){
		printf("func DesEnc() err:%d\n", ret);
		goto End;
	}

	plainlen2 = fwrite(cryptbuf, 1, cryptlen, fp2);
	if (plainlen2 != cryptlen){
		ret = -3;
		printf("写文件失败,请检查是否磁盘已满\n");
		goto End;
	}
End:
	if (fp1 != NULL)
	{
		fclose(fp1);
	}
	if (fp2 != NULL){
		fclose(fp2);
	}
	return 0;
}

void main(){
	int ret = 0;
	const char *file1 = "f:/normalBayes.txt";
	const char *file2 = "f:/normalBayesenc.txt";
	ret = FileSymEnc(file1,file2);
	if (ret != 0){
		printf("FileSymEnc err.\n");
	}
	return;
}


最终实现文件加密功能,解密功能 待续....



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值