⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 65478996.txt

📁 设计思路: 首先建立"原文.txt" "加密.txt"两个文件
💻 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 + -