📄 des_std.c
字号:
}#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 j = key[0]; for (k = i = 0; (l = DES_key[i]) && (j = 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; i < 8 && (k = key[i]); 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; i < 8 && (k = key[i]); 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(void)#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_24_TO_32(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_do_IP(ARCH_WORD in[2]){ static ARCH_WORD out[2]; int src, dst; out[0] = out[1] = 0; for (dst = 0; dst < 64; dst++) { src = DES_IP[dst ^ 0x20]; if (in[src >> 5] & (1 << (src & 0x1F))) out[dst >> 5] |= 1 << (dst & 0x1F); } return out;}ARCH_WORD *DES_raw_get_binary(char *ciphertext){ ARCH_WORD block[3]; ARCH_WORD mask; int ofs, chr, src, dst, value; if (ciphertext[13]) ofs = 9; else ofs = 2; block[0] = block[1] = 0; dst = 0; for (chr = 0; chr < 11; chr++) { value = DES_atoi64[ARCH_INDEX(ciphertext[chr + ofs])]; mask = 0x20; for (src = 0; src < 6; src++) { if (value & mask) block[dst >> 5] |= 1 << (dst & 0x1F); mask >>= 1; dst++; } } return DES_do_IP(block);}ARCH_WORD *DES_std_get_binary(char *ciphertext){ static ARCH_WORD out[4]; ARCH_WORD *raw; ARCH_WORD salt, mask; raw = DES_raw_get_binary(ciphertext); out[0] = DES_16_TO_32(raw[0]); out[1] = DES_16_TO_32(raw[0] >> 16); out[2] = DES_16_TO_32(raw[1]); out[3] = DES_16_TO_32(raw[1] >> 16); 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 + -