📄 des.c
字号:
left ^= f(key, right, knp); knp += 8; right ^= f(key, left, knp); knp += 8; left ^= f(key, right, knp); knp += 8; right ^= f(key, left, knp); knp += 8; left ^= f(key, right, knp); knp += 8; right ^= f(key, left, knp); knp += 8; left ^= f(key, right, knp); knp += 8; right ^= f(key, left, knp); knp += 8; left ^= f(key, right, knp); knp += 8; right ^= f(key, left, knp); knp += 8; left ^= f(key, right, knp); knp += 8; right ^= f(key, left, knp); /* Left/right half swap, plus byte swap if little-endian */#ifndef WORDS_BIGENDIAN work[1] = byteswap32(left); work[0] = byteswap32(right);#else work[0] = right; work[1] = left;#endif permute_fp((unsigned char *) work, key, block); /* Inverse initial permutation */}/* In-place decryption of 64-bit block. This function is the mirror * image of encryption; exactly the same steps are taken, but in * reverse order */#if 0void_mcrypt_decrypt(DES_KEY * key, unsigned char *block){ register TDS_UINT left, right; register unsigned char *knp; TDS_UINT work[2]; /* Working data storage */ permute_ip(block, key, (unsigned char *) work); /* Initial permutation */ /* Left/right half swap, plus byte swap if little-endian */#ifndef WORDS_BIGENDIAN right = byteswap32(work[0]); left = byteswap32(work[1]);#else right = work[0]; left = work[1];#endif /* Do the 16 rounds in reverse order. * The rounds are numbered from 15 to 0. On even rounds * the right half is fed to f() and the result exclusive-ORs * the left half; on odd rounds the reverse is done. */ knp = &key->kn[15][0]; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp); knp -= 8; right ^= f(key, left, knp); knp -= 8; left ^= f(key, right, knp);#ifndef WORDS_BIGENDIAN work[0] = byteswap32(left); work[1] = byteswap32(right);#else work[0] = left; work[1] = right;#endif permute_fp((unsigned char *) work, key, block); /* Inverse initial permutation */}#endif/* Permute inblock with perm */static voidpermute_ip(des_cblock inblock, DES_KEY * key, des_cblock outblock){ register unsigned char *ib, *ob; /* ptr to input or output block */ register unsigned char *p, *q; register int j; /* Clear output block */ memset(outblock, '\0', 8); ib = inblock; for (j = 0; j < 16; j += 2, ib++) { /* for each input nibble */ ob = outblock; p = key->iperm[j][(*ib >> 4) & 0xf]; q = key->iperm[j + 1][*ib & 0xf]; /* and each output byte, OR the masks together */ *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; }}/* Permute inblock with perm */static voidpermute_fp(des_cblock inblock, DES_KEY * key, des_cblock outblock){ register unsigned char *ib, *ob; /* ptr to input or output block */ register unsigned char *p, *q; register int j; /* Clear output block */ memset(outblock, '\0', 8); ib = inblock; for (j = 0; j < 16; j += 2, ib++) { /* for each input nibble */ ob = outblock; p = key->fperm[j][(*ib >> 4) & 0xf]; q = key->fperm[j + 1][*ib & 0xf]; /* and each output byte, OR the masks together */ *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; *ob++ |= *p++ | *q++; }}/* The nonlinear function f(r,k), the heart of DES */static TDS_UINTf(DES_KEY * key, register TDS_UINT r, register unsigned char *subkey){ register TDS_UINT *spp; register TDS_UINT rval, rt; register int er;#ifdef TRACE printf("f(%08lx, %02x %02x %02x %02x %02x %02x %02x %02x) = ", r, subkey[0], subkey[1], subkey[2], subkey[3], subkey[4], subkey[5], subkey[6], subkey[7]);#endif /* Run E(R) ^ K through the combined S & P boxes. * This code takes advantage of a convenient regularity in * E, namely that each group of 6 bits in E(R) feeding * a single S-box is a contiguous segment of R. */ subkey += 7; /* Compute E(R) for each block of 6 bits, and run thru boxes */ er = ((int) r << 1) | ((r & 0x80000000) ? 1 : 0); spp = &key->sp[7][0]; rval = spp[(er ^ *subkey--) & 0x3f]; spp -= 64; rt = (TDS_UINT) r >> 3; rval |= spp[((int) rt ^ *subkey--) & 0x3f]; spp -= 64; rt >>= 4; rval |= spp[((int) rt ^ *subkey--) & 0x3f]; spp -= 64; rt >>= 4; rval |= spp[((int) rt ^ *subkey--) & 0x3f]; spp -= 64; rt >>= 4; rval |= spp[((int) rt ^ *subkey--) & 0x3f]; spp -= 64; rt >>= 4; rval |= spp[((int) rt ^ *subkey--) & 0x3f]; spp -= 64; rt >>= 4; rval |= spp[((int) rt ^ *subkey--) & 0x3f]; spp -= 64; rt >>= 4; rt |= (r & 1) << 5; rval |= spp[((int) rt ^ *subkey) & 0x3f];#ifdef TRACE printf(" %08lx\n", rval);#endif return rval;}/* initialize a perm array */static voidperminit_ip(DES_KEY * key){ register int l, j, k; int i, m; /* Clear the permutation array */ memset(key->iperm, '\0', 16 * 16 * 8); for (i = 0; i < 16; i++) /* each input nibble position */ for (j = 0; j < 16; j++) /* each possible input nibble */ for (k = 0; k < 64; k++) { /* each output bit position */ l = ip[k] - 1; /* where does this bit come from */ if ((l >> 2) != i) /* does it come from input posn? */ continue; /* if not, bit k is 0 */ if (!(j & nibblebit[l & 3])) continue; /* any such bit in input? */ m = k & 07; /* which bit is this in the byte */ key->iperm[i][j][k >> 3] |= bytebit[m]; }}static voidperminit_fp(DES_KEY * key){ register int l, j, k; int i, m; /* Clear the permutation array */ memset(key->fperm, '\0', 16 * 16 * 8); for (i = 0; i < 16; i++) /* each input nibble position */ for (j = 0; j < 16; j++) /* each possible input nibble */ for (k = 0; k < 64; k++) { /* each output bit position */ l = fp[k] - 1; /* where does this bit come from */ if ((l >> 2) != i) /* does it come from input posn? */ continue; /* if not, bit k is 0 */ if (!(j & nibblebit[l & 3])) continue; /* any such bit in input? */ m = k & 07; /* which bit is this in the byte */ key->fperm[i][j][k >> 3] |= bytebit[m]; }}/* Initialize the lookup table for the combined S and P boxes */static voidspinit(DES_KEY * key){ char pbox[32]; int p, i, s, j, rowcol; TDS_UINT val; /* Compute pbox, the inverse of p32i. * This is easier to work with */ for (p = 0; p < 32; p++) { for (i = 0; i < 32; i++) { if (p32i[i] - 1 == p) { pbox[p] = i; break; } } } for (s = 0; s < 8; s++) { /* For each S-box */ for (i = 0; i < 64; i++) { /* For each possible input */ val = 0; /* The row number is formed from the first and last * bits; the column number is from the middle 4 */ rowcol = (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) & 0xf); for (j = 0; j < 4; j++) { /* For each output bit */ if (si[s][rowcol] & (8 >> j)) { val |= 1L << (31 - pbox[4 * s + j]); } } key->sp[s][i] = val; } }}/* ECB MODE */inttds_des_ecb_encrypt(const void *plaintext, int len, DES_KEY * akey, des_cblock output){ int j; const unsigned char *plain = (const unsigned char *) plaintext; for (j = 0; j < len / 8; j++) { memcpy(&output[j * 8], &plain[j * 8], 8); tds_des_encrypt(akey, &output[j * 8]); } if (j == 0 && len != 0) return -1; /* no blocks were encrypted */ return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -