文件操作预备知识:
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;
}
最终实现文件加密功能,解密功能 待续....