blowfish.c

来自「加密解密算法」· C语言 代码 · 共 479 行 · 第 1/2 页

C
479
字号
	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 + =
减小字号Ctrl + -
显示快捷键?