📄 des.c
字号:
**************************************************************************/
permute(temp, DesTransform, 56);
/**************************************************************************
* *
* Split the key into two 28-bit blocks. *
* *
**************************************************************************/
memset(lkey, 0, 4);
memset(rkey, 0, 4);
for (j = 0; j < 28; j++)
bit_set(lkey, j, bit_get(temp, j));
for (j = 0; j < 28; j++)
bit_set(rkey, j, bit_get(temp, j + 28));
/**************************************************************************
* *
* Compute the subkeys for each round. *
* *
**************************************************************************/
for (i = 0; i < 16; i++) {
/***********************************************************************
* *
* Rotate each block according to its round. *
* *
***********************************************************************/
bit_rot_left(lkey, 28, DesRotations[i]);
bit_rot_left(rkey, 28, DesRotations[i]);
/***********************************************************************
* *
* Concatenate the blocks into a single subkey. *
* *
***********************************************************************/
for (j = 0; j < 28; j++)
bit_set(subkeys[i], j, bit_get(lkey, j));
for (j = 0; j < 28; j++)
bit_set(subkeys[i], j + 28, bit_get(rkey, j));
/***********************************************************************
* *
* Do the permuted choice permutation. *
* *
***********************************************************************/
permute(subkeys[i], DesPermuted, 48);
}
}
/*****************************************************************************
* *
* Make a local copy of the source text. *
* *
*****************************************************************************/
memcpy(temp, source, 8);
/*****************************************************************************
* *
* Do the initial permutation. *
* *
*****************************************************************************/
permute(temp, DesInitial, 64);
/*****************************************************************************
* *
* Split the source text into a left and right block of 32 bits. *
* *
*****************************************************************************/
memcpy(lblk, &temp[0], 4);
memcpy(rblk, &temp[4], 4);
/*****************************************************************************
* *
* Encipher or decipher the source text. *
* *
*****************************************************************************/
for (i = 0; i < 16; i++) {
/**************************************************************************
* *
* Begin the computation of f. *
* *
**************************************************************************/
memcpy(fblk, rblk, 4);
/**************************************************************************
* *
* Permute and expand the copy of the right block into 48 bits. *
* *
**************************************************************************/
permute(fblk, DesExpansion, 48);
/**************************************************************************
* *
* Apply the appropriate subkey for the round. *
* *
**************************************************************************/
if (direction == encipher) {
/***********************************************************************
* *
* For enciphering, subkeys are applied in increasing order. *
* *
***********************************************************************/
bit_xor(fblk, subkeys[i], xblk, 48);
memcpy(fblk, xblk, 6);
}
else {
/***********************************************************************
* *
* For deciphering, subkeys are applied in decreasing order. *
* *
***********************************************************************/
bit_xor(fblk, subkeys[15 - i], xblk, 48);
memcpy(fblk, xblk, 6);
}
/**************************************************************************
* *
* Do the S-box substitutions. *
* *
**************************************************************************/
p = 0;
for (j = 0; j < 8; j++) {
/***********************************************************************
* *
* Compute a row and column into the S-box tables. *
* *
***********************************************************************/
row = (bit_get(fblk, (j * 6)+0) * 2) + (bit_get(fblk, (j * 6)+5) * 1);
col = (bit_get(fblk, (j * 6)+1) * 8) + (bit_get(fblk, (j * 6)+2) * 4) +
(bit_get(fblk, (j * 6)+3) * 2) + (bit_get(fblk, (j * 6)+4) * 1);
/***********************************************************************
* *
* Do the S-box substitution for the current six-bit block. *
* *
***********************************************************************/
sblk = (unsigned char)DesSbox[j][row][col];
for (k = 4; k < 8; k++) {
bit_set(fblk, p, bit_get(&sblk, k));
p++;
}
}
/**************************************************************************
* *
* Do the P-box permutation to complete f. *
* *
**************************************************************************/
permute(fblk, DesPbox, 32);
/**************************************************************************
* *
* Compute the XOR of the left block and f. *
* *
**************************************************************************/
bit_xor(lblk, fblk, xblk, 32);
/**************************************************************************
* *
* Set the left block for the round. *
* *
**************************************************************************/
memcpy(lblk, rblk, 4);
/**************************************************************************
* *
* Set the right block for the round. *
* *
**************************************************************************/
memcpy(rblk, xblk, 4);
}
/*****************************************************************************
* *
* Set the target text to the rejoined final right and left blocks. *
* *
*****************************************************************************/
memcpy(&target[0], rblk, 4);
memcpy(&target[4], lblk, 4);
/*****************************************************************************
* *
* Do the final permutation. *
* *
*****************************************************************************/
permute(target, DesFinal, 64);
return 0;
}
/*****************************************************************************
* *
* ----------------------------- des_encipher ----------------------------- *
* *
*****************************************************************************/
void des_encipher(const unsigned char *plaintext, unsigned char *ciphertext,
const unsigned char *key) {
des_main(plaintext, ciphertext, key, encipher);
return;
}
/*****************************************************************************
* *
* ----------------------------- des_decipher ----------------------------- *
* *
*****************************************************************************/
void des_decipher(const unsigned char *ciphertext, unsigned char *plaintext,
const unsigned char *key) {
des_main(ciphertext, plaintext, key, decipher);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -