📄 des.c
字号:
/*--------------------------------------------------------------------------------
DES.C: DES Algorithm Program
--------------------------------------------------------------------------------*/
#include <string.h>
#define BYTE unsigned char
#define bool unsigned char
static code BYTE initialtr[64]={58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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 };
static code BYTE keytr1[56] ={57,49,41,33,25,17, 9,
1,58,50,42,34,26,18,
10, 2,59,51,43,35,27,
19,11, 3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14, 6,61,53,45,37,29,
21,13, 5,28,20,12, 4 };
static code BYTE rots[16] ={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
static code BYTE keytr2[48] ={14,17,11,24, 1, 5,
3,28,15, 6,21,10,
23,19,12, 4,26, 8,
16, 7,27,20,13, 2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32 };
static code BYTE etr[48] ={32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32, 1 };
static code BYTE s[8][64] ={{ 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 },
{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 },
{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 },
{ 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 },
{ 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 },
{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 },
{ 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 },
{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 }};
static code BYTE ptr[32] ={16, 7,20,21,29,12,28,17,
1,15,23,26, 5,18,31,10,
2, 8,24,14,32,27, 3, 9,
19,13,30, 6,22,11, 4,25};
static code BYTE swap[64] ={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,64,
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};
static code BYTE finaltr[64]={40, 8,48,16,56,24,64,32,
39, 7,47,15,55,23,63,31,
38, 6,46,14,54,22,62,30,
37, 5,45,13,53,21,61,29,
36, 4,44,12,52,20,60,28,
35, 3,43,11,51,19,59,27,
34, 2,42,10,50,18,58,26,
33, 1,41, 9,49,17,57,25 };
void increase(BYTE *text1, bool *plainttext1)
{
BYTE i,j,b;
for(i=0;i<=7;i++)
{
b=text1[i];
for(j=(i*8);j<=(i*8)+7;j++)
{
plainttext1[j]=(b>=0x80);
b=b<<1;
}
}
}
void transpose(bool *_data, BYTE* t,BYTE n)
{
BYTE i;
bool x[64];
memcpy(x,_data,64);
for(i=0;i<n;i++)
_data[i]=x[t[i]-1];
}
void Rotate_left_cycle(bool* keyr)
{
bool temp;
BYTE i;
temp=keyr[0];
for(i=0;i<55;i++)
keyr[i]=keyr[i+1];
keyr[55]=keyr[27];
keyr[27]=temp;
}
void DESsubkey(BYTE* key, bool keylistm[16][56])
{
BYTE i,n;
bool key0[64];
increase(key,key0);
transpose(key0,keytr1,56);
for(i=0;i<16;i++)
{
for(n=0;n<rots[i];n++)
Rotate_left_cycle(key0);
memcpy(keylistm[i], key0, 56);
transpose(keylistm[i], keytr2, 48);
}
}
void f(bool* R, bool* subkey)
{
BYTE i,j,k, p,temp;
transpose(R,etr,48); // expand
for(i=0;i<48;i++)
R[i]^=subkey[i]; //XOR
for(k=0;k<8;k++)
{
p=(32*R[6*k]+16*R[6*k+5]+8*R[6*k+1]+4*R[6*k+2]+2*R[6*k+3]+R[6*k+4]);
temp=s[k][p];
for(j=0;j<4;j++)
{
R[4*k+j]=(temp>=0x08);
temp=(temp<<1)&0x0f;
}
}
transpose(R,ptr,32);
}
void press(bool *dt1,BYTE *dt2)
{
BYTE a,i,j;
for(j=0;j<8;j++)
{
a=0;
for(i=8*j;i<8*j+8; i++)
{
a=a<<1;
a=a+dt1[i];
}
dt2[j]=a;
}
}
void DESBasic(bool tp, bool subkey[16][56], BYTE *dest, BYTE *sour)
{
bool sour0[80],tmpgrp[32];//sour0; 32+48
BYTE i,j;
increase(sour,sour0);
transpose(sour0,initialtr,64);
for (i=0;i<16;i++)
{
for(j=0;j<32;j++)
tmpgrp[j]=sour0[32+j];
if(!tp)
f(&sour0[32], subkey[i]);
else
f(&sour0[32], subkey[15-i]);
for(j=0;j<32;j++)
{
sour0[j]=sour0[j]^sour0[32+j];//XOR
sour0[32+j]=tmpgrp[j];
}
if(i<15)
transpose(sour0,swap,64);
}
transpose(sour0,finaltr,64);
press(sour0,dest);
}
void DESencrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
bool subkey[16][56];
DESsubkey(key,subkey);
DESBasic(0, subkey, dest, sour);
}
void DESdecrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
bool subkey[16][56];
DESsubkey(key,subkey);
DESBasic(1, subkey, dest, sour);
}
void TripDESencrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
DESencrypt(key,dest,sour);
DESdecrypt(key+8,dest,dest);
DESencrypt(key,dest,dest);
}
void TripDESdecrypt(BYTE *key,BYTE *dest,BYTE *sour)
{
DESdecrypt(key,dest,sour);
DESencrypt(key+8,dest,dest);
DESdecrypt(key,dest,dest);
}
void main(void)
{
char key[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
// char key2[16]={0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7};
// char key3[8]={0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};
char sour[8] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
char dest[8];//={0xA2,0xD9,0x39,0x16,0x5D,0x26,0xA4,0xCA};
DESencrypt(key,dest,sour);
while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -