📄 des算法实现过程分析 之 c++.txt
字号:
#include <stdio.h>
void expand(const unsigned char in[32],unsigned char out[48])
{
unsigned char table4[48]={ 31, 0, 1, 2, 3, 4,
3, 4, 5, 6, 7, 8,
7, 8, 9, 10, 11, 12,
11, 12, 13, 14, 15, 16,
15, 16, 17, 18, 19, 20,
19, 20, 21, 22, 23, 24,
23, 24, 25, 26, 27, 28,
27, 28, 29, 30, 31, 0 };
for (int i=0;i<48;i++) out[i]=in[table4[i]]; }
void keys(const unsigned char password[8], unsigned char K[16][48])
{
int i,j;
unsigned char key[64];
for (i=0;i<64;i++) {
int byte=i/8;
int bit=i%8;
int value=password[byte];
value>>=bit; value&=1;
key[i]= value?1:0;
}
unsigned char keyT[56];
unsigned char table1[56]={56, 48, 40, 32, 24, 16, 8, 0,
57, 49, 41, 33, 25, 17, 9, 1,
58, 50, 42, 34, 26, 18, 10, 2,
59, 51, 43, 35,
62, 54, 46, 38, 30, 22, 14, 6,
61, 53, 45, 37, 29, 21, 13, 5,
60, 52, 44, 36, 28, 20, 12, 4,
27, 19, 11, 3 };
for (i=0; i<56; i++) keyT[i]=key[table1[i]];
unsigned char *C=keyT;
unsigned char *D=keyT+28;
char loop[16]= {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
unsigned char tmp[28];
int n=loop[i];
int j;
for (j=0; j<28; j++) tmp[j]=C[(j+28-n)%28];
for (j=0; j<28; j++) C[j]=tmp[j];
for (j=0; j<28; j++) tmp[j]=D[(j+28-n)%28];
for (j=0; j<28; j++) D[j]=tmp[j];
unsigned char *CD=keyT;
unsigned char table2[48]=
{13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
for (j=0;j<48;j++)
K[i][j]=CD[table2[j]];
}
}
void des(const unsigned char datain[8], unsigned char dataout[8],
const unsigned char K[16][48], const unsigned char mode)
{
unsigned char DATA[64];
int i,j;
for (i=0;i<64;i++) {
int byte=i/8;
int bit=i%8;
int value=datain[byte];
value>>=bit;
value&=1;
DATA[i]= value;
}
unsigned char data[64];
unsigned char table3[64]= { 57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7,
56, 48, 40, 32, 24, 16, 8, 0,
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6 };
for (i=0;i<64;i++) data[i]=DATA[table3[i]];
unsigned char L[17][32];
unsigned char R[17][32];
for (i=0; i<32; i++) L[0][i]=data[i];
for (i=0; i<32; i++) R[0][i]=data[i+32];
unsigned char s[8][4][16]={
/* S[1] */
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
/* S[2] */
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
/* S[3] */
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
/* S[4] */
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
/* S[5] */
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
/* S[6] */
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
/* S[7] */
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
/* S[8] */
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };
unsigned char R_[48];
for (i=0; i<16; i++) {
expand(R[i],R_);
for (j=0;j<48;j++)
if (mode) R_[j]^=K[i][j];
else R_[j]^=K[16-1-i][j];
unsigned char B[8];
for (j=0; j<8; j++){ B[j]=0;
for (int k=0; k<6; k++)
B[j]|=(R_[j*6+k]<<(6-1-k));}
for (j=0; j<8; j++){
int m=0; int n=0;
m|=(B[j]&0x1); m|=((B[j]>>4)&0x2);
n=(B[j]>>1); n&=0x0f;
B[j]=s[j][m][n];
}
unsigned char tmp[32];
for (j=0;j<32; j++)
tmp[j]= (B[j/4]>> (4-1-(j%4)))&1;
unsigned char table5[32]={
15, 6, 19, 20, 28, 11, 27, 16,
0, 14, 22, 25, 4, 17, 30, 9,
1, 7, 23, 13, 31, 26, 2, 8,
18, 12, 29, 5, 21, 10, 3, 24};
unsigned char tmp1[32];
for (j=0;j<32;j++)
tmp1[j]=tmp[table5[j]];
for (j=0;j<32;j++)
R[i+1][j]=L[i][j]^tmp1[j];
for (j=0;j<32;j++)
L[i+1][j]=R[i][j];
}
unsigned char tmp2[64];
for (i=0;i<32;i++) tmp2[i]=R[16][i];
for (i=32;i<64;i++)tmp2[i]=L[16][i-32];
unsigned char out[64];
for (i=0;i<64;i++) out[table3[i]]=tmp2[i];
for (i=0; i<8;i++){
dataout[i]=0;
for (j=0; j<8; j++)
dataout[i]|=(out[i*8+j]<<j);}
}
void main()
{
unsigned char KEY[8]= "12345678";
unsigned char source[8]="abcdefgh";
unsigned char target[8];
unsigned char K[16][48];
keys(KEY,K);
printf("======================");
printf("\nPassword=%s\n",KEY);
printf("\nSource ");
for (int i=0;i<8;i++)
printf("%02X ",source[i]&0x0ff);
printf("\n ");
for (i=0;i<8;i++)
printf("%c ",source[i]);
#define ENCRYPT 1
des(source, target,K,ENCRYPT);
printf("\nEncrypt ");
for (i=0;i<8;i++)
printf("%02X ",target[i]&0x0ff);
printf("\n ");
for (i=0;i<8;i++)
printf("%c ",target[i]);
#define DECRYPT 0
des(target,source, K,DECRYPT);
printf("\nDecrypt ");
for (i=0;i<8;i++)
printf("%02X ",source[i]&0x0ff);
printf("\n ");
for (i=0;i<8;i++)
printf("%c ",source[i]);
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -