自己写的明文加密程序的源代码(支持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; }
相关文章推荐
- Enc-Base64位加密程序包括源代码(支持中文和特殊符号)
- jQuery语法高亮插件支持各种程序源代码语法着色加亮
- 自己的内核支持低版本arm-linux-gcc静态编译的程序
- Unity3D项目程序加密1——在Unity3D里使用自己的dll
- 发布一个自己写的PrintPreviewControl自定义控件,支持鼠标滚轮,源代码下载。
- google地图密钥申请与将google地图集成到自己的程序中(附源代码)
- 一个使用JAVA编写的类似按键精灵的程序,支持脚本文件编写(含源代码)
- 如何让自己的程序支持iPhone5–RetinaImages
- 开发自己的Web服务处理程序(以支持Ajax框架异步调用Web服务方法)
- 怎么让IIS 支持php zend加密程序运行
- 自己编译A13可用zImage,支持SD卡安装程序,完美安装愤怒的小鸟
- 一个难题: 怎样写一个输出自己源代码的程序?
- 发布一个自己写的PrintPreviewControl自定义控件,支持鼠标滚轮,源代码下载
- 加密算法(自己写)java自己给明文密码加密
- 给自己的 Blog程序添加对Windows Live Writer的支持
- 【036】◀▶ 自己写的程序源代码
- 简单的文件同步备份程序,仅支持单向同步_程序及源代码
- Unity3D项目程序加密1——在Unity3D里使用自己的dll
- 自己写的用JS脚本定时执行Web地址并且得到它的源代码的页面程序
- <U3D>Unity3D项目程序加密1——在Unity3D里使用自己的dll和生成dll