二进制文件加密(加密方程a*x^2+b)

文件加密(加密方程为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 
#include 
#include 
#include 
#define N 1000long 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]);}}elseputchar(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
后面为密文,在文件里面为乱码,但通过读取,并进行处理后,可得到上图所示结果
文件操作结果


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部