文件加密(加密方程为a*x^2+b)
核心:文本模式和二进制模式读写文件
本程序包括文本模式打开文件,进行普通写入,和二进制模式打开文件,进行加密内容的二进制模式写入,加密方程式a*x^2+b,a,b为短整型,由用户输入值。
程序运行过程解析 :
-
输入新建文件路径及名称
例如 : 要在D盘,HDU文件夹中新建(使用fopen()函数)一个名为open.txt文本文件(即后缀名为.txt的文件) 则需要输入 D:\HDU\open.txt -
以文本模式打开文件,用fputs()函数进行字符写入,fputs()用法,fputs(str, fp),str代表数组地址,fp为文件指针,意思即将数组str中字符写入文件,fp相当于”写入指针”,打双引号是因为这个名称我取的(🤪),把它想像成打印指针就行,写入一个字符,fp后移再次进行写入,直到str数组为空(即遇到’\0’为止)
-
关闭文件(使用fclose()函数),用二进制模式打开文件。
此时,有一个重要注意事项*
如果你对第一次文本模式写入的数据进行读取,在读取之后,在用二进制模式写入加密内容之前,一定要用rewind()函数,rewind(fp),
保证上述操作后,方可写入加密内容。
如果没有这句话(rewind(fp)😉,那么二进制模式写入加密内容将无效,打开txt文件会发现没有第二次写入的加密内容,这是文本模式和二进制模式混用出现的特殊错误。
/
咳咳,不用rewind(),就需要用fseek()函数找好位置,再写入,比较麻烦
/
不信你把它注释掉(🤪),在代码中用//和*标记的位置。
- 两次输入均用了数组,第一次数组是整体用fputs()写入文件,第二次是对数组进行处理(根据加密方程式处理)再用fwrite()函数逐个写入,处理前记录一下该”字符”的正负,ascii码为正,可以认为是字符, 否则则是汉字码,两个汉字码可输出一个汉字,例如 :
char han_z[3] = {"六"};//一个汉字两个字节
//加一个'\0',所以定义数组容量为3
printf("%c%c", han_z[0], han_z[1])
运行结果为 : 六
-
用一个数组statis(统计),如果得到”字符”为正,则赋值为1。解密时根据 statis数组中的值,进行输出,若statis[i] = 1,则输出字符 ; 如果为0,则输出汉字
具体代码如下 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define N 1000
long int encrypt_c(char c, int a, int b);
char decrypt_c(long int encry, int a, int b);
int main(void)
{
FILE *fp;
char str1[N]={0}, Dir_fname[20], han_z[3] = {0};
char str2[N]={0}, str3[N]={0}, ch;
int a, b, i , j, t, statis[N] = {0};
long int code;
i = j = 0;
printf("请输入路径及文件名:\n");
scanf("%s", Dir_fname);
getchar();
printf("请输入非加密信息(按'#'结束输入)\n");
gets(str1);
t = strlen(str1);
if((fp = fopen(Dir_fname, "w")) == NULL)
{
printf("创建文件失败!\n");
exit(0);
}
fputs(str1, fp);
fclose(fp);
if((fp = fopen(Dir_fname, "ab+")) == NULL)
{
printf("打开文件失败:\n");
exit(0);
}
fgets(str2, t+1, fp);
printf("加密方程为a*x^2+b:\n");
printf("请输入a和b的值:\n");
scanf("%d %d",&a, &b);
fflush(stdin);
printf("请输入需要加密的文本材料:(按'#'结束输入)\n");
gets(str3);
rewind(fp);//这一步很重要,想想为什么*
while(str3[i] != '#')
{
ch = str3[i];
code = encrypt_c(ch, a, b);
if(ch < 0)
statis[i] = 1;
fwrite(&code,sizeof(long int),1,fp);
i ++;
}
i = 0;
printf("文件打开如下:\n\n");
rewind(fp);
while(fread(&ch,sizeof(char),1,fp) == 1)
{
if(ch == '#')
break;
if(ch < 0)
{
han_z[i++] = ch;
if(i == 2)
{
i = 0;
printf("%c%c",han_z[0],han_z[1]);
}
}
else
{
putchar(ch);
}
}
printf("\n");
if(ch == '#')
{
while(fread(&code,sizeof(long int),1,fp) == 1)
{
ch = decrypt_c(code, a, b);
if(statis[j++] == 1)
{
han_z[i++] = (-1)*ch;
if(i == 2)
{
i = 0;
printf("%c%c",han_z[0],han_z[1]);
}
}
else
putchar(ch);
}
}
fclose(fp);
putchar('\n');
puts("Bye bye!\n");
return 0;
}
long int encrypt_c(char c, int a, int b)
{
long int encry;
encry = a * c * c + b;
return encry;
}
char decrypt_c(long int encry, int a, int b)
{
char decry;
decry = sqrt((encry-b)/a);
return decry;
}
程序运行结果 :
文件操作结果 :
#前面的是明文,在文件里面可以看到,为: sjhusdb hdbjhx 54 546d6ds
后面为密文,在文件里面为乱码,但通过读取,并进行处理后,可得到上图所示结果