blowfish.cpp

来自「blowfish的vc++实现」· C++ 代码 · 共 297 行 · 第 1/2 页

CPP
297
字号
		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
	}
};

int Blowfish::Init( unsigned char* const key, int keyLen )
{
	// return error code
	if(key == NULL)
		return BLOWFISH_NULL;
	if(keyLen < MINKEYBYTES)
		return BLOWFISH_INPUTTOOSHORT ;
	if(keyLen > MAXKEYBYTES)
		return BLOWFISH_INPUTTOOLONG;

	// fill key_sbox from sbox
	for(int i = 0 ; i < 4 ; i ++)
		for(int j = 0 ; j < 256 ; j ++)
			key_sbox[i][j] = sbox[i][j];

	// fill key_pbox
	int nIndex = 0;
	unsigned long data = 0x00000000;
	for (int i = 0; i < N + 2; i++)
	{
		data = 0x00000000;
		for(int j = 0 ; j < 4 ; j++)
		{
			data = (data << 8) | key[nIndex];
			nIndex++;
			if(nIndex >= keyLen)
				nIndex = 0;
		}
		key_pbox[i] = pbox[i] ^ data ;
	}

	unsigned long xl = 0x00000000;
	unsigned long xr = 0x00000000;
	
	for (int i = 0; i < N + 2; i += 2) 
	{
		Encrypt(&xl, &xr);
		key_pbox[i] = xl;
		key_pbox[i + 1] = xr;
	}
	
	for (int i = 0; i < 4; ++i) 
	{
		for (int j = 0; j < 256; j += 2) 
		{
			Encrypt(&xl, &xr);
			key_sbox[i][j] = xl;
			key_sbox[i][j + 1] = xr;
		}
	}

	return BLOWFISH_SUCCESS;
}

unsigned long Blowfish::F(unsigned long x)
{
	return ( ( key_sbox[0][(x >> 24) & 0xFF] + key_sbox[1][(x >> 16) & 0xFF] ) ^ key_sbox[2][(x >>  8) & 0xFF] ) + key_sbox[3][(x) & 0xFF];
}

int Blowfish::Encrypt(unsigned long *xl, unsigned long *xr)
{
	// return error code
	if(xl == NULL || xr == NULL)
		return BLOWFISH_NULL;

	unsigned long  Xl;
	unsigned long  Xr;
	unsigned long  temp;
	
	Xl = *xl;
	Xr = *xr;
	
	for (int i = 0; i < N; ++i) 
	{
		Xl = Xl ^ key_pbox[i];
		Xr = F(Xl) ^ Xr;
		
		temp = Xl;
		Xl = Xr;
		Xr = temp;
	}
	
	temp = Xl;
	Xl = Xr;
	Xr = temp;
	
	Xr = Xr ^ key_pbox[N];
	Xl = Xl ^ key_pbox[N + 1];
	
	*xl = Xl;
	*xr = Xr;

	return BLOWFISH_SUCCESS;
}

int Blowfish::Decrypt(unsigned long *xl, unsigned long *xr)
{
	// return error code
	if(xl == NULL || xr == NULL)
		return BLOWFISH_NULL;

	unsigned long  Xl;
	unsigned long  Xr;
	unsigned long  temp;
	
	Xl = *xl;
	Xr = *xr;
	
	for (int i = N + 1; i > 1; --i) 
	{
		Xl = Xl ^ key_pbox[i];
		Xr = F(Xl) ^ Xr;
		
		/* Exchange Xl and Xr */
		temp = Xl;
		Xl = Xr;
		Xr = temp;
	}
	
	/* Exchange Xl and Xr */
	temp = Xl;
	Xl = Xr;
	Xr = temp;
	
	Xr = Xr ^ key_pbox[1];
	Xl = Xl ^ key_pbox[0];
	
	*xl = Xl;
	*xr = Xr;

	return BLOWFISH_SUCCESS;
}

⌨️ 快捷键说明

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