📄 d3des.c
字号:
unsigned char *from, *into; /* unsigned char[8] */
{
unsigned long work[2];
scrunch(from, work);
desfunc(work, KnL);
desfunc(work, KnR);
desfunc(work, Kn3);
unscrun(work, into);
return;
}
void D2des(from, into)
unsigned char *from; /* unsigned char[16] */
unsigned char *into; /* unsigned char[16] */
{
unsigned long *right, *l1, swap;
unsigned long leftt[2], bufR[2];
right = bufR;
l1 = &leftt[1];
scrunch(from, leftt);
scrunch(&from[8], right);
desfunc(leftt, KnL);
desfunc(right, KnL);
swap = *l1;
*l1 = *right;
*right = swap;
desfunc(leftt, KnR);
desfunc(right, KnR);
swap = *l1;
*l1 = *right;
*right = swap;
desfunc(leftt, Kn3);
desfunc(right, Kn3);
unscrun(leftt, into);
unscrun(right, &into[8]);
return;
}
void makekey(aptr, kptr)
register char *aptr; /* NULL-terminated */
register unsigned char *kptr; /* unsigned char[8] */
{
register unsigned char *store;
register int first, i;
unsigned long savek[96];
cpDkey(savek);
des2key(Df_Key, EN0);
for( i = 0; i < 8; i++ ) kptr[i] = Df_Key[i];
first = 1;
while( (*aptr != '\0') || first ) {
store = kptr;
for( i = 0; i < 8 && (*aptr != '\0'); i++ ) {
*store++ ^= *aptr & 0x7f;
*aptr++ = '\0';
}
Ddes(kptr, kptr);
first = 0;
}
useDkey(savek);
return;
}
void make2key(aptr, kptr)
register char *aptr; /* NULL-terminated */
register unsigned char *kptr; /* unsigned char[16] */
{
register unsigned char *store;
register int first, i;
unsigned long savek[96];
cpDkey(savek);
des2key(Df_Key, EN0);
for( i = 0; i < 16; i++ ) kptr[i] = Df_Key[i];
first = 1;
while( (*aptr != '\0') || first ) {
store = kptr;
for( i = 0; i < 16 && (*aptr != '\0'); i++ ) {
*store++ ^= *aptr & 0x7f;
*aptr++ = '\0';
}
D2des(kptr, kptr);
first = 0;
}
useDkey(savek);
return;
}
#ifndef D3_DES /* D2_DES only */
#ifdef D2_DES /* iff D2_DES! */
void cp2key(into)
register unsigned long *into; /* unsigned long[64] */
{
register unsigned long *from, *endp;
cpkey(into);
into = &into[32];
from = KnR, endp = &KnR[32];
while( from < endp ) *into++ = *from++;
return;
}
void use2key(from) /* stomps on Kn3 too */
register unsigned long *from; /* unsigned long[64] */
{
register unsigned long *to, *endp;
usekey(from);
from = &from[32];
to = KnR, endp = &KnR[32];
while( to < endp ) *to++ = *from++;
cpkey(Kn3); /* Kn3 = KnL */
return;
}
#endif /* iff D2_DES */
#else /* D3_DES too */
static void D3des(unsigned char *, unsigned char *);
void des3key(hexkey, mode)
unsigned char *hexkey; /* unsigned char[24] */
short mode;
{
unsigned char *first, *third;
short revmod;
if( mode == EN0 ) {
revmod = DE1;
first = hexkey;
third = &hexkey[16];
}
else {
revmod = EN0;
first = &hexkey[16];
third = hexkey;
}
deskey(&hexkey[8], revmod);
cpkey(KnR);
deskey(third, mode);
cpkey(Kn3);
deskey(first, mode);
return;
}
void cp3key(into)
register unsigned long *into; /* unsigned long[96] */
{
register unsigned long *from, *endp;
cpkey(into);
into = &into[32];
from = KnR, endp = &KnR[32];
while( from < endp ) *into++ = *from++;
from = Kn3, endp = &Kn3[32];
while( from < endp ) *into++ = *from++;
return;
}
void use3key(from)
register unsigned long *from; /* unsigned long[96] */
{
register unsigned long *to, *endp;
usekey(from);
from = &from[32];
to = KnR, endp = &KnR[32];
while( to < endp ) *to++ = *from++;
to = Kn3, endp = &Kn3[32];
while( to < endp ) *to++ = *from++;
return;
}
static void D3des(from, into) /* amateur theatrics */
unsigned char *from; /* unsigned char[24] */
unsigned char *into; /* unsigned char[24] */
{
unsigned long swap, leftt[2], middl[2], right[2];
scrunch(from, leftt);
scrunch(&from[8], middl);
scrunch(&from[16], right);
desfunc(leftt, KnL);
desfunc(middl, KnL);
desfunc(right, KnL);
swap = leftt[1];
leftt[1] = middl[0];
middl[0] = swap;
swap = middl[1];
middl[1] = right[0];
right[0] = swap;
desfunc(leftt, KnR);
desfunc(middl, KnR);
desfunc(right, KnR);
swap = leftt[1];
leftt[1] = middl[0];
middl[0] = swap;
swap = middl[1];
middl[1] = right[0];
right[0] = swap;
desfunc(leftt, Kn3);
desfunc(middl, Kn3);
desfunc(right, Kn3);
unscrun(leftt, into);
unscrun(middl, &into[8]);
unscrun(right, &into[16]);
return;
}
void make3key(aptr, kptr)
register char *aptr; /* NULL-terminated */
register unsigned char *kptr; /* unsigned char[24] */
{
register unsigned char *store;
register int first, i;
unsigned long savek[96];
cp3key(savek);
des3key(Df_Key, EN0);
for( i = 0; i < 24; i++ ) kptr[i] = Df_Key[i];
first = 1;
while( (*aptr != '\0') || first ) {
store = kptr;
for( i = 0; i < 24 && (*aptr != '\0'); i++ ) {
*store++ ^= *aptr & 0x7f;
*aptr++ = '\0';
}
D3des(kptr, kptr);
first = 0;
}
use3key(savek);
return;
}
#endif /* D3_DES */
#endif /* D2_DES */
/* Validation sets:
*
* Single-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef
* Plain : 0123 4567 89ab cde7
* Cipher : c957 4425 6a5e d31d
*
* Double-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
* Plain : 0123 4567 89ab cde7
* Cipher : 7f1d 0a77 826b 8aff
*
* Double-length key, double-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
* Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
*
* Triple-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
* Plain : 0123 4567 89ab cde7
* Cipher : de0b 7c06 ae5e 0ed5
*
* Triple-length key, double-length plaintext -
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
* Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
*
* d3des V5.0a rwo 9208.07 18:44 Graven Imagery
**********************************************************************/
void my_deskey(keyin,keyout,edf)
unsigned char *keyin;
unsigned long *keyout;//keyout是32字节unsigned long *
short edf;/////////////8字节key,输出也是8字节
{
register int i, j, l, m, n;
unsigned char pc1m[56], pcr[56];
unsigned long kn[32];
for ( j = 0; j < 56; j++ ) {
l = pc1[j];
m = l & 07;
pc1m[j] = (keyin[l >> 3] & bytebit[m]) ? 1 : 0;
//此处把key变为keyin
}
for( i = 0; i < 16; i++ ) {
if( edf == DE1 ) m = (15 - i) << 1;
else m = i << 1;
n = m + 1;
kn[m] = kn[n] = 0L;
for( j = 0; j < 28; j++ ) {
l = j + totrot[i];
if( l < 28 ) pcr[j] = pc1m[l];
else pcr[j] = pc1m[l - 28];
}
for( j = 28; j < 56; j++ ) {
l = j + totrot[i];
if( l < 56 ) pcr[j] = pc1m[l];
else pcr[j] = pc1m[l - 28];
}
for( j = 0; j < 24; j++ ) {
if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
}
}
my_cookey(kn,keyout);
return;
}
void my_des2key(hexkey,my_KnR,my_Kn3,mode)
unsigned char *hexkey; /* unsigned char[16] */
unsigned long *my_KnR; /* unsigned char[32] */
unsigned long *my_Kn3; /* unsigned char[32] */
short mode;/* hexkey[16] MODE*/
{
short revmod;
revmod = (mode == EN0) ? DE1 : EN0;
my_deskey(&hexkey[8],my_KnR, revmod);
// cpkey(KnR);
my_deskey(hexkey, my_Kn3,mode);
// cpkey(Kn3); /* Kn3 = KnL */
return;
}
void my_des(inblock, outblock,my_key,edf)
unsigned char *inblock, *outblock;//8byte
unsigned char *my_key;//8byte
short edf;//from[8] to[8] 8字节的key
{
unsigned long keyout[32]={0L};
unsigned long work[2];
my_deskey(my_key,keyout,edf);
scrunch(inblock, work);
desfunc(work, keyout);//把KnL改为了keyout
unscrun(work, outblock);
return;
}
void my_Ddes(from, into,my_key,edf)
unsigned char *from, *into;//8byte
unsigned char *my_key;//16字节
short edf;
///* from[8] to[8] 16字节的key
{
unsigned long my_KnR[32]={0L};
unsigned long my_Kn3[32]={0L};
unsigned long work[2];
my_des2key(my_key,my_KnR,my_Kn3, edf);
scrunch(from, work);
desfunc(work, my_Kn3);//我认为此时KnL==Kn3
desfunc(work, my_KnR);
desfunc(work, my_Kn3);
unscrun(work, into);
return;
}
void my_D2des(from, into,my_key,edf)
unsigned char *from, *into;//16byte
unsigned char *my_key;//16字节
short edf;
///* from[16] to[16]
{
unsigned long *right, *l1, swap;
unsigned long leftt[2], bufR[2];
unsigned long my_KnR[32]={0L};
unsigned long my_Kn3[32]={0L};
my_des2key(my_key,my_KnR,my_Kn3,edf);
///////////////////d2des/////
//我认为此时KnL==Kn3
right = bufR;
l1 = &leftt[1];
scrunch(from, leftt);
scrunch(&from[8], right);
desfunc(leftt, my_Kn3);//KnL);
desfunc(right, my_Kn3);//KnL);
swap = *l1;
*l1 = *right;
*right = swap;
desfunc(leftt,my_KnR);// KnR);
desfunc(right, my_KnR);//KnR);
swap = *l1;
*l1 = *right;
*right = swap;
desfunc(leftt, my_Kn3);//Kn3);
desfunc(right, my_Kn3);//Kn3);
unscrun(leftt, into);
unscrun(right, &into[8]);
return;
}
///////////////
static void my_cookey(raw1,m_key)
register unsigned long *raw1;
unsigned long *m_key;//32字节unsigned long*
{
register unsigned long *cook, *raw0;
unsigned long dough[32];
register int i;
register unsigned long *to, *endp;
cook = dough;
for( i = 0; i < 16; i++, raw1++ ) {
raw0 = raw1++;
*cook = (*raw0 & 0x00fc0000L) << 6;
*cook |= (*raw0 & 0x00000fc0L) << 10;
*cook |= (*raw1 & 0x00fc0000L) >> 10;
*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
*cook = (*raw0 & 0x0003f000L) << 12;
*cook |= (*raw0 & 0x0000003fL) << 16;
*cook |= (*raw1 & 0x0003f000L) >> 4;
*cook++ |= (*raw1 & 0x0000003fL);
}
///////此处//////////////给输出
cook=dough;
to = m_key, endp = &m_key[32];
while( to < endp ) *to++ = *cook++;
return;
// return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -