ITPub博客

首页 > 应用开发 > IT综合 > 请熟悉混沌原理和c高手帮个忙 (转)

请熟悉混沌原理和c高手帮个忙 (转)

原创 IT综合 作者:amyz 时间:2007-10-02 10:46:14 0 删除 编辑
请熟悉混沌原理和c高手帮个忙 (转)[@more@]

  小弟毕业设计做的是“混沌同步原理在保密通信中的应用及软件开发”,由于编程功底不够,现在在c语言编程上遇到了问题,不解决的话便难以往下作.希望大家有一点头绪都我告诉我,eMail.NET">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/10752019/viewspace-974382/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    3984
  • 访问量
    7338320