pepo2000:你要的DES代码来了
牧牛人软件 2003-03-31 06:52:12 //---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
/***************************************
*<des_1.c> des encrypt program *
****************************************/
#include <stdio.h>
static unsigned char C[17][28],D[17][28],K[17][48],c,ch1;
static void expand0(unsigned char *, char *);
static void setkeystar(unsigned char *);
static void encrypt0(unsigned char*, unsigned char *);
static void discrypt0(unsigned char*, unsigned char *);
static void compress0(char* , unsigned char *);
static void compress016(char*,unsigned char*);
static void LS(char*, char*, int);
static void son(char *, char*, char *);
static void ip(unsigned char*, char*, char*);
static void _ip(unsigned char *, char*, char*);
static void F(int, char*, char*, char*, char*);
static void s_box(char*, char*);
static void HEX_2_DSP(char *, char *, int);
static void DSP_2_HEX(char*, char*, int);
void des(char * source, char * dest, char *key,int mode)
/* mode 0:加密 ; mode 1:解密 */
{
int i;
char tmp[64];
expand0(key,tmp);
setkeystar(tmp);
if (mode==0)
encrypt0(source,dest);
else
discrypt0(source,dest);
}
static void encrypt0(text,mtext)
unsigned char *text,*mtext;
{
char ll[64],rr[64],LL[64],RR[64];
char tmp[64];
int i,j;
ip(text,ll,rr);
for(i=1;i<17;i++)
{
F(i,ll,rr,LL,RR);
for (j=0;j<32;j++)
{
ll[j]=LL[j];
rr[j]=RR[j];
}
}
_ip(tmp,rr,ll);
compress0(tmp,mtext);
}
void Do_XOR(dest,source,size)
unsigned char *dest,*source;
int size;
{
int i;
for(i=0;i<size;i++)
dest[i]^=source[i];
}
static void DSP_2_HEX(dsp,hex,count)
char *dsp, *hex;
int count;
{
int i;
for(i=0;i<count;i++)
{
hex[i]=((dsp[i*2]<=0x39)?dsp[i*2]-0x30:dsp[i*2]-0x41+10);
hex[i]=hex[i]<<4;
hex[i]+=((dsp[i*2+1]<=0x39)?dsp[i*2+1]-0x30:dsp[i*2+1]-0x41+10);
}
} /*Defined already in iso.h*/
static void HEX_2_DSP(hex,dsp,count)
char *hex,*dsp;
int count;
{
int i;
char ch;
for (i=0;i<count;i++)
{
ch=(hex[i]&0xf0)>>4;
dsp[i*2]=(ch>9)?ch+0x41-10:ch+0x30;
ch=hex[i]&0xf;
dsp[i*2+1]=(ch>9)?ch+0x41-10:ch+0x30;
}
} /*Defined already in iso.h*/
static void discrypt0(mtext,text)
unsigned char *text,*mtext;
{
char ll[64],rr[64],LL[64],RR[64];
char tmp[64];
int i,j;
ip(mtext,ll,rr);
for(i=16;i>0;i--)
{
F(i,ll,rr,LL,RR);
for (j=0;j<32;j++)
{
ll[j]=LL[j];
rr[j]=RR[j];
}
}
_ip(tmp,rr,ll);
compress0(tmp,text);
}
static void expand0(in,out)
unsigned char *in;
char *out;
{
int divide;
int i,j;
for(i=0;i<8;i++)
{
divide=0x80;
for(j=0;j<8;j++)
{
*out++=(in[i]/divide)&1;
divide/=2;
if(divide==0 && j<7) printf("11***&&");
}
}
}
static void compress0(out,in)
unsigned char *in;
char *out;
{
int times;
int i,j;
for (i=0;i<8;i++)
{
times=0x80;
in[i]=0;
for(j=0;j<8;j++)
{
in[i]+=(*out++)*times;
times/=2;
if(times==0 && j<7) printf("22***&&");
}
}
}
static void compress016(out,in)
unsigned char *in;
char *out;
{
int times;
int i,j;
for (i=0;i<16;i++)
{
times=0x8;
in[i]='0';
for(j=0;j<4;j++)
{
in[i]+=(*out++)*times;
times/=2;
}
}
}
static int pc_1_c[28]={
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};
static int pc_1_d[28]={
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 int pc_2[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 int ls_count[16]={
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
static void setkeystar(bits)
unsigned char bits[64];
{
int i,j;
for (i=0;i<28;i++)
C[0][i]=bits[pc_1_c[i]-1];
for(i=0;i<28;i++)
D[0][i]=bits[pc_1_d[i]-1];
for (j=0;j<16;j++)
{
LS(C[j],C[j+1],ls_count[j]);
LS(D[j],D[j+1],ls_count[j]);
son(C[j+1],D[j+1],K[j+1]);
}
}