blowfish.cpp

来自「blowfish加密算法的编码类」· C++ 代码 · 共 258 行 · 第 1/2 页

CPP
258
字号
		0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 
		0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 
		0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 
		0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 
		0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, 
		0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 
		0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 
		0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 
		0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, 
		0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 
		0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 
		0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, 
		0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 
		0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 
		0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 
		0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 
		0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 
		0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, 
		0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
	}
};
const unsigned long CBlowfish::pbox[18]=
{
	0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, 
	0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 
	0x9216d5d9, 0x8979fb1b
};
CBlowfish::CBlowfish()
{

}

CBlowfish::~CBlowfish()
{

}

void CBlowfish::BlowfishKeyInit(const char *szKey, int nStrLen)
{
	memcpy(keybox,pbox,sizeof(long)*18);
	memcpy(keybox+18,sbox,sizeof(long)*256*4);
	int oldlen=nStrLen,i;
	char szkey[72*2],*cp;
	memset(szkey,0,72*2);
	if(nStrLen<72)
	{
		nStrLen=0;
		while(nStrLen<72)
		{
			strcat(szkey,szKey);
			nStrLen+=oldlen;
		}
	}
	else 
		strncpy(szkey,szKey,72);
	cp=szkey;
	unsigned long* pKey=(unsigned long*)cp;
	for (i=0;i<18;i++)
		keybox[i]^=pKey[i];
	unsigned long xl=0,xr=0;
	for (i=0;i<521;i++)
	{
		BlowfishEn(xl,xr);
		keybox[2*i]=xl;
		keybox[2*i+1]=xr;
	}
}

void CBlowfish::BlowfishEn(unsigned long &XL, unsigned long &XR)
{
	unsigned long xl=XL,xr=XR,temp;
	int i;
	for (i=0;i<16;i++)
	{
		xl^=keybox[i];
		xr^=F((const char*)&xl);
		swap(xl,xr,temp);
	}
	swap(xl,xr,temp);
	xr^=keybox[16];
	xl^=keybox[17];
	XL=xl;
	XR=xr;
}

void CBlowfish::BlowfishDe(unsigned long &XL, unsigned long &XR)
{
	unsigned long xl=XL,xr=XR,temp;
	int i;
	for (i=17;i>1;i--)
	{
		xl^=keybox[i];
		xr^=F((const char*)&xl);
		swap(xl,xr,temp);
	}
	swap(xl,xr,temp);
	xr^=keybox[1];
	xl^=keybox[0];
	XL=xl;
	XR=xr;
}

void CBlowfish::Blowfish(char *szMessage, char type)
{
	int len=strlen(szMessage);
	int i;
	unsigned long* pul=NULL;
	if(type=='e')
	{
		while(len%8!=0)szMessage[len++]=0;
		for (i=0;i<len;i+=8)
			BlowfishEn((unsigned long&)szMessage[i],(unsigned long&)szMessage[i+4]);
	}
	else 
	{
		for (i=0;i<len;i+=8)
			BlowfishDe((unsigned long&)szMessage[i],(unsigned long&)szMessage[i+4]);
	}
}

unsigned long CBlowfish::F(const char index[])
{
	unsigned long temp;
	temp=keybox[SBOX_BEGIN+index[3]]+keybox[SBOX_BEGIN+256+index[2]];
	temp^=keybox[SBOX_BEGIN+256*2+index[1]];
	temp+=keybox[SBOX_BEGIN+256*3+index[0]];
	return temp;
}

⌨️ 快捷键说明

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