📄 65478996.txt
字号:
请高手帮忙解决一c加解密程序问题
设计思路:
首先建立"原文.txt" "加密.txt"两个文件,在"原文.txt" 中输入要加密的字符300以内
从主函数注明的接口处可以再随意加入自己的加密函数,
全局变量abc[300]中存放这些字符,tt是这些字符的个数。
#include <stdio.h>
int tt=0; //这一行字符个数
char abc[300]; //存放这行字符
#define password 1234 //密码
/*******************************/
void txt_r_and_w(int ii) //对文件读写
{char ff; int i=0;
if(ii==1)
{ FILE *ffile=fopen("原文.txt","r");
aa: ff=fgetc(ffile);
if(ff!='\n'&&ff!=EOF&&i!=300&&ff!='\0')
{abc[i++]=ff; goto aa;
}
tt=i; fclose(ffile);
}
if(ii==0)
{ FILE *ffile=fopen("加密.txt","r");
aab: ff=fgetc(ffile);
if(ff!='\n'&&ff!=EOF&&i!=300&&ff!='\0')
{abc[i++]=ff; goto aab;
}
tt=i; fclose(ffile);
}
if(ii==3)
{ FILE *ffile=fopen("加密.txt","w");
for(i=0;i<tt;i++)
fprintf(ffile,"%c",abc[i]);
fclose(ffile);
}
if(ii==2)
{ FILE *ffile=fopen("解密.txt","w");
for(i=0;i<tt;i++)
fprintf(ffile,"%c",abc[i]);
fclose(ffile);
}
}
/*******************************/
void to_a(int i)
{int j=0,k=0;char n;
if(i==1)
{
ta1:
j=k*3; //逢3位全部前移到最前面
if(j<tt)
{n=abc[j];abc[j]=abc[k];abc[k]=n;k++;goto ta1;}
} //解密
if(i==0)
{k=tt/3;
ta0:
j=k*3;
if(k>0&&j<tt)
{n=abc[j];abc[j]=abc[k];abc[k]=n;k--;goto ta0;}
if(k>0&&j>=tt) {k--;goto ta0;}
}
}
/*******************************/
void to_b(int i)
{int j=1,k=1;char n;
if(i==1)
{
tb1:
if(j%2!=0&&j<tt) //所有奇数位ASCII加13
{abc[j]+=13;j+=2; goto tb1; }
if(j%2==0&&j<tt)
{j+=2; goto tb1;}
}
if(i==0) //解密
{
tb0:
if(j%2!=0&&j<tt)
{abc[j]-=13; j+=2; goto tb0; }
if(j%2==0&&j<tt)
{j+=2; goto tb0;}
}
}
/*******************************/ //用一个数列的值对数组进行交叉换位
void to_c(int i)
{int j=0,jj=0,k=0,sun[110],m=0;char n;
if(i==1)
{j=1;
tc1:
sun[0]=1;sun[1]=2; //定义一个数列sun[i]=sun[i-1]+i;,以增加破解的难度。
for(jj=2;jj<101;jj++)
sun[jj]=sun[jj-1]+jj;
if(sun[j]<=tt&&sun[j-1]<=tt&&j<100)
{n=abc[sun[j]];abc[sun[j]]=abc[sun[j-1]];
abc[sun[j-1]]=n; j++; goto tc1;
}
else if(sun[j]>tt&&sun[j-1]>tt&&j<100)
{sun[j]%=tt;sun[j-1]%=tt;
n=abc[sun[j]]; abc[sun[j]]=abc[sun[j-1]];abc[sun[j-1]]=n;j++;goto tc1;
}
else if(sun[j]>tt&&sun[j-1]<tt&&j<100||sun[j]<tt&&sun[j-1]>tt&&j<100)
{j++;goto tc1;
}
}
if(i==0) //解密
{j=99;
tc0:
sun[0]=1;sun[1]=2;
for(jj=2;jj<101;jj++)
sun[jj]=sun[jj-1]+jj;
if(sun[j]<=tt&&sun[j-1]<=tt&&j>0)
{n=abc[sun[j]];abc[sun[j]]=abc[sun[j-1]];
abc[sun[j-1]]=n;j--;goto tc0;
}
else if(sun[j]>tt&&sun[j-1]>tt&&j>0)
{sun[j]%=tt;sun[j-1]%=tt;
n=abc[sun[j]]; abc[sun[j]]=abc[sun[j-1]];abc[sun[j-1]]=n;j--;goto tc0;
}
else if(sun[j]>tt&&sun[j-1]<tt&&j>0||sun[j]<tt&&sun[j-1]>tt&&j>0)
{j--; goto tc0;
}
}
}
/*******************************/
int main()
{
int i=0,kk=0,k;
abcd:
printf("请输入密码:\n");
scanf("%d",&k);
if(k==password)
{
bb:
printf("加密请按1,解密请按0,并回车\n");
scanf("%d",&k);
if(k==1) //加密接口
{ txt_r_and_w(k);
to_a(k);
to_b(k);
to_c(k);
txt_r_and_w(3);
printf("加密已完成\n");
}
else if(k==0) //解密接口
dd:{ txt_r_and_w(k);
to_c(k);
to_b(k);
to_a(k);
txt_r_and_w(2);
printf("解密已完成\n");
kk=1;
}else goto bb;
if(k==1&&kk==0)
{
printf("\n\n\n\n如要解密请按0,退出请按1,并回车\n");
scanf("%d",&k);
if(k==0) goto dd;
}
}else goto abcd;
return 0;
}
为什么运行时输入密码(1234)后,让输入0或1时,按下0或1回车后不运行主函数后面的部分
另外此函数的数学模型分析是什么
怎么按功能划分的模块?
稍微解释一下,希望能说清楚
void txt_r_and_w(int ii) //对文件读写
ii=0时,把加密.txt读入abc[300]
ii=1时,把原文.txt读入abc[300]
ii=2时,把abc[300]写入解密.txt
ii=3时,把abc[300]写入加密.txt
void to_a(int i) //加密方法a,i=1加密 i=2解密
逢3位全部前移到最前面,把3,6,9...位与0,1,2...位互换
如原文abcdefg,密文dgcaefb
解密是其反过程
void to_b(int i) //加密方法b
所有奇数位ASCII加13
如原文abcd,密文aick b+13=i
解密就是技术位ASCII-13
void to_c(int i) //加密方法c
用一个数列的值对数组进行交叉换位
定义一个新数列sun[110]:1,2,3,5,9,14...sun[i]=sun[i-1]+i
这个加密过程有点复杂,简单得说就是
当sun[i]的值小于300且i<100时
abc[300]的1位和3位换,3和5换,5和9换,9和14换...
其实就是把第3位移到第1位,第5位移到第3位,第9位移到第5位...
当sun[i]的值大于300且i<100时
把sun[i]的值对300取余,重复上一过程.
流程
输入密码(1234)
错误返回
正确->加密请按1,解密请按0
1->把原文.txt读入->用3种方法加密->写入加密.txt
0->把加密.txt读入->用3种方法解密->写入解密.txt
不过程序好像还有些问题.但他想达到的效果应该是这样
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -