自己写的明文加密程序的源代码(支持32M的文本文件)

来源:互联网 发布:男性粘液丝高 知乎 编辑:程序博客网 时间:2024/05/17 06:51



#include <stdio.h>#include <stdlib.h>#include <string.h> #include <io.h>//定义BSIZE为32*1M #define BSIZE (32*1024*1024)char buf[BSIZE];int convertchar(char *buf, int bufsize);int resumechar(char *buf, int bufsize);int write_file(const char *fout, const char *buf, int bufsize);int read_file(const char *fin, char *buf, int bufsize, int flag);int p_buf(const char *buf, int n);char *input_fname(char * in_fn, int fn_size);void p_help(void);int main(int argc, char *argv[]){  char buf_sw[256], in_fn[256];  int read_n = 0;  p_help();  while(printf("\ninput cmd>"),gets(buf_sw))  {      switch(buf_sw[0])      {          case 'c':                    printf("please input file(be converted) path...\n");                    read_n = read_file(input_fname(in_fn, 256), buf, BSIZE, 0);                    if(read_n < 0)                    {                        printf("read fail!\n");                        break;                    }                    printf("begin convert file...\n");                    //简单的 转换,加密文档                     if(convertchar(buf, read_n))                    {                        printf("convert fail!\n");                        break;                    }                    printf("convert file ok!\n");                    printf("save the converted file,input a file name path:\n");                    write_file(input_fname(in_fn, 256), buf, read_n);                    printf("save file ok! the file is:%s\n", in_fn);                    break;          case 'r':                     printf("please input file(be resumed) path...\n");                    read_n = read_file(input_fname(in_fn, 256), buf, BSIZE, 0);                    if(read_n < 0)                    {                        printf("read fail!\n");                        break;                    }                    printf("begin resume file...\n");                    //恢复文档                     if(resumechar(buf, read_n))                    {                        printf("resume fail!\n");                        return 1;                    }                    printf("resume ok, now save the resumed file,input a path:\n");                    write_file(input_fname(in_fn, 256), buf, read_n);                    printf("save file ok! the file is:%s\n", in_fn);                    break;          case 'p':                     printf("show specified file context,input filename path:\n");                    read_file(input_fname(in_fn, 256), buf, BSIZE, 1);                    break;          case 'h':          case 'H': p_help(); break;          case 'q':           case 'Q': exit(1);          default: printf("input cmd again!\n");      }  }    sleep(10);  system("PAUSE");  return 0;}void p_help(void){    printf("cmd \"c\" for convert file to special format\n");    printf("cmd \"r\" for resume file to normal format\n");    printf("cmd \"p\" show context of a file\n");    printf("cmd \"q\" or \"Q\" for quit program   cmd \"h\" or \"H\" for help");    return ;}/* *如果不使用 in_fn = malloc(fn_size);这句,那就得用数组,不然不用malloc会出错 ×如果用malloc那么返回这个值之前不能释放这段内存,因为它还要使用这个内存的值 ×但是如果这样的话,下次我怎么知道什么时候释放,经过试验,是不能在其他函数中释放的。  ×最后还是采用数组吧,数组也不行,因为它是局部变量了,函数不能返回一个局部变量的指针 */char *input_fname(char *in_fn, int fn_size){//文件名定义为fn_size,此处为256个字节 //    if(!(in_fn = malloc(fn_size)))//    {//        printf("malloc for file name path fail!\n");//        return NULL;//    }    printf("input a file path:\n");    gets(in_fn);    printf("file path is: %s \n", in_fn);//    free(in_fn); //如果前面是malloc这一行不能用,否则,接下来返回的指针式NULL就会判断文件不存在     return in_fn;}/*input:  buf, n *output: buf *return: int: 1,0; *function: print char; *加密方式:偏移ASCII码值,将来还要加入一些复杂度更高的加密方法  */int p_buf(const char *buf, int n){  int i = 0;  for(i = 0; i < n; i++)  {      printf("%c", buf[i]);  }  printf("\n");}/*input:  buf, bufsize *output: buf *function: convert char; *加密方式:偏移ASCII码值,将来还要加入一些复杂度高度加密方法  */int convertchar(char *buf, int bufsize){  int i = 0;  //这里对buf也应该判断,显然buf不能是NULL   if(bufsize<=0||buf==NULL)  {      return 1;  }  for(i = 0; i < bufsize; i++)  {         //ascii[48,126]-15 -->[33,111]      if((buf[i]>=48)&&(buf[i]<=126))      {          buf[i] = buf[i]- 15;      }      else if((buf[i]<=47)&&(buf[i]>=33))      {          //ascii[33,47]+79 -->[112,126]          buf[i] = buf[i]+79;      }      else if((buf[i]>=0&&buf[i]<=31)||(buf[i] == 32))      {      }      else      {          buf[i] = buf[i] - 1;      }        }  return 0;}/*input:  buf, bufsize *output: buf *function: resume char; *解密方式:反偏移ASCII码值 */int resumechar(char *buf, int bufsize){  int i = 0;  if((bufsize<=0)||(buf==NULL))  {      return 1;  }  for(i = 0; i < bufsize; i++)  {         //[33,111]+15; -->ascii[48,126]      if((buf[i]>=33)&&(buf[i]<=111))      {          buf[i] = buf[i] + 15;      }      else if((buf[i]<=126)&&(buf[i]>=112))      {          //[112,126]-79;-->ascii[33,47]          buf[i] = buf[i] - 79;      }      else if((buf[i]>=0&&buf[i]<=31)||(buf[i] == 32))      {      }      else      {          buf[i] = buf[i] + 1;      }        }  return 0;}int write_file(const char *fout, const char *buf, int w_size){    FILE *fop = NULL;    if((w_size <= 0)||(fout == NULL)||(buf == NULL))    {        return 1;    }    if((fop = fopen(fout, "w"))==NULL)    {        return 1;    }    fwrite((void *)buf, 1, w_size, fop);    fclose(fop);    return 0;    }/*input:  fin, bufsize *output: buf *return: rn(read size),-1(failed) *function: read file to buf; */int read_file(const char *fin, char *buf, int bufsize, int flag){    FILE *fop = NULL;    int rn = 0;    printf("[debug] fin %x, %s, flag:%d \n-----\n", fin, fin, flag);    if((bufsize < -1)||(fin == NULL)||(buf == NULL))    {        printf("input args invalid!\n");        return -1;    }    if(access(fin, 0))    {        printf("file not exist!\n");        return -1;    }    if((fop = fopen(fin, "r"))==NULL)    {        printf("file open failed!\n");        return -1;    }    //之前malloc了,现在free;但是这样free是不行的,都不在一个生命周期了     //free(fin);     rn = fread((void *)buf, 1, bufsize, fop);    fclose(fop);    //如果flag==1,那么打印从文件中读到的内容;     if(flag == 1)    {        p_buf(buf, rn);    }    return rn;}


原创粉丝点击