先声明,小编的代码全是自己跟着学习,摸索着前进的,没什么技术含量在内,要说什么专业性术语,那不是为难小编嘛。
下面,逐步实现加解密的代码,请跟着小编往下看,多叨扰一句:一个一个字地看,因为小编也会跟着敲,哪里出了错误,小编也会及时跟着解决。
前面说到,既然能写入又能读出了,那么加、解密在哪?
下面就逐步剖析出小编的一套加密法,很简单,也很直白,目的就是达到每写入一个字节后面加点字符,为了省事,小编就添加了随机字母A-Z。
那么如何实现呢,因为考虑到某方面,加一个字节数据不保险,小编就多添加点,这里呢,添加三个。
//加密函数 int DesEnc(char* Buffer, size_t* size, char* Buffer2, size_t& size2); //解密函数 int DesEnc_raw(char* Buffer, size_t* size, char* Buffer2, size_t& size2);
因为我们前面用char类型来保存数据的,这里我们还是用char类型,防止其他类型在转换时,数据或多或少地被遗漏掉。
当我们在读出后,从意义上看,已经有了数据,往后不用想就是加密函数了。
当然了,首看加密和解密函数很粗糙,难以理解,这里也不用理解太深,只要知道参数1:传入的数据,参数2:传入数据的字节数,参数3:加密后带出的数据,参数4:带出数据的字节数,即可。
//声明加密后的字符串变量和字节存储的变量
char *addPassName = NULL; size_t addPassLength = 0;
既然有了这两个变量,就可以带出数据和数据字节数。
参数1:我们不知道数据大小,但编译器却是知道的,我们在fread()时,就已经读出来了。
参数2:fread()函数的返回值
参数3:考虑到addPassName已经为空,就不能直接带入,分配假设需要的内存空间。
参数4:就是addPassLength,用索引符,就是为了从加密函数中带出来
//读出、写入文件 while ((ret = feof(f_Read)) != EOF) { //读出文件,因为我们假设不知道文件所写的是什么内容,文件又不大的话,可以先设定为256 //当然sizeof(stringname)也行 readLength = fread((char*)stringname, 1,sizeof(stringname), f_Read);
//申请内存空间 addPassName=(char *)malloc(sizeof(char)*256); //加密 int ret = DesEnc(stringname, &readLength, addPassName, addPassLength); //当读取完毕,结束继续读,feof()这个函数会读取2次 if (ret == feof(f_Read)) { system("pause"); break; } }
下面就可以写加密函数了。
int DesEnc(char* Buffer, size_t* size, char* Buffer2, size_t& size2) { int sizeNumber = *size; cout <<"带入的数据字节:"<< sizeNumber << endl; int ret = -1; //判断带入的数据是否存在 if (Buffer == NULL || sizeNumber == 0) { cout << "数据为空,或者字节为0" << endl; system("pause"); return ret; } //方便查看 for (size_t i = 0 ;i<sizeNumber ;i++) { cout << Buffer[i] << " "; } cout << endl; return 1; }
输出的结果就是,所带入的数据字节和数据。
为了防止出现错误,也可以在加密函数后面添加判断,-1,调用失败,否,则调用成功。
int ret = DesEnc(stringname, &readLength, addPassName, addPassLength); if (ret == -1) { cout << "error" << endl; } else { cout << "加密ok" << endl; }
数据既然有了,那么就可以加密了。
int DesEnc(char* Buffer, size_t* size, char* Buffer2, size_t& size2) { int sizeNumber = *size; cout <<"带入的数据字节:"<< sizeNumber << endl; int ret = -1; //判断带入的数据是否存在 if (Buffer == NULL || sizeNumber == 0) { cout << "数据为空,或者字节为0" << endl; system("pause"); return ret; } int j = 0; //作为cpytemp临时存储数据的位置 int index = 0; //用来存储cpytemp存储的次数,也就是加密后的字节数 char* bufftemp = NULL; //存储每个字符以及加密后的数据 bufftemp = new char[sizeNumber*4]; int l = 0; //作为bufftemp的下标(位置) for (size_t i = 0;i<sizeNumber ;i++) { //用一个数组临时存储数据,也为了方便可以赋值给bufftemp char cpybuff[4] = {0}; if (j == 0) { cpybuff[j] = Buffer[i]; //存储了第一个字节 index += 1; //因为说添加三个随机加密A-Z字母,就添加三个 for (size_t k =j+1;k<4;k++) { char c[1] = {0}; c[0] = rand() % 26 + 65; cpybuff[k] = c[0]; //cout << cpytemp[k] << " "; index += 1; j++; } //将每i次循环后,i位置上的字符和加密后的字符都带入bufftemp for (size_t k=0;k<4;k++) { bufftemp[l] = cpybuff[k]; l++; } j =0; //j==0,就是为了让cpybuff每次都能从0的位置带入数据 } } //这样就能将原有数据+加密后的数据全部带入Buffer2中,带出函数体 for (size_t i = 0; i < index; i++) { *(Buffer2 + i) = bufftemp[i]; } Buffer2[index] = '