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

📄 blowfish.cpp

📁 利用Blowfish对称加密算法对文件进行加密, 内含VC++ 6.0源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -