📄 cedc.~cpp
字号:
void __fastcall TEDCForm::f(char *right,int num,char *fret)
/* 完成num层的f()函数*/
//char *right, *fret; /* 32 bits */
//int num;
{
register char *kb, *rb, *bb;
char bigright[6];
char result[6];
char preout[4];
kb=kn[num]; /*取出子密钥*/
bb=bigright;
rb=result;
expand(right,bb); /*扩展成48bit*/
*rb++=*bb++^*kb++;
*rb++=*bb++^*kb++; /*Kn与Rn异或操作*/
*rb++=*bb++^*kb++;
*rb++=*bb++^*kb++;
*rb++=*bb++^*kb++;
*rb++=*bb++^*kb++;
contract(result,preout); /*用s盒得到32bit输出*/
perm32(preout,fret); /*最后换位*/
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::perm32(char *inblock,char *outblock)
/* 单纯换位*/
//char *inblock,*outblock; /* of the f crypto function */
{ register int j;
register char *ib,*ob;
register char *q;
ob=outblock; /* 把输出的块清零*/
*ob++=0; *ob++= 0; *ob++=0; *ob++=0;
ib=inblock;
for(j=0;j<4;j++,ib++) /* 输入的每一字节*/
{
q=p32[j][*ib&0xFF];
ob=outblock; /* 每一输出的字节*/
*ob++|=*q++;
*ob++|=*q++;
*ob++|=*q++;
*ob++|=*q++;
}
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::expand(char *right,char *bigright)
/* 用E变换矩阵完成32--48扩展换位*/
//char *right,*bigright; /* right 32 bit, bigright 48 bit*/
{
register char *bb, *r, r0, r1, r2, r3;
bb=bigright;
r=right; /*右边32位*/
r0=*r++;
r1=*r++;
r2=*r++;
r3=*r++;
*bb++=((r3&0x1)<<7)| /* 32 */
((r0&0xF8)>>1)| /* 1 2 3 4 5 */
((r0&0x18)>>3); /* 4 5 */
*bb++=((r0&0x7)<<5)| /* 6 7 8 */
((r1&0x80)>>3)| /* 9 */
((r0&0x01)<<3)| /* 8 */
((r1&0xE0)>>5); /* 9 10 11 */
*bb++=((r1&0x18)<<3)| /* 12 13 */
((r1&0x1F)<<1)| /* 12 13 14 15 16 */
((r2&0x80)>>7); /* 17 */
*bb++=((r1&0x01)<<7)| /* 16 */
((r2&0xF8)>>1)| /* 17 18 19 20 21 */
((r2&0x18)>>3); /* 20 21 */
*bb++=((r2&0x07)<<5)| /* 22 23 24 */
((r3&0x80)>>3)| /* 25 */
((r2&0x01)<<3)| /* 24 */
((r3&0xE0)>>5); /* 25 26 27 */
*bb++=((r3&0x18)<<3)| /* 28 29 */
((r3&0x1F)<<1)| /* 28 29 30 31 32 */
((r0&0x80)>>7); /* 1 */
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::contract(char *in48,char *out32)
/* 48位经s盒后,输出32位*/
//char *in48,*out32;
{ register char *c;
register char *i;
register int i0, i1, i2, i3, i4, i5;
i=in48; /*入口:8字节*/
i0=*i++;
i1=*i++;
i2=*i++;
i3=*i++; /*0xFFF=1111 1111 1111*/
i4=*i++; /*0xFFF=1111 1111*/
i5=*i++; /*0xFFF=1111*/
c=out32; /*出口:6字节*/
*c++=s[0][0xFFF&((i0<<4)|((i1>>4)&0xF))];
*c++=s[1][0xFFF&((i1<<8)|( i2&0xFF))];
*c++=s[2][0xFFF&((i3<<4)|((i4>>4)&0xF))];
*c++=s[3][0xFFF&((i4<<8)|( i5&0xFF))];
}
//---------------------------------------------------------------------------
int __fastcall TEDCForm::pfile()/* 文件加密处理*/
{
register int m, nsave;
register char *b;
int j;
while((m=fread(buf,1,512,infile))!=0)
{
if((nsave=m)<0) /* 读出错*/
return(-1);
for(b=buf;m>0;m-=8,b+=8)/* 加密解密一个缓冲区的块*/
{
if(encrypting)
{
if(m<8) /* 不够一块---64 bits */
{
for(j=0;j<8-m;j++)
b[m+j]=garbage();/* 填充不够一块的部分*/
nsave+=8-m; /* 把nave凑成8的整数倍*/
}
else
j=0; /* 不足8字节时的缺额数量j=8-m*/
endes(b,b);
}
else /* 解密*/
{
if(m<8)deout(b,1); /* 最后的几个字节*/
else
{
dedes(b,b); /* 解密一个块*/
deout(b,0); /*输出到文件*/
}
}
}
if(encrypting)
if(fwrite(buf,1,nsave,outfile)!=(unsigned)nsave)
return(-1);
} /* 加密解密文件完成*/
if(encrypting) fputc(8-j,outfile); /* 8-j=最后一个块的有效字节数*/
return(0);
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::deout(char *block,char flag)
/* 根据flag标志来决定输出到文件的内容*/
//char *block,flag;/* char*block 64-bit 块, flag=1:处理的块是文件的最后的块
// flag=0:处理的块不是文件的最后的块*/
{ static char last[8];
/*static char last[8] 前一个输入块,静态变量,初始化为零*/
register int i;
if(flag) /* 输出的最后的几个字节*/
{
fwrite(last,1,block[0]&0xFF,outfile);
return; /*block[0]包含内容"8-j*/
}
if(outcount++) /* 以前是否处理过块,即输入的加密文件长度不到8字节*/
fwrite(last,1,8,outfile);
for(i=0;i<8;i++)
last[i]=block[i]; /* 复制块*/
}
//---------------------------------------------------------------------------
int __fastcall TEDCForm::garbage()/*产生一些数字用以填充不足8字节的块*/
/*产生数据随机性大一些,加密效果会更好*/
{
return(0);
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::endes(char *inblock,char*outblock)
/* 加密一个64-bit块*/
//char *inblock, *outblock;
{
char iters[17][8];
char swap[8]; /* 放置左右交换的值*/
register int i;
register char *s, *t;
permute(inblock,iperm,iters[0]);/*iters[]:outblock*/
for(i=0;i<16;i++) /* 完成1~16层的交换*/
iter(i,iters[i],iters[i+1]);
/* iters[0][0]~iters[0][8]操作后放到iters[1][0]~iters[1][8]
iters[1][0]~iters[1][8]操作后放到iters[2][0]~iters[2][8]...以此类推*/
s=swap;
t=&iters[16][4];
*s++=*t++;
*s++=*t++;
*s++=*t++;
*s++=*t++;
t=&iters[16][0];
*s++=*t++;
*s++=*t++;
*s++=*t++;
*s++=*t++;
permute(swap,fperm,outblock);
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::dedes(char *inblock,char *outblock)
/* 解密一个64-bit 块*/
//char *inblock,*outblock;
{ char iters[17][8];
char swap[8];
register int i;
register char *s, *t;
permute(inblock,iperm,iters[0]);
for (i=0; i<16; i++)
iter(15-i,iters[i],iters[i+1]);
s=swap;
t=&iters[16][4];
*s++=*t++;
*s++=*t++;
*s++=*t++;
*s++=*t++;
t=&iters[16][0];
*s++=*t++;
*s++=*t++;
*s++=*t++;
*s++=*t++;
permute(swap,fperm,outblock);
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::permute(char *inblock,char perm[16][16][8],
char *outblock) /* 初始换位/最后换位变换*/
//char *inblock, *outblock;
//char perm[16][16][8];
{ register int i,j;
register char *ib, *ob; /*inblock:8字节*/
register char *p, *q; /*outblock:8字节*/
for (i=0,ob=outblock;i<8;i++) /*清空结果数据区*/
*ob++=0;
ib=inblock; /*ib:输入块首地址*/
for(j=0;j<16;j+=2,ib++)
{
ob=outblock;
p=perm[j][(*ib>>4)&0x0F]; /*高四位首地址 perm[][]有8个字节*/
q=perm[j+1][*ib&0x0F]; /*低四位首地址*/
for(i=0;i<8;i++) /*完成一个字节的加密*/
*ob++|=*p++|*q++; /**ob动态对应outblock*/
/*-----------------*(ob++)=(*ob)|(*(p++)|*(q++))-----------------*/
}
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::kinit(char *key)
/* 初始化密钥的变换矩阵的中间过渡矩阵*/
//char *key; /* 64 bits */
{ /*生成16个长为48bit的子密钥*/
register int i,j,L; /*key为输入的初始密钥*/
int m;
for(j=0;j<56;j++)
{
L=pc1[j]-1;
m=L&0x07; /*取出L的后3bit*/
pc1m[j]=(key[L>>3]&bytebit[m])?1:0;
/*key[L>>3]确定第1位在char key[8]中的哪一个字节中,
char pc1m[56]是完成pc-1型换位的变换矩阵*/
}
for(i=0;i<16;i++) /* 共生成16个密钥*/
for(j=0;j<6;j++) /* 密钥kn的每一个字节*/
kn[i][j]=0;
for(i=0;i<16;i++)
{
for(j=0;j<56;j++) /*循环左移*/
{
pcr[j]=pc1m[(L=j+totrot[i])<(j<28?28:56)?L:L-28];
/* pcr[j]是每次进行循环左移位后的pc1m[]矩阵*/
}
for(j=0;j<48;j++)
if(pcr[pc2[j]-1])
{
L=j&0x07;
kn[i][j>>3]|=bytebit[L];
/*共16个密钥i~[0,16],每个密钥6字节j>>3~[0,5]*/
}
}
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::p32init() /* 初始化32bit换位表的中间过渡矩阵*/
{
register int L,j,k;
int i,m;
for(i=0;i<4;i++)/* 以字节为单位输入,i为字节在输入矩阵中的位置*/
for(j=0;j<256;j++) /* j为所输入字节的可能值[0~256]*/
for(k=0;k<4;k++)
p32[i][j][k]=0;
for(i=0;i<4;i++)
for(j=0;j<256;j++)
for(k=0;k<32;k++)
{
L=p32i[k]-1;
if((L>>3)!=i)
continue;
if(!(j&bytebit[L&07]))
continue;
m=k&07;
p32[i][j][k>>3]|=bytebit[m];
}
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::Edit1Change(TObject *Sender)
{
BitBtn1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::BitBtn2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::Edit1DblClick(TObject *Sender)
{
if(OpenDialog1->Execute())
Edit1->Text=OpenDialog1->FileName;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -