您的位置:首页 > 编程语言

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

2011-11-17 01:04 405 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: