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

📄 blowfish.c

📁 加密解密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
	0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,	0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,	0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,	0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,	0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,	0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,	0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,	0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,	0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,	0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,	0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,	0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,	0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,	0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,	0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,	0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,	0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,	0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,	0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,	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,};/*  * Round loop unrolling macros, S is a pointer to a S-Box array * organized in 4 unsigned longs at a row. */#define GET32_3(x) (((x) & 0xff))#define GET32_2(x) (((x) >> (8)) & (0xff))#define GET32_1(x) (((x) >> (16)) & (0xff))#define GET32_0(x) (((x) >> (24)) & (0xff))#define bf_F(x) (((S[GET32_0(x)] + S[256 + GET32_1(x)]) ^ \          S[512 + GET32_2(x)]) + S[768 + GET32_3(x)])#define ROUND(a, b, n)  b ^= P[n]; a ^= bf_F (b)/* * The blowfish encipher, processes 64-bit blocks. * NOTE: This function MUSTN'T respect endianess  */static void encrypt_block(struct bf_ctx *bctx, u32 *dst, u32 *src){	const u32 *P = bctx->p;	const u32 *S = bctx->s;	u32 yl = src[0];	u32 yr = src[1];	ROUND(yr, yl, 0);	ROUND(yl, yr, 1);	ROUND(yr, yl, 2);	ROUND(yl, yr, 3);	ROUND(yr, yl, 4);	ROUND(yl, yr, 5);	ROUND(yr, yl, 6);	ROUND(yl, yr, 7);	ROUND(yr, yl, 8);	ROUND(yl, yr, 9);	ROUND(yr, yl, 10);	ROUND(yl, yr, 11);	ROUND(yr, yl, 12);	ROUND(yl, yr, 13);	ROUND(yr, yl, 14);	ROUND(yl, yr, 15);	yl ^= P[16];	yr ^= P[17];	dst[0] = yr;	dst[1] = yl;}static void bf_encrypt(void *ctx, u8 *dst, const u8 *src){	const u32 *in_blk = (const u32 *)src;	u32 *const out_blk = (u32 *)dst;	u32 in32[2], out32[2];	in32[0] = be32_to_cpu(in_blk[0]);	in32[1] = be32_to_cpu(in_blk[1]);	encrypt_block(ctx, out32, in32);	out_blk[0] = cpu_to_be32(out32[0]);	out_blk[1] = cpu_to_be32(out32[1]);}static void bf_decrypt(void *ctx, u8 *dst, const u8 *src){	const u32 *in_blk = (const u32 *)src;	u32 *const out_blk = (u32 *)dst;	const u32 *P = ((struct bf_ctx *)ctx)->p;	const u32 *S = ((struct bf_ctx *)ctx)->s;	u32 yl = be32_to_cpu(in_blk[0]);	u32 yr = be32_to_cpu(in_blk[1]);	ROUND(yr, yl, 17);	ROUND(yl, yr, 16);	ROUND(yr, yl, 15);	ROUND(yl, yr, 14);	ROUND(yr, yl, 13);	ROUND(yl, yr, 12);	ROUND(yr, yl, 11);	ROUND(yl, yr, 10);	ROUND(yr, yl, 9);	ROUND(yl, yr, 8);	ROUND(yr, yl, 7);	ROUND(yl, yr, 6);	ROUND(yr, yl, 5);	ROUND(yl, yr, 4);	ROUND(yr, yl, 3);	ROUND(yl, yr, 2);	yl ^= P[1];	yr ^= P[0];	out_blk[0] = cpu_to_be32(yr);	out_blk[1] = cpu_to_be32(yl);}/*  * Calculates the blowfish S and P boxes for encryption and decryption. */static int bf_setkey(void *ctx, const u8 *key, unsigned int keylen, u32 *flags){	short i, j, count;	u32 data[2], temp;	u32 *P = ((struct bf_ctx *)ctx)->p;	u32 *S = ((struct bf_ctx *)ctx)->s;	/* Copy the initialization s-boxes */	for (i = 0, count = 0; i < 256; i++)		for (j = 0; j < 4; j++, count++)			S[count] = bf_sbox[count];	/* Set the p-boxes */	for (i = 0; i < 16 + 2; i++)		P[i] = bf_pbox[i];	/* Actual subkey generation */	for (j = 0, i = 0; i < 16 + 2; i++) {		temp = (((u32 )key[j] << 24) |			((u32 )key[(j + 1) % keylen] << 16) |			((u32 )key[(j + 2) % keylen] << 8) |			((u32 )key[(j + 3) % keylen]));		P[i] = P[i] ^ temp;		j = (j + 4) % keylen;	}	data[0] = 0x00000000;	data[1] = 0x00000000;	for (i = 0; i < 16 + 2; i += 2) {		encrypt_block((struct bf_ctx *)ctx, data, data);		P[i] = data[0];		P[i + 1] = data[1];	}	for (i = 0; i < 4; i++) {		for (j = 0, count = i * 256; j < 256; j += 2, count += 2) {			encrypt_block((struct bf_ctx *)ctx, data, data);			S[count] = data[0];			S[count + 1] = data[1];		}	}		/* Bruce says not to bother with the weak key check. */	return 0;}static struct crypto_alg alg = {	.cra_name		=	"blowfish",	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,	.cra_blocksize		=	BF_BLOCK_SIZE,	.cra_ctxsize		=	sizeof(struct bf_ctx),	.cra_module		=	THIS_MODULE,	.cra_list		=	LIST_HEAD_INIT(alg.cra_list),	.cra_u			=	{ .cipher = {	.cia_min_keysize	=	BF_MIN_KEY_SIZE,	.cia_max_keysize	=	BF_MAX_KEY_SIZE,	.cia_setkey   		= 	bf_setkey,	.cia_encrypt 		=	bf_encrypt,	.cia_decrypt  		=	bf_decrypt } }};static int __init init(void){	return crypto_register_alg(&alg);}static void __exit fini(void){	crypto_unregister_alg(&alg);}module_init(init);module_exit(fini);MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Blowfish Cipher Algorithm");

⌨️ 快捷键说明

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