📄 des_std.c
字号:
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 + -