?? 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 + -