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

📄 dibapi.cpp

📁 这是从本网站下载的基于混沌序列的图像加密算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		if(bX1>0)
		{
			//线性变换
			bMap[i]=(BYTE)bY1*i/bX1;
		}
		else
		{
			//直接附值为0
			bMap[i]=0;
		}
	}
	for(;i<bX2;i++)
	{
		//判断bX1是否等于bX2
		if(bX2!=bX1)
		{
			//线性变换
			bMap[i]=bY1+(BYTE)((bY2-bY1)*(i-bX1)/(bX2-bX1));
		}
		else
		{
			//直接附值为bY1
			bMap[i]=bY1;
		}
	}
	for(;i<256;i++)
	{
		//判断bX2是否等于255
		if(bX2!=255)
		{
			//线性变换
			bMap[i]=bY2+(BYTE)((255-bY2)*(i-bX2)/(255-bX2));
		}
		else
		{
			//直接附值为255
			bMap[i]=255;
		}
	}
	//每行
	for(i=0;i<lHeight;i++)
	{
		//每列
		for(j=0;j<lWidth;j++)
		{
			//指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
			//计算新的灰度值
			*lpSrc = bMap[*lpSrc];
		}
	}
	//返回
	return TRUE;
}

/************************************************************
*
*函数名称:
*     InteEqualize()
*
*参数:
*   
*   LPSTR lpDIBBits  -指向原DIB图象指针
*   LONG  lWidth     -原图象宽度(象素数)
*   LONG  lHeight    -原图象高度(象素数)

* 返回值:
*  BOOL      -成功返回TRUE,否则返回FALSE
*
*说明:
*  该函数用来对图象进行直方图均衡
***************************************************************/
BOOL WINAPI InteEqualize(LPSTR lpDIBBits,LONG lWidth,LONG lHeight)
{
	//指向原图象的指针
	unsigned char* lpSrc;
	//临时变量
	LONG lTemp;
	//循环变量
	LONG i;
	LONG j;
	//灰度映射表
	BYTE bMap[256];
	//图象每行的字节数
	LONG lCount[256];
	//图象每行的字节数
	LONG lLineBytes ;
	//计算图象每行的字节数
	lLineBytes = WIDTHBYTES(lWidth*8);
	//重置记数为0
	for(i=0;i<lHeight;i++)
	{
		for(j=0;j<lWidth;j++)
		{
			lpSrc=(unsigned char*)lpDIBBits+lLineBytes*i+j;
			//记数加1
			lCount[*(lpSrc)]++;
		}
	}
	for(i=0;i<256;i++)
	{
		//初始为0
		lTemp=0;
		for(j=0;j<=i;j++)
		{
			lTemp+=lCount[j];
		}
		//计算对应的新灰度值
		bMap[i]=(BYTE)(lTemp * 255/lHeight/lWidth);
	}
	//每行
	for(i=0;i<lHeight;i++)
	{
		for(j=0;j<lWidth;j++)
		{
			//指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
			//计算新的灰度值
			*lpSrc = bMap[*lpSrc];
		}
	}
	return TRUE;
}
/*================================================================
*函数名称:混沌猫映射
*  ArnoldZ()
*
*参数:
*   
*   LPSTR lpDIBBits  -指向原DIB图象指针
*   LONG  lWidth     -原图象宽度(象素数)
*   LONG  lHeight    -原图象高度(象素数)
*
* 返回值:
*  BOOL      -成功返回TRUE,否则返回FALSE
*
*说明:
*  该函数用来对图象进行混沌加密
*
=================================================================*/
//暂时还没有写好猫映射
//这一部分还需要修改 2008-10-03
BOOL WINAPI Arnold(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,int para1,int para2,int sign)
{
	//指向原图的指针
//	unsigned char* lpSrc1,* lpSrc2;
	unsigned char* lpSrc,* lpSrc1;

   // unsigned char* ;
	LONG i;
	LONG j;
    LONG x;
	LONG y;
	//图象每行的字节数
	LONG lLineBytes;        
	//计算图象每行的字节数
	lLineBytes = WIDTHBYTES(lWidth*8);


	if (sign==1)
	{	for(i=0;i<lHeight;i++)
	{
		//每列
		for(j=0;j<lWidth;j++)
		{   
			x=(i+j)%lHeight;
			y=(i+2*j)%lHeight;
			//位图是从下向上扫描的
			//指向DIB第i行,第j个象素的指针
			lpSrc=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
			lpSrc1=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-x)+y); 
            *lpSrc1=(unsigned char)((int)(*lpSrc));
		/*	x=(i+para1*j)%lWidth+1;
			y=(para2*i+(para1*para2+1)*j)%lWidth+1;
			//位图是从下向上扫描的
			//指向DIB第i行,第j个象素的指针
			lpSrc1= (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j; 
			lpSrc2= (unsigned char*)lpDIBBits+lLineBytes*x+y;
			*lpSrc2=(unsigned char)((int)(*lpSrc1));*/
		}
	}
	}
	else
	{	for(i=0;i<lHeight;i++)
		{//每列
		 for(j=0;j<lWidth;j++)
		{   
		    x=(i+j)%lHeight;
			y=(i+2*j)%lHeight;
			//位图是从下向上扫描的
			//指向DIB第i行,第j个象素的指针
			lpSrc=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
			lpSrc1=(unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-x)+y); 
            *lpSrc=(unsigned char)((int)(*lpSrc1));
		}
		}
	}
	return TRUE;
}
/************************************************************
*
*函数名称:
*   ChaosEncode()
*
*参数:
*   
*   LPSTR lpDIBBits  -指向原DIB图象指针
*   LONG  lWidth     -原图象宽度(象素数)
*   LONG  lHeight    -原图象高度(象素数)
*
* 返回值:
*  BOOL      -成功返回TRUE,否则返回FALSE
*
*说明:
*  该函数用来对图象进行混沌加密
***************************************************************/
//yuhuan 2008-10-01 关键是这一部分程序
BOOL WINAPI ChaosEncode(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,double Xstart,double a)
{
	//指向原图的指针
	unsigned char* lpSrc;
    //保存的混沌密码序列
	DWORD chaos,k;
	double x,y;
	x=Xstart;
	//循环变量
	LONG i;
	LONG j;
	LONG h=1000;
	LONG w;
	//图象每行的字节数
	LONG lLineBytes;        
	//中间变量
	//FLOAT fTemp;
	//计算图象每行的字节数
	lLineBytes = WIDTHBYTES(lWidth*8);
	/**************************************************************
	*本软件采用的是Logistic混沌系统,其定义为:y=a*x*(1-x);y又作为新的x
	*继续生成序列,当3.5699456……<a<=4;-1<x<1,该系统为混沌系统
	**************************************************************/
	//产生1000个Logistic序列
/*	for(w=0;w<1000;w++)
	 {
		 y=a*x*(1-x);
	     x=y;
	  }*/
	
	//循环次数
	//for(h=0;h<100;h++)
	//{
//while(h>0)
//{
	//每行
	for(i=0;i<lHeight;i++)
	{
		//每列
		for(j=0;j<lWidth;j++)
		{    
			//位图是从下向上扫描的
			//指向DIB第i行,第j个象素的指针
			lpSrc = (unsigned char*)(lpDIBBits+lLineBytes*(lHeight-1-i)+j);
	        chaos=0;  
			for(w=0;w<8;w++)
	           {  //转换为二进制
		          y=a*x*(1-x);
		          if(y >= 0.4)
				  { 
			        k=1;
				  }
		          else
				  {
			        k=0;
				  }
				  chaos=((chaos<<1)|k);                       //或运算|
				 // if(chaos>(int)256*y)
				  //chaos=256-chaos;
		          x=y;
				  //可以做个数组,进行
	           }
             //修改位图像素值的位
      		*lpSrc=(unsigned char)((int)(*lpSrc)^(int)(chaos));//异或运算^
			//对二进制位进行编码
             //*lpSrc=255;  
			//chaos = ::LogisticCode(x,a);
			//AfxMessageBox(chaos);
			
			//fTemp = *lpSrc;
			//判断是否超出范围
			/*if(fTemp >255)
			{
				//直接附值为255
				*lpSrc = 255;
			}
			else if (fTemp<0)
			{
				//直接赋值为0
				*lpSrc = 0;
			}
			else
			{
				//四舍五入
				*lpSrc = (unsigned char)(fTemp+0.5);
			}*/
			
		h--;
		}
	}
	//}
	//返回
	return TRUE;
}

/************************************************************
*
*函数名称:三维Lorenz混沌加密系统
*   LorenzEncode()
*
*参数:
*   
*   LPSTR lpDIBBits  -指向原DIB图象指针
*   LONG  lWidth     -原图象宽度(象素数)
*   LONG  lHeight    -原图象高度(象素数)
*
* 返回值:
*  BOOL      -成功返回TRUE,否则返回FALSE
*
*说明:
*  该函数用来对图象进行混沌加密
***************************************************************/
//yuhuan 2008-10-03 关键是这一部分程序
BOOL WINAPI LorenzEncode(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,double x_lorenz,double y_lorenz,double z_lorenz,int k)
{   

	//指向原图的指针
	unsigned char* lpSrc;
    //保存的混沌密码序列
	double x,y,z;
	x=x_lorenz;
	y=y_lorenz;
	z=z_lorenz;
	//循环变量
	LONG i;
	LONG j;
	//2008-10-03
	//这个地方要做修改,使得能够根据图片的大小加密图像
	LONG bb[65539];
	//图象每行的字节数
	LONG lLineBytes;        
	//中间变量
	//FLOAT fTemp;
	//计算图象每行的字节数
	lLineBytes = WIDTHBYTES(lWidth*8);

	for(i=1;i<=21846;i++)
	{  
		Lorenz_3D(&x,&y,&z);
		bb[3*(i-1)+1]=(int)((x*100000.0-(int)(x*100000.0))*1000.0);
		bb[3*(i-1)+2]=(int)((y*100000.0-(int)(y*100000.0))*1000.0);
		bb[3*(i-1)+3]=(int)((z*100000.0-(int)(z*100000.0))*1000.0);
	}
	for(i=0;i<lHeight;i++)
	{
		//每列
		for(j=0;j<lWidth;j++)
		{    
	    //位图是从下向上扫描的
		//指向DIB第i行,第j个象素的指针
		  lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
		  //k为判断变量,当为1时加密,为0时解密,从VIEW类中传输过来的
		  if (k==1)
		  {*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999.0*256.0))%256);
		  }
		  else
		  {
           *lpSrc=(unsigned char)(((int)(*lpSrc)+256-(int)(bb[i*lHeight+j]/999.0*256.0))%256);
		  }
		 
		 
      	//*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999*256))%256);//异或运算^
		}
	}
	//}
	//返回
	return TRUE;
}

void WINAPI Lorenz_3D(double *xi,double *yi,double *zi)
{
	double xo,yo,h,w;
	h=0.001;
	w=8/3;
	xo=(*xi)+h*10.0*((*yi)-(*xi));
	yo=(*yi)+h*(-(*xi)*(*zi)+28.0*(*xi)-(*yi));
	*zi = *zi+h*((*xi)*(*yi)-w*(*zi));
	*xi = xo;
	*yi = yo;
}

/************************************************************************
*函数名:三维LIU混沌系统加密
*
*作者:yuhuan
*
*日期:2008-10-04                                                                     
************************************************************************/
BOOL WINAPI LiuEncode(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,double x_liu,double y_liu,double z_liu,int sign_encode)
{
	//指向原图的指针
	unsigned char* lpSrc;
    //保存的混沌密码序列
	double x,y,z;
	x=x_liu;
	y=y_liu;
	z=z_liu;
	//循环变量
	LONG i;
	LONG j;
	//2008-10-03
	//这个地方要做修改,使得能够根据图片的大小加密图像
	LONG bb[65539];
	//图象每行的字节数
	LONG lLineBytes;        
	//中间变量
	//FLOAT fTemp;
	//计算图象每行的字节数
	lLineBytes = WIDTHBYTES(lWidth*8);

	for(i=1;i<=21846;i++)
	{  
		Liu_3D(&x,&y,&z);
		bb[3*(i-1)+1]=(int)((x*100000.0-(int)(x*100000.0))*1000.0);
		bb[3*(i-1)+2]=(int)((y*100000.0-(int)(y*100000.0))*1000.0);
		bb[3*(i-1)+3]=(int)((z*100000.0-(int)(z*100000.0))*1000.0);
	}
	for(i=0;i<lHeight;i++)
	{
		//每列
		for(j=0;j<lWidth;j++)
		{    
	    //位图是从下向上扫描的
		//指向DIB第i行,第j个象素的指针
		  lpSrc = (unsigned char*)lpDIBBits+lLineBytes*(lHeight-1-i)+j;
		  //k为判断变量,当为1时加密,为0时解密,从VIEW类中传输过来的
		  if (sign_encode==1)
		  {*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999.0*256.0))%256);
		  }
		  else
		  {
           *lpSrc=(unsigned char)(((int)(*lpSrc)+256-(int)(bb[i*lHeight+j]/999.0*256.0))%256);
		  }
		 
		 
      	//*lpSrc=(unsigned char)(((int)(*lpSrc)+(int)(bb[i*lHeight+j]/999*256))%256);//异或运算^
		}
	}
	//}
	//返回
	return TRUE;
}
//混沌序列生成函数
void  WINAPI Liu_3D(double *xi,double *yi,double *zi)
{
	double xo,yo,h,c;
	h=0.001;
	c=2.5;
	xo=(*xi)+h*10.0*((*yi)-(*xi));
	yo=(*yi)+h*(-(*xi)*(*zi)+40.0*(*xi));
	*zi = *zi+h*4.0*((*xi)*(*xi)-c*(*zi));
	*xi = xo;
	*yi = yo;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -