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

📄 idea.c

📁 python的加密库
💻 C
字号:
/* *  idea.c : Source code for the IDEA block cipher * * Part of the Python Cryptography Toolkit * * Distribute and use freely; there are no restrictions on further  * dissemination and usage except those imposed by the laws of your  * country of residence. * */#include "Python.h"#ifdef MS_WIN32#include <winsock2.h>#else#include <sys/param.h>#include <netinet/in.h>#endif#define MODULE_NAME IDEA#define BLOCK_SIZE 8#define KEY_SIZE 16#define low16(x) ((x)/* & 0xFFFF*/)typedef unsigned short uint16;	/* at LEAST 16 bits, maybe more */typedef unsigned short word16;typedef unsigned long word32;typedef unsigned char byte;#define MUL(x,y) (x = low16(x-1), t16 = low16((y)-1), \		t32 = (word32)x*t16 + x + t16, x = low16(t32), \		t16 = t32>>16, x = (x-t16) + (x<t16) + 1)#ifdef _GNUC_/* __const__ simply means there are no side effects for this function, * which is useful info for the gcc optimizer */#define CONST __const__#else#define CONST#endiftypedef struct {	word16 EK[6*8+4], DK[6*8+4];} block_state;CONST static uint16mulInv(uint16 x){	uint16 t0, t1;	uint16 q, y;	if (x <= 1)		return x;		/* 0 and 1 are self-inverse */	t1 = 0x10001L / x;		/* Since x >= 2, this fits into 16 bits */	y = 0x10001L % x;	if (y == 1)		return low16(1 - t1);	t0 = 1;	do {		q = x / y;		x = x % y;		t0 += q * t1;		if (x == 1)			return t0;		q = y / x;		y = y % x;		t1 += q * t0;	} while (y != 1);	return low16(1 - t1);}				/* mukInv */static voidblock_init(block_state *self, unsigned char *key, int dummy){	int i, j;	uint16 t1, t2, t3;	word16 *DK, *EK;    	EK = self->EK;	for (j = 0; j < 8; j++) {		EK[j] = (key[0] << 8) + key[1];		key += 2;	}	for (i = 0; j < 6*8+4; j++) {		i++;		EK[i + 7] = (EK[i & 7] << 9) | (EK[(i + 1) & 7] >> 7);		EK += i & 8;		i &= 7;	}	EK = self->EK;	DK = self->DK+6*8+4;    	t1 = mulInv(*EK++);	t2 = -*EK++;	t3 = -*EK++;	*--DK = mulInv(*EK++);	*--DK = t3;	*--DK = t2;	*--DK = t1;	for (i = 0; i < 8 - 1; i++) {		t1 = *EK++;		*--DK = *EK++;		*--DK = t1;		t1 = mulInv(*EK++);		t2 = -*EK++;		t3 = -*EK++;		*--DK = mulInv(*EK++);		*--DK = t2;		*--DK = t3;		*--DK = t1;	}	t1 = *EK++;	*--DK = *EK++;	*--DK = t1;	t1 = mulInv(*EK++);	t2 = -*EK++;	t3 = -*EK++;	*--DK = mulInv(*EK++);	*--DK = t3;	*--DK = t2;	*--DK = t1;}/*      IDEA encryption/decryption algorithm *//* Note that in and out can be the same buffer */static void ideaCipher(block_state *self, byte *block_in, 		       byte *block_out, word16 const *key){	register uint16 x1, x2, x3, x4, s2, s3;	word16 *in, *out;	register uint16 t16;	/* Temporaries needed by MUL macro */	register word32 t32;	int r = 8;	in = (word16 *) block_in;	x1 = ntohs(*in++);	x2 = ntohs(*in++);	x3 = ntohs(*in++);	x4 = ntohs(*in);	do {		MUL(x1, *key++);		x2 += *key++;		x3 += *key++;		MUL(x4, *key++);		s3 = x3;		x3 ^= x1;		MUL(x3, *key++);		s2 = x2;		x2 ^= x4;		x2 += x3;		MUL(x2, *key++);		x3 += x2;		x1 ^= x2;		x4 ^= x3;		x2 ^= s3;		x3 ^= s2;	} while (--r);	MUL(x1, *key++);	x3 += *key++;	x2 += *key++;	MUL(x4, *key);	out = (word16 *) block_out;	*out++ = htons(x1);	*out++ = htons(x3);	*out++ = htons(x2);	*out = htons(x4);}				/* ideaCipher */static void block_encrypt(block_state *self, 			  unsigned char *in, 			  unsigned char *out){	ideaCipher(self, in, out, self->EK);}static void block_decrypt(block_state *self,			  unsigned char *in, 			  unsigned char *out){	ideaCipher(self, in, out, self->DK);}   #include "block_template.c"

⌨️ 快捷键说明

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