admin管理员组文章数量:1650774
文件加密解密的学习
一.main
函数的命令行参数的使用
-
一个程序的
main()
函数的可以包括两个参数第一个参数的类型为int型;
第二个参数为字符串数组。
通常情况下,将第一个参数命名为argc
,第二个参数为argv
(当然参数名字可以换)。由于字符串数组有两种表达方式,因此,main函数存在两种书写方法:形式一:
int main(int argc, char* argv[])//这里使用char* argv[] { return 0; }
形式二:
int main(int argc, char** argv)//这里使用char ** argv { return 0; }
注 :
-
其中
int argc
记录参数(及字符串)的个数 argc=1+用户输入的字符串的个数 , 操作系统负责计算数量若用户输入N个字符串,那么argc= N + 1 -
其中char* argv[]或char**argv指的是指向字符型指针数组的指针 , 首先它是一个指针 , 这个指针是指向数组的,而这个数组的成员也是指针 , 成员指针是指向字符型数组的。
注意:操作系统会自动加入一条字符串(程序名称)到字符串数组中,因此,最终的字符串数数组长度为N+1。在代码编码使用字符串内容时,需要注意字符串的索引号
例如:
argv[0]=可执行文件名称,例如test.exe(非用户输入,操作系统根据可执行文件名称自动生成)
argv[1]= 字符串1
argv[2]=字符串2
argv[3]=字符串3 -
命令行 : program(文件名) str1 str2 str3(参数)
-
-
使用
-
编程状态下的使用:
若参数类型不满足程序最终的类型,就要进行类型转换,主要表现在字符串和数字之间的转换,例如将字符串 argv[1]=”21321”转换为整型变量,可以使用
int temp=atoi(argv[1]);
-
用户在cmd窗口输入
打开cmd窗口后,将可执行文件拖入窗口,根据程序要求的符串数量输入字符串,并以空格分开各个字符串,输入结束后回车即可。
-
二.文件操作的容错处理
在进行文件型数据类型操作时,若文件为空或者不存在.程序会因不能进入文件操作循环体而不对操作过程作任何反应。为此,在对文件进行操作之前.要首先对文什状态进行检测、处理。
三.文件的处理
-
文件指针的声明
//下面的代码是将文件指针赋给fp1 FILE *fp1; fp1=fopen("xxxxx","r");//xxxxx表示路径,r表示打开文件的方式
-
fopen( )函数的学习 (用来打开一个文件)
-
声明:
FILE *fopen(const char *filename, const char *mode)
-
参数
-
filename --这是C字符串 ,包含了要打开的文件名称。
-
mode – 这是 C 字符串,包含了文件访问模式,模式如下:
模式 描述 “r” 打开一个用于读取的文件。该文件必须存在。 “w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 “a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 “r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 “w+” 创建一个用于读写的空文件。 “a+” 打开一个用于读取和追加的文件。
注:
-
上述的形态字符串都可以再加一个b字符,如
rb
、w+b
或ab+
等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt
,w
t,其中t表示以文本模式打开文件。 -
二进制和文本模式的区别
-
在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
-
在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别
-
-
-
返回值
该函数返回一个FILE指针。否则返回NULL。
-
实例
下面的实例演示了
fopen()
函数的用法。#include <stdio.h> #include <stdlib.h> int main() { FILE * fp; fp = fopen ("file.txt", "w+"); fprintf(fp, "%s %s %s %d", "We", "are", "in", 2019); fclose(fp); return(0); }
让我们编译并运行上面的程序,这将创建一个带有一下内容的文件 file.txt:
We are in 2019
现在让我们使用下面的程序查看上面文件的内容:
#include <stdio.h> int main () { FILE *fp; int c; fp = fopen("file.txt","r"); while(1) { c = fgetc(fp); if( feof(fp) ) { break ; } printf("%c", c); } fclose(fp); return(0); }
-
-
fclose( )函数的学习 (用来关闭一个由fopen( )函数打开的文件)
-
声明
int fclose(FILE *stream);
-
返回值
返回一个整型数 。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。
-
-
fgetc( )函数的学习(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。)
-
声明
int fgetc(FILE *stream)
-
参数
stream --这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
-
返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
-
-
fputc( )函数的学习( 用来把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。)
-
声明
int fputc(int char, FILE *stream)
-
参数
char --这是要被写入的字符。该字符以其对应的 int 值进行传递。
stream --这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
-
返回值
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
-
四.register的学习
- register 就是CPU寄存器的意思,这个里面的变量要比放在内存里读取快很多
- 但是
register
的空间很小,一般也就几MB的样子,服务器的CPU可能会更大一些。如果寄存器用完了即使你的变量声明的时候带上register
也不会放进寄存器里面。
五.加密算法的学习
目前使用的是比较简单的对称加密算法 ,即通过改字符的对应编码来使其达到乱码
在对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行加密和解密。这就要求加密和解密方事先都必须知道加密的密钥。
数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。
数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。
源码如下:
一.编辑器正常运行操作版本
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<bits/stdc++.h>
void encfile(char *in_filename,char *pwd,char *out_filename); /*对文件进行加密的具体函数*/
void decryptfile(char* in_filename,char *pwd,char *out_filename); /*对文件进行解密的具体函数*/
int main()
{
int option; /*功能选择*/
/*in_filename和out_filename之前由于设置太小导致内存污染使opinion的值发生变化*/
char in_filename[3000]; /*用户输入的要加密的文件名或是要解密的文件*/
char out_filename[3000]; /*用户输入加密后保存的文件名或是解密保存的文件名*/
char pwd[1000];/*用来保存密码*/
printf("thank you for using this program......\n");
printf("1. Encrypt a file\n2. Decrypt a file\n");
printf("chose your option......");
scanf("%d",&option);
getchar();
printf("Please input In-filename:\n");
gets(in_filename);/*得到要加密的文件名,这里可以直接把要加密的文件或要解密的文件拖入"源代码.exe"中*/
printf("Please input your Password:\n");
gets(pwd);/*得到密码*/
printf("Please input Out-filename:\n");
gets(out_filename);/*得到加密后你要的文件名*/
switch(option)
{
case 1: //加密
encfile(in_filename,pwd,out_filename);/*加密函数调用*/
break;
case 2://解密
decryptfile(in_filename,pwd,out_filename);/*解密函数调用*/
break;
default:
break;
}
system("pause");/*输出“请按任意键继续...”的字,等待用户按一个键,然后返回。*/
return 0;
}
/*加密子函数开始*/
void encfile(char *in_filename,char *pwd,char *out_file)
{
FILE *fp1,*fp2;/*声明文件指针*/
register char ch;//声明寄存器变量,增加读取速度
int j=0;
int j0=0;
fp1=fopen(in_filename,"r");/*打开要加密的文件*/
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1);/*如果不能打开要加密的文件,便退出程序*/
}
fp2=fopen(out_file,"w");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1);/*如果不能建立加密后的文件,便退出*/
}
while(pwd[++j0]);
ch=fgetc(fp1); /*从文件指针指定的文件中读入一个字符*/
/*加密算法开始*/
while(!feof(fp1))
{
if(j0 >7)
j0 = 0;
ch += pwd[j0++];
fputc(ch,fp2); /*把参数 ch指定的字符(一个无符号字符)写入到fp2中,并把位置标识符往前移动。*/
ch=fgetc(fp1); /*从fp1中获取下一个字符(一个无符号字符),并把位置标识符往前移动*/
}
fclose(fp1);/*关闭源文件*/
fclose(fp2);/*关闭目标文件*/
}
/*解密子函数开始*/
void decryptfile(char *in_filename,char *pwd,char *out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int j0=0;
fp1=fopen(in_filename,"r");/*打开要解密的文件*/
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1);/*如果不能打开要解密的文件,便退出程序*/
}
fp2=fopen(out_file,"w");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1);/*如果不能建立解密后的文件,便退出*/
}
while(pwd[++j0]);
ch=fgetc(fp1);
/*解密算法开始*/
while(!feof(fp1))
{
if(j0 >7)
j0 = 0;
ch -= pwd[j0++];
fputc(ch,fp2);
ch=fgetc(fp1);
}
fclose(fp1);/*关闭源文件*/
fclose(fp2);/*关闭目标文件*/
}
二.命令行操作版本
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<bits/stdc++.h>
void encfile(char *in_filename,char *pwd,char *out_filename); /*对文件进行加密的具体函数*/
void decryptfile(char* in_filename,char *pwd,char *out_filename); /*对文件进行解密的具体函数*/
int main(int argc,char *argv[])/*定义main()函数的命令行参数*/
{
int option; /*加密或解密的功能选择*/
/*in_filename和out_filename之前由于设置太小导致内存污染使opinion的值发生变化,也可以动态分配内存*/
char in_filename[30000]; /*用户输入的要加密的文件名或是要解密的文件*/
char out_filename[30000]; /*用户输入加密后保存的文件名或是解密保存的文件名*/
char pwd[1000];/*用来保存密码*/
if(argc!=4)/*4指的是程序名+文件名+密码+加密后的文件名,一共4个参数*/
{
/*容错处理*/
printf("Please input In-filename:\n");
gets(in_filename);/*得到要加密的文件名,这里可以直接把要加密的文件或要解密的文件拖入"源代码.exe"中*/
printf("Please input your Password:\n");
gets(pwd);/*得到密码*/
printf("Please input Out-filename:\n");
gets(out_filename);/*得到加密后你要的文件名*/
}
else
{
/*如果命令行参数正确,便直接运行程序*/
strcpy(in_filename,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out_filename,argv[3]);
}
printf("1. Encrypt a file\n2. Decrypt a file\n");
printf("chose your option......");
scanf("%d",&option);
getchar();
switch(option)
{
case 1: //加密
encfile(in_filename,pwd,out_filename); /*加密函数调用*/
break;
case 2: //解密
decryptfile(in_filename,pwd,out_filename); /*解密函数调用*/
break;
default:
break;
}
printf("thank you for using this program......\n");
system("pause");/*命令行上输出“请按任意键继续...”的字,等待用户按一个键,然后返回。*/
return 0;
}
/*加密子函数开始*/
void encfile(char *in_filename,char *pwd,char *out_file)
{
FILE *fp1,*fp2;/*声明文件指针*/
register char ch;
int j=0;
int j0=0;
fp1=fopen(in_filename,"r");/*打开要加密的文件*/
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1);/*如果不能打开要加密的文件,便退出程序*/
}
fp2=fopen(out_file,"w");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1);/*如果不能建立加密后的文件,便退出*/
}
while(pwd[++j0]);
ch=fgetc(fp1); /*从文件指针指定的文件中读入一个字符*/
/*加密算法开始*/
while(!feof(fp1))
{
if(j0 >7)
j0 = 0;
ch += pwd[j0++];
fputc(ch,fp2); /*把参数 ch指定的字符(一个无符号字符)写入到fp2中,并把位置标识符往前移动。*/
ch=fgetc(fp1); /*从fp1中获取下一个字符(一个无符号字符),并把位置标识符往前移动*/
}
fclose(fp1);/*关闭源文件*/
fclose(fp2);/*关闭目标文件*/
}
/*解密子函数开始*/
void decryptfile(char *in_filename,char *pwd,char *out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int j0=0;
fp1=fopen(in_filename,"r");/*打开要解密的文件*/
if(fp1==NULL)
{
printf("cannot open in-file.\n");
exit(1);/*如果不能打开要解密的文件,便退出程序*/
}
fp2=fopen(out_file,"w");
if(fp2==NULL)
{
printf("cannot open or create out-file.\n");
exit(1);/*如果不能建立解密后的文件,便退出*/
}
while(pwd[++j0]);
ch=fgetc(fp1);
/*解密算法开始*/
while(!feof(fp1))
{
if(j0 >7)
j0 = 0;
ch -= pwd[j0++];
fputc(ch,fp2);
ch=fgetc(fp1);
}
fclose(fp1);/*关闭源文件*/
fclose(fp2);/*关闭目标文件*/
}
版权声明:本文标题:简单的文本文件加密小程序 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729527118a1204702.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论