請熟悉混沌原理和c高手幫個忙 (轉)

worldblog發表於2007-12-04
請熟悉混沌原理和c高手幫個忙 (轉)[@more@]

  小弟畢業設計做的是“混沌同步原理在保密通訊中的應用及開發”,由於功底不夠,現在在c語言程式設計上遇到了問題,不解決的話便難以往下作.希望大家有一點頭緒都我告訴我,e:">gdlc@163.net。千萬個thanks!
  混沌學的核心是“蝴蝶效應”(蝴蝶效應的意思是說:北京的一隻蝴蝶扇動一下翅膀,會引起紐約的一場風暴),這隻蝴蝶演繹的圖形在科學上被稱作洛倫茲吸引子,是由下面的一個非線性方程組決定的: 
  dx/dt=-ax+ay
  dy/dt=-xz+bx-y
  dz/dt=xy-cz
  (a,b,c為引數)
  我們可以用數值方法求解這個方程組,我採用了尤拉法,這樣可以取出一系列的數,其中x在-25到+25
之間,作為我們的保密訊號。
  我先作的是靜態,也就是加密端和端訊號相同,如下:
  加密端:
  #include
  #include
  #include
  #include
  #include

  main()
  {
  FILE *fp1,*fp2;
  char in_fname[30];/*輸入要加密的名*/
  char out_fname[30];/*輸入加密後的檔名*/
  float ch;
  float x0=1,y0=1,z0=1;/*初值 */
  float a=16.0,b=45.92,c=4.0;
  float x,y,z;
  float T=0.00001;/*尤拉法中所取的步長*/

  printf("n請輸入要加密的檔名:n");
  gets(in_fname);/*得到要加密的檔名*/

  printf("請輸入加密後的檔名:n");
  gets(out_fname);/*得到加密後要的檔名*/


  fp1=fopen(in_fname,"rb");
  if(fp1==NULL)
  {
  printf("cannot open in-file.n");
  exit(1);/*如果不能開啟要加密的檔案,便退出程式*/
  }
  fp2=fopen(out_fname,"wb");
  if(fp2==NULL)
  {
  printf("cannot open or create out-file.n");
  exit(1);/*如果不能建立加密後的檔案,便退出*/
  }

  /*加密演算法開始*/
  while(!feof(fp1))
  {ch=fgetc(fp1);
  x=x0+T*a*y0-T*a*x0;
  y=y0+T*b*x0-T*x0*z0-T*y0;
  z=z0+T*x0*y0-T*c*z0;

  fputc(ch+x,fp2);/*相加後寫入fp2檔案*/
 
  x0=x;
  y0=y;
  z0=z;
  }
  fclose(fp1);
  fclose(fp2);
}
  解密端只需把 fputc(ch+x,fp2)該為 fputc(ch-x,fp2)即可,靜態只是在加密端把檔案加上一組數,然後
在解密端把這組數減去,不涉及過多的程式問題,因此很好實現。

  而在動態同步加密時我開始遇到問題,同步時解密端作以下改動:dx/dt=-ax+ay,dy/dt=-sz+bs-y
,dz/dt=sy-cz (a,b,c為引數),即dy/dt dz/dt中的x用s取代,s是加密後得到的檔案。
  加密端程式不變,解密端為:
  #include
  #include
  #include
  #include
  #include

 main()
{
FILE *fp1,*fp2;
char in_fname[30];/*輸入要解密的檔名*/
char out_fname[30];/*輸入解密後的檔名*/
float ch;
float x0=1,y0=1,z0=1;
float a=16.0,b=45.92,c=4.0;
float x,y,z;
float T=0.00001;

  printf("n請輸入要解密的檔名:n");
  gets(in_fname);/*得到要解密的檔名*/

  printf("請輸入解密後的檔名:n");
  gets(out_fname);/*得到解密後要的檔名*/


  fp1=fopen(in_fname,"rb");
  if(fp1==NULL)
  {
  printf("cannot open in-file.n");
  exit(1);/*如果不能開啟要解密的檔案,便退出程式*/
  }
  fp2=fopen(out_fname,"wb");
  if(fp2==NULL)
  {
  printf("cannot open or create out-file.n");
  exit(1);/*如果不能建立解密後的檔案,便退出*/
  }

  /*解密演算法開始*/
  while(!feof(fp1))
  {ch=fgetc(fp1);
  x=x0+T*a*y0-T*a*x0;
  y=y0+T*b*ch-T*c*ch*z0-T*y0;
  z=z0+T*ch*y0-T*c*z0;

  fputc(ch-x,fp2);/*相減後寫入fp2檔案*/
 
  x0=x;
  y0=y;
  z0=z;
  }
  fclose(fp1);
  fclose(fp2);
  }
  無法把原檔案恢復,我想有以下幾個原因:1、處理檔案方法有錯(改為fread、fwrite?);2、演算法不合理,解密端所取的數肯定有誤差,其實我認為異或法最好,但課題為混沌同步,沒辦法。
  請各位指點一下啦!
 

 


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987889/,如需轉載,請註明出處,否則將追究法律責任。

相關文章