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

📄 des_std.c

📁 unix密码破解软件John the Ripper
💻 C
📖 第 1 页 / 共 2 页
字号:
	DES_xor2_4(ofs); \	DES_xor2_4(ofs + 4); \	DES_xor2_4(ofs + 8); \	DES_xor2_4(ofs + 12);#if ARCH_BITS >= 64#define DES_xor_key2(_value1, _value2) { \	value1 = _value1; value2 = _value2; \	DES_xor2_16(0); \}#else#define DES_xor_key2(_value1, _value2) { \	value1 = _value1; value2 = _value2; \	DES_xor2_16(0); \	DES_xor2_16(16); \}#endif#elseextern void DES_xor_key1(ARCH_WORD *value);extern void DES_xor_key2(ARCH_WORD *value1, ARCH_WORD *value2);#endifvoid DES_raw_set_key(char *key){	register int i;	DES_KS *pos;#if !DES_ASM	register ARCH_WORD *value1;#endif	memcpy(DES_KS_current,		DES_KS_table[0][(ARCH_INDEX)(DES_key[0] = key[0] & 0x7F)],		sizeof(DES_KS));	pos = (DES_KS *)DES_KS_table[1][0];	for (i = 1; i < 8; i++) {		DES_xor_key1(pos[(ARCH_INDEX)(DES_key[i] = key[i] & 0x7F)]);		pos += 128;	}}void DES_std_set_key(char *key){	register int i, j, k, l;#if !DES_ASM	register ARCH_WORD *value1, *value2;#endif	for (k = i = 0; (j = key[i]) && (l = DES_key[i]); i++)	if (j != l) k += 3;	if (j) {		while (i < 8 && key[i]) {			i++; k += 2;		}		j = i;	} else {		j = i;		while (DES_key[i++]) k += 2;	}	if ((k < (j << 1)) && (++DES_KS_updates & 0xFFF)) {		j = 0; l = 1;		for (i = 0; (k = key[i]) && i < 8; i++) {			if (l)			if (k == (l = DES_key[j++])) continue;			if (l) {				DES_xor_key2(DES_KS_table[i][l],					DES_KS_table[i][k & 0x7F]);			} else				DES_xor_key1(DES_KS_table[i][k & 0x7F]);		}		if (l)		for (; j < 8 && (l = DES_key[j]); j++)			DES_xor_key1(DES_KS_table[j][l]);	} else {		memcpy(DES_KS_current, DES_KS_table[0][(k = key[0]) & 0x7F],			sizeof(DES_KS));		if (k)		for (i = 1; (k = key[i]) && i < 8; i++)			DES_xor_key1(DES_KS_table[i][k & 0x7F]);	}	DES_key[0] = key[0] & 0x7F;	DES_key[1] = key[1] & 0x7F;	DES_key[2] = key[2] & 0x7F;	DES_key[3] = key[3] & 0x7F;	DES_key[4] = key[4] & 0x7F;	DES_key[5] = key[5] & 0x7F;	DES_key[6] = key[6] & 0x7F;	DES_key[7] = key[7] & 0x7F;}void DES_std_set_block(ARCH_WORD R, ARCH_WORD L){	register ARCH_WORD Rl, Rh, Ll, Lh;	register unsigned ARCH_WORD C;#if ARCH_BITS >= 64	register ARCH_WORD mask;#else	register ARCH_WORD *mask;#endif	int chunk;	C = (R & 0xAAAAAAAA) | ((L & 0xAAAAAAAA) >> 1);	Rh = Rl = 0;	for (chunk = 0; chunk < 8; chunk++) {		mask = DES_IP_E[chunk][C & 0xF];#if ARCH_BITS >= 64		Rl |= mask & 0xFFFFFFFF;		Rh |= mask >> 32;#else		Rl |= mask[0];		Rh |= mask[1];#endif		C >>= 4;	}	C = ((R & 0x55555555) << 1) | (L & 0x55555555);	Lh = Ll = 0;	for (chunk = 0; chunk < 8; chunk++) {		mask = DES_IP_E[chunk][C & 0xF];#if ARCH_BITS >= 64		Ll |= mask & 0xFFFFFFFF;		Lh |= mask >> 32;#else		Ll |= mask[0];		Lh |= mask[1];#endif		C >>= 4;	}	Rl = DES_DO_SIZE_FIX(Rl);	Rh = DES_DO_SIZE_FIX(Rh);	Ll = DES_DO_SIZE_FIX(Ll);	Lh = DES_DO_SIZE_FIX(Lh);#if ARCH_BITS >= 64	DES_IV[0] = Rl | (Rh << 32);	DES_IV[1] = Ll | (Lh << 32);#else	DES_IV[0] = Rl;	DES_IV[1] = Rh;	DES_IV[2] = Ll;	DES_IV[3] = Lh;#endif}void DES_std_get_block(DES_binary binary, unsigned ARCH_WORD out[2]){	register ARCH_WORD Rl, Rh, Ll, Lh;	register ARCH_WORD R, L;	register unsigned ARCH_WORD C;#if ARCH_BITS >= 64	register unsigned ARCH_WORD mask;#else	register ARCH_WORD *mask;#endif	int chunk;#if ARCH_BITS >= 64	Rl = binary[0];	Rh = binary[0] >> 32;	Ll = binary[1];	Lh = binary[1] >> 32;#else	Rl = binary[0];	Rh = binary[1];	Ll = binary[2];	Lh = binary[3];#endif	Rl = DES_UNDO_SIZE_FIX(Rl);	Rh = DES_UNDO_SIZE_FIX(Rh);	Ll = DES_UNDO_SIZE_FIX(Ll);	Lh = DES_UNDO_SIZE_FIX(Lh);	R = L = 0;	C = ((Ll >> 1) & 0x0F0F0F0F) | ((Lh << 3) & 0xF0F0F0F0);	for (chunk = 0; chunk < 16; chunk++) {		if (chunk == 8)			C = ((Rl >> 1) & 0x0F0F0F0F) | ((Rh << 3) & 0xF0F0F0F0);		mask = DES_C_FP[chunk][C & 0xF];#if ARCH_BITS >= 64		R |= mask & 0xFFFFFFFF;		L |= mask >> 32;#else		R |= mask[0];		L |= mask[1];#endif		C >>= 4;	}	out[0] = R;	out[1] = L;}#if !DES_ASM#if !DES_MASK#define DES_D				(DES_tmp.w)#if ARCH_LITTLE_ENDIAN#define DES_Dl				(DES_tmp.w[0])#define DES_Dh				(DES_tmp.w[1])#define DES_B0				(DES_tmp.b[0])#define DES_B1				(DES_tmp.b[1])#define DES_B2				(DES_tmp.b[2])#define DES_B3				(DES_tmp.b[3])#define DES_B4				(DES_tmp.b[4])#define DES_B5				(DES_tmp.b[5])#define DES_B6				(DES_tmp.b[6])#define DES_B7				(DES_tmp.b[7])#else#define DES_Dl				(DES_tmp.w[1])#define DES_Dh				(DES_tmp.w[0])#if ARCH_BITS > 64#define DES_START			ARCH_SIZE#else#define DES_START			8#endif#define DES_B0				(DES_tmp.b[DES_START - 1])#define DES_B1				(DES_tmp.b[DES_START - 2])#define DES_B2				(DES_tmp.b[DES_START - 3])#define DES_B3				(DES_tmp.b[DES_START - 4])#define DES_B4				(DES_tmp.b[DES_START - 5])#define DES_B5				(DES_tmp.b[DES_START - 6])#define DES_B6				(DES_tmp.b[DES_START - 7])#define DES_B7				(DES_tmp.b[DES_START - 8])#endif#endif/* * The code below is heavily optimized, looking at the assembly output for * several architectures, enjoy the speed. */#if ARCH_BITS >= 64#if !DES_128K/* * An extra temporary register is used for better instruction scheduling. */#if DES_MASK#if DES_SCALE/* 64 bit, 4K, mask, scale */#define DES_ROUND(L, H, B) \	T = DES_INDEX(DES_SPE_F[0], DES_D & DES_MASK_6); \	B ^= DES_INDEX(DES_SPE_F[1], (DES_D >> 8) & DES_MASK_6); \	T ^= DES_INDEX(DES_SPE_F[2], (DES_D >> 16) & DES_MASK_6); \	B ^= DES_INDEX(DES_SPE_F[3], (DES_D >> 24) & DES_MASK_6); \	T ^= DES_INDEX(DES_SPE_F[4], (DES_D >> 32) & DES_MASK_6); \	B ^= DES_INDEX(DES_SPE_F[5], (DES_D >> 40) & DES_MASK_6); \	T ^= DES_INDEX(DES_SPE_F[6], (DES_D >> 48) & DES_MASK_6); \	B ^= T ^ DES_INDEX(DES_SPE_F[7], DES_D >> 56);#else/* * This code assumes that the indices are already shifted left by 2, and still * should be shifted left by 1 more bit. Weird shift counts allow doing this * with only one extra shift, in the first line. By shifting the mask right * (which is done at compile time), I moved the extra shift out of the mask, * which allows doing this with special addressing modes, where possible. *//* 64 bit, 4K, mask, no scale */#define DES_ROUND(L, H, B) \	T = DES_INDEX(DES_SPE_F[0], (DES_D & (DES_MASK_6 >> 1)) << 1); \	B ^= DES_INDEX(DES_SPE_F[1], (DES_D >> 7) & DES_MASK_6); \	T ^= DES_INDEX(DES_SPE_F[2], (DES_D >> 15) & DES_MASK_6); \	B ^= DES_INDEX(DES_SPE_F[3], (DES_D >> 23) & DES_MASK_6); \	T ^= DES_INDEX(DES_SPE_F[4], (DES_D >> 31) & DES_MASK_6); \	B ^= DES_INDEX(DES_SPE_F[5], (DES_D >> 39) & DES_MASK_6); \	T ^= DES_INDEX(DES_SPE_F[6], (DES_D >> 47) & DES_MASK_6); \	B ^= T ^ DES_INDEX(DES_SPE_F[7], (DES_D >> 55) & DES_MASK_6);#endif#else/* 64 bit, 4K, store/load, scale */#define DES_ROUND(L, H, B) \	T = DES_INDEX(DES_SPE_F[0], DES_B0); \	B ^= DES_INDEX(DES_SPE_F[1], DES_B1); \	T ^= DES_INDEX(DES_SPE_F[2], DES_B2); \	B ^= DES_INDEX(DES_SPE_F[3], DES_B3); \	T ^= DES_INDEX(DES_SPE_F[4], DES_B4); \	B ^= DES_INDEX(DES_SPE_F[5], DES_B5); \	T ^= DES_INDEX(DES_SPE_F[6], DES_B6); \	B ^= T ^ DES_INDEX(DES_SPE_F[7], DES_B7);#endif#else/* 64 bit, 128K, mask, no scale */#define DES_ROUND(L, H, B) \	B ^= DES_INDEX(DES_SPE_W[0], DES_D & 0xFFFF); \	B ^= DES_INDEX(DES_SPE_W[1], (DES_D >>= 16) & 0xFFFF); \	B ^= DES_INDEX(DES_SPE_W[2], (DES_D >>= 16) & 0xFFFF); \	B ^= DES_INDEX(DES_SPE_W[3], DES_D >> 16);#endif#else#if !DES_128K#if DES_MASK/* 32 bit, 4K, mask */#define DES_ROUND(L, H, B) \	L ^= DES_INDEX(DES_SPE_L[0], DES_Dl & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[0], DES_Dl & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[1], (DES_Dl >>= 8) & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[1], DES_Dl & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[2], (DES_Dl >>= 8) & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[2], DES_Dl & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[3], (DES_Dl >>= 8) & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[3], DES_Dl & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[4], DES_Dh & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[4], DES_Dh & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[5], (DES_Dh >>= 8) & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[5], DES_Dh & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[6], (DES_Dh >>= 8) & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[6], DES_Dh & DES_MASK_6); \	L ^= DES_INDEX(DES_SPE_L[7], (DES_Dh >>= 8) & DES_MASK_6); \	H ^= DES_INDEX(DES_SPE_H[7], DES_Dh & DES_MASK_6);#else/* 32 bit, 4K, store/load */#define DES_ROUND(L, H, B) \	L ^= DES_INDEX(DES_SPE_L[0], DES_B0); \	H ^= DES_INDEX(DES_SPE_H[0], DES_B0); \	L ^= DES_INDEX(DES_SPE_L[1], DES_B1); \	H ^= DES_INDEX(DES_SPE_H[1], DES_B1); \	L ^= DES_INDEX(DES_SPE_L[2], DES_B2); \	H ^= DES_INDEX(DES_SPE_H[2], DES_B2); \	L ^= DES_INDEX(DES_SPE_L[3], DES_B3); \	H ^= DES_INDEX(DES_SPE_H[3], DES_B3); \	L ^= DES_INDEX(DES_SPE_L[4], DES_B4); \	H ^= DES_INDEX(DES_SPE_H[4], DES_B4); \	L ^= DES_INDEX(DES_SPE_L[5], DES_B5); \	H ^= DES_INDEX(DES_SPE_H[5], DES_B5); \	L ^= DES_INDEX(DES_SPE_L[6], DES_B6); \	H ^= DES_INDEX(DES_SPE_H[6], DES_B6); \	L ^= DES_INDEX(DES_SPE_L[7], DES_B7); \	H ^= DES_INDEX(DES_SPE_H[7], DES_B7);#endif#else/* 32 bit, 128K, mask */#define DES_ROUND(L, H, B) \	L ^= DES_INDEX_L(DES_SPE_W[0], DES_Dl & 0xFFFF); \	H ^= DES_INDEX_H(DES_SPE_W[0], DES_Dl & 0xFFFF); \	L ^= DES_INDEX_L(DES_SPE_W[1], DES_Dl >>= 16); \	H ^= DES_INDEX_H(DES_SPE_W[1], DES_Dl); \	L ^= DES_INDEX_L(DES_SPE_W[2], DES_Dh & 0xFFFF); \	H ^= DES_INDEX_H(DES_SPE_W[2], DES_Dh & 0xFFFF); \	L ^= DES_INDEX_L(DES_SPE_W[3], DES_Dh >>= 16); \	H ^= DES_INDEX_H(DES_SPE_W[3], DES_Dh);#endif#endif#if ARCH_BITS >= 64#define DES_2_ROUNDS(KS) \	DES_D = R ^ KS[0]; \	DES_ROUND(Ll, Lh, L); \	DES_D = L ^ KS[1]; \	DES_ROUND(Rl, Rh, R);#else#define DES_2_ROUNDS(KS) \	DES_Dl = Rl ^ KS[0]; \	DES_Dh = Rh ^ KS[1]; \	DES_ROUND(Ll, Lh, L); \	DES_Dl = Ll ^ KS[2]; \	DES_Dh = Lh ^ KS[3]; \	DES_ROUND(Rl, Rh, R);#endif#if DES_COPYstatic void crypt_body()#elsevoid DES_std_crypt(DES_KS KS, DES_binary DES_out)#endif{#if DES_MASK#if ARCH_BITS >= 64	register unsigned ARCH_WORD DES_D;#else	register unsigned ARCH_WORD DES_Dl, DES_Dh;#endif#else	union {#if ARCH_BITS >= 64		ARCH_WORD w;#else		ARCH_WORD w[2];#endif		unsigned char b[8];	} DES_tmp;#endif#if ARCH_BITS >= 64	register ARCH_WORD R, L;#if !DES_128K	register ARCH_WORD T;#endif#else	register ARCH_WORD Rl, Rh, Ll, Lh;#endif	register int count;#if ARCH_BITS >= 64	R = DES_IV[0];	L = DES_IV[1];#else	Rl = DES_IV[0];	Rh = DES_IV[1];	Ll = DES_IV[2];	Lh = DES_IV[3];#endif	count = DES_count;	do {		DES_2_ROUNDS(DES_KS_INDEX(0));		DES_2_ROUNDS(DES_KS_INDEX(1));		DES_2_ROUNDS(DES_KS_INDEX(2));		DES_2_ROUNDS(DES_KS_INDEX(3));		DES_2_ROUNDS(DES_KS_INDEX(4));		DES_2_ROUNDS(DES_KS_INDEX(5));		DES_2_ROUNDS(DES_KS_INDEX(6));		DES_2_ROUNDS(DES_KS_INDEX(7));#if ARCH_BITS >= 64		L ^= R;		R ^= L;		L ^= R;#else		Ll ^= Rl;		Lh ^= Rh;		Rl ^= Ll;		Rh ^= Lh;		Ll ^= Rl;		Lh ^= Rh;#endif	} while (--count);#if ARCH_BITS >= 64	DES_out[0] = R;	DES_out[1] = L;#else	DES_out[0] = Rl;	DES_out[1] = Rh;	DES_out[2] = Ll;	DES_out[3] = Lh;#endif}#if DES_COPYvoid DES_std_crypt(DES_KS KS, DES_binary out){	memcpy(DES_KS_copy, KS, sizeof(DES_KS));	DES_out = out;	crypt_body();}#endif#endifstatic unsigned char DES_atoi64[0x100] = {	18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,	34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,	50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1,	2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5, 6, 7, 8, 9, 10,	11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,	27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 32, 33, 34, 35, 36,	37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,	53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4,	5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,	21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,	37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,	53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4,	5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,	21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,	37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,	53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4};ARCH_WORD DES_raw_get_salt(char *ciphertext){	if (ciphertext[13]) return DES_atoi64[(ARCH_INDEX)ciphertext[5]] |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[6]] << 6) |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[7]] << 12) |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[8]] << 18);	else return DES_atoi64[(ARCH_INDEX)ciphertext[0]] |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[1]] << 6);}ARCH_WORD DES_std_get_salt(char *ciphertext){	ARCH_WORD salt;	salt = DES_raw_get_salt(ciphertext);	salt = DES_TO_6_BIT(salt);	return DES_DO_SIZE_FIX(salt);}ARCH_WORD DES_raw_get_count(char *ciphertext){	if (ciphertext[13]) return DES_atoi64[(ARCH_INDEX)ciphertext[1]] |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[2]] << 6) |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[3]] << 12) |		((ARCH_WORD)DES_atoi64[(ARCH_INDEX)ciphertext[4]] << 18);	else return 25;}ARCH_WORD *DES_raw_get_binary(char *ciphertext){	static ARCH_WORD masks[8] = {		0x1000, 0x0800, 0x0400, 0x0200, 0x0010, 0x0008, 0x0004, 0x0002	};	static ARCH_WORD out[4];	int ofs, chr, bit, index, value;	unsigned char block[66], *ptr;	ARCH_WORD mask1, mask2;	ARCH_WORD Rl, Rh, Ll, Lh;	if (ciphertext[13]) ofs = 9; else ofs = 2;	ptr = block;	for (chr = 0; chr < 11; chr++) {		value = DES_atoi64[(ARCH_INDEX)ciphertext[chr + ofs]];		mask1 = 0x20;		for (bit = 0; bit < 6; bit++) {			*ptr++ = value & mask1;			mask1 >>= 1;		}	}	Lh = Ll = Rh = Rl = 0;	ptr = block;	for (index = 0; index < 8; index++) {		mask2 = (mask1 = masks[index]) << 16;		if (*ptr++) Rl |= mask1;		if (*ptr++) Ll |= mask1;		if (*ptr++) Rl |= mask2;		if (*ptr++) Ll |= mask2;		if (*ptr++) Rh |= mask1;		if (*ptr++) Lh |= mask1;		if (*ptr++) Rh |= mask2;		if (*ptr++) Lh |= mask2;	}	out[0] = Rl;	out[1] = Rh;	out[2] = Ll;	out[3] = Lh;	return out;}ARCH_WORD *DES_std_get_binary(char *ciphertext){	ARCH_WORD *out;	ARCH_WORD salt, mask;	out = DES_raw_get_binary(ciphertext);	out[0] = DES_DO_SIZE_FIX(out[0]);	out[1] = DES_DO_SIZE_FIX(out[1]);	out[2] = DES_DO_SIZE_FIX(out[2]);	out[3] = DES_DO_SIZE_FIX(out[3]);	salt = DES_std_get_salt(ciphertext);	mask = (out[0] ^ out[1]) & salt;	out[0] ^= mask;	out[1] ^= mask;	mask = (out[2] ^ out[3]) & salt;	out[2] ^= mask;	out[3] ^= mask;#if ARCH_BITS >= 64	out[0] |= out[1] << 32;	out[1] = out[2] | (out[3] << 32);#endif	return out;}

⌨️ 快捷键说明

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