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

📄 blowfish.c

📁 This isakmpd, a BSD-licensed ISAKMP/Oakley (a.k.a. IKE) implementation.
💻 C
📖 第 1 页 / 共 2 页
字号:
			0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,			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}	},	{		0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,		0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,		0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,		0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,		0x9216d5d9, 0x8979fb1b	} };	*c = initstate;}u_int32_tBlowfish_stream2word(const u_int8_t *data, u_int16_t databytes, u_int16_t *current){	u_int8_t i;	u_int16_t j;	u_int32_t temp;	temp = 0x00000000;	j = *current;	for (i = 0; i < 4; i++, j++) {		if (j >= databytes)			j = 0;		temp = (temp << 8) | data[j];	}	*current = j;	return temp;}voidBlowfish_expand0state(blf_ctx *c, const u_int8_t *key, u_int16_t keybytes){	u_int16_t i;	u_int16_t j;	u_int16_t k;	u_int32_t temp;	u_int32_t datal;	u_int32_t datar;	j = 0;	for (i = 0; i < BLF_N + 2; i++) {		/* Extract 4 int8 to 1 int32 from keystream */		temp = Blowfish_stream2word(key, keybytes, &j);		c->P[i] = c->P[i] ^ temp;	}	j = 0;	datal = 0x00000000;	datar = 0x00000000;	for (i = 0; i < BLF_N + 2; i += 2) {		Blowfish_encipher(c, &datal, &datar);		c->P[i] = datal;		c->P[i + 1] = datar;	}	for (i = 0; i < 4; i++) {		for (k = 0; k < 256; k += 2) {			Blowfish_encipher(c, &datal, &datar);			c->S[i][k] = datal;			c->S[i][k + 1] = datar;		}	}}voidBlowfish_expandstate(blf_ctx *c, const u_int8_t *data, u_int16_t databytes,		     const u_int8_t *key, u_int16_t keybytes){	u_int16_t i;	u_int16_t j;	u_int16_t k;	u_int32_t temp;	u_int32_t datal;	u_int32_t datar;	j = 0;	for (i = 0; i < BLF_N + 2; i++) {		/* Extract 4 int8 to 1 int32 from keystream */		temp = Blowfish_stream2word(key, keybytes, &j);		c->P[i] = c->P[i] ^ temp;	}	j = 0;	datal = 0x00000000;	datar = 0x00000000;	for (i = 0; i < BLF_N + 2; i += 2) {		datal ^= Blowfish_stream2word(data, databytes, &j);		datar ^= Blowfish_stream2word(data, databytes, &j);		Blowfish_encipher(c, &datal, &datar);		c->P[i] = datal;		c->P[i + 1] = datar;	}	for (i = 0; i < 4; i++) {		for (k = 0; k < 256; k += 2) {			datal ^= Blowfish_stream2word(data, databytes, &j);			datar ^= Blowfish_stream2word(data, databytes, &j);			Blowfish_encipher(c, &datal, &datar);			c->S[i][k] = datal;			c->S[i][k + 1] = datar;		}	}}voidblf_key(blf_ctx *c, const u_int8_t *k, u_int16_t len){	/* Initialize S-boxes and subkeys with Pi */	Blowfish_initstate(c);	/* Transform S-boxes and subkeys with key */	Blowfish_expand0state(c, k, len);}voidblf_enc(blf_ctx *c, u_int32_t *data, u_int16_t blocks){	u_int32_t *d;	u_int16_t i;	d = data;	for (i = 0; i < blocks; i++) {		Blowfish_encipher(c, d, d + 1);		d += 2;	}}voidblf_dec(blf_ctx *c, u_int32_t *data, u_int16_t blocks){	u_int32_t *d;	u_int16_t i;	d = data;	for (i = 0; i < blocks; i++) {		Blowfish_decipher(c, d, d + 1);		d += 2;	}}voidblf_ecb_encrypt(blf_ctx *c, u_int8_t *data, u_int32_t len){	u_int32_t l, r;	u_int32_t i;	for (i = 0; i < len; i += 8) {		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];		Blowfish_encipher(c, &l, &r);		data[0] = l >> 24 & 0xff;		data[1] = l >> 16 & 0xff;		data[2] = l >> 8 & 0xff;		data[3] = l & 0xff;		data[4] = r >> 24 & 0xff;		data[5] = r >> 16 & 0xff;		data[6] = r >> 8 & 0xff;		data[7] = r & 0xff;		data += 8;	}}voidblf_ecb_decrypt(blf_ctx *c, u_int8_t *data, u_int32_t len){	u_int32_t l, r;	u_int32_t i;	for (i = 0; i < len; i += 8) {		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];		Blowfish_decipher(c, &l, &r);		data[0] = l >> 24 & 0xff;		data[1] = l >> 16 & 0xff;		data[2] = l >> 8 & 0xff;		data[3] = l & 0xff;		data[4] = r >> 24 & 0xff;		data[5] = r >> 16 & 0xff;		data[6] = r >> 8 & 0xff;		data[7] = r & 0xff;		data += 8;	}}voidblf_cbc_encrypt(blf_ctx *c, u_int8_t *iv, u_int8_t *data, u_int32_t len){	u_int32_t l, r;	u_int32_t i, j;	for (i = 0; i < len; i += 8) {		for (j = 0; j < 8; j++)			data[j] ^= iv[j];		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];		Blowfish_encipher(c, &l, &r);		data[0] = l >> 24 & 0xff;		data[1] = l >> 16 & 0xff;		data[2] = l >> 8 & 0xff;		data[3] = l & 0xff;		data[4] = r >> 24 & 0xff;		data[5] = r >> 16 & 0xff;		data[6] = r >> 8 & 0xff;		data[7] = r & 0xff;		iv = data;		data += 8;	}}voidblf_cbc_decrypt(blf_ctx *c, u_int8_t *iva, u_int8_t *data, u_int32_t len){	u_int32_t l, r;	u_int8_t *iv;	u_int32_t i, j;	iv = data + len - 16;	data = data + len - 8;	for (i = len - 8; i >= 8; i -= 8) {		l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];		r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];		Blowfish_decipher(c, &l, &r);		data[0] = l >> 24 & 0xff;		data[1] = l >> 16 & 0xff;		data[2] = l >> 8 & 0xff;		data[3] = l & 0xff;		data[4] = r >> 24 & 0xff;		data[5] = r >> 16 & 0xff;		data[6] = r >> 8 & 0xff;		data[7] = r & 0xff;		for (j = 0; j < 8; j++)			data[j] ^= iv[j];		iv -= 8;		data -= 8;	}	l = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];	r = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];	Blowfish_decipher(c, &l, &r);	data[0] = l >> 24 & 0xff;	data[1] = l >> 16 & 0xff;	data[2] = l >> 8 & 0xff;	data[3] = l & 0xff;	data[4] = r >> 24 & 0xff;	data[5] = r >> 16 & 0xff;	data[6] = r >> 8 & 0xff;	data[7] = r & 0xff;	for (j = 0; j < 8; j++)		data[j] ^= iva[j];}#if 0voidreport(u_int32_t data[], u_int16_t len){	u_int16_t i;	for (i = 0; i < len; i += 2)		printf("Block %0hd: %08lx %08lx.\n",		    i / 2, data[i], data[i + 1]);}voidmain(void){	blf_ctx c;	char    key[] = "AAAAA";	char    key2[] = "abcdefghijklmnopqrstuvwxyz";	u_int32_t data[10];	u_int32_t data2[] =	{0x424c4f57l, 0x46495348l};	u_int16_t i;	/* First test */	for (i = 0; i < 10; i++)		data[i] = i;	blf_key(&c, (u_int8_t *) key, 5);	blf_enc(&c, data, 5);	blf_dec(&c, data, 1);	blf_dec(&c, data + 2, 4);	printf("Should read as 0 - 9.\n");	report(data, 10);	/* Second test */	blf_key(&c, (u_int8_t *) key2, strlen(key2));	blf_enc(&c, data2, 1);	printf("\nShould read as: 0x324ed0fe 0xf413a203.\n");	report(data2, 2);	blf_dec(&c, data2, 1);	report(data2, 2);}#endif

⌨️ 快捷键说明

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