admin管理员组

文章数量:1589660

文件加密(加密方程为a*x^2+b)

核心:文本模式和二进制模式读写文件
本程序包括文本模式打开文件,进行普通写入,和二进制模式打开文件,进行加密内容的二进制模式写入,加密方程式a*x^2+b,a,b为短整型,由用户输入值。
程序运行过程解析 :

  1. 输入新建文件路径及名称
    例如 : 要在D盘,HDU文件夹中新建(使用fopen()函数)一个名为open.txt文本文件(即后缀名为.txt的文件) 则需要输入 D:\HDU\open.txt

  2. 以文本模式打开文件,用fputs()函数进行字符写入,fputs()用法,fputs(str, fp),str代表数组地址,fp为文件指针,意思即将数组str中字符写入文件,fp相当于"写入指针",打双引号是因为这个名称我取的(🤪),把它想像成打印指针就行,写入一个字符,fp后移再次进行写入,直到str数组为空(即遇到’\0’为止)

  3. 关闭文件(使用fclose()函数),用二进制模式打开文件。

此时,有一个重要注意事项*
如果你对第一次文本模式写入的数据进行读取,在读取之后,在用二进制模式写入加密内容之前,一定要用rewind()函数,rewind(fp),
保证上述操作后,方可写入加密内容。
如果没有这句话(rewind(fp)😉,那么二进制模式写入加密内容将无效,打开txt文件会发现没有第二次写入的加密内容,这是文本模式和二进制模式混用出现的特殊错误。
/咳咳,不用rewind(),就需要用fseek()函数找好位置,再写入,比较麻烦/
不信你把它注释掉(🤪),在代码中用//和*标记的位置。

  1. 两次输入均用了数组,第一次数组是整体用fputs()写入文件,第二次是对数组进行处理(根据加密方程式处理)再用fwrite()函数逐个写入,处理前记录一下该"字符"的正负,ascii码为正,可以认为是字符, 否则则是汉字码,两个汉字码可输出一个汉字,例如 :
char han_z[3] = {"六"};//一个汉字两个字节
//加一个'\0',所以定义数组容量为3
printf("%c%c", han_z[0], han_z[1])

运行结果为 : 六

  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
后面为密文,在文件里面为乱码,但通过读取,并进行处理后,可得到上图所示结果

本文标签: 方程二进制文件