📄 d3des.c
字号:
right = (right << 31) | (right >> 1); work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = (leftt << 31) | (leftt >> 1); work = ((leftt >> 8) ^ right) & 0x00ff00ffL; right ^= work; leftt ^= (work << 8); work = ((leftt >> 2) ^ right) & 0x33333333L; right ^= work; leftt ^= (work << 2); work = ((right >> 16) ^ leftt) & 0x0000ffffL; leftt ^= work; right ^= (work << 16); work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL; leftt ^= work; right ^= (work << 4); *block++ = right; *block = leftt; return; }#ifdef D2_DESvoid des2key(hexkey, mode) /* stomps on Kn3 too */unsigned char *hexkey; /* unsigned char[16] */short mode;{ short revmod; revmod = (mode == EN0) ? DE1 : EN0; deskey(&hexkey[8], revmod); cpkey(KnR); deskey(hexkey, mode); cpkey(Kn3); /* Kn3 = KnL */ return; } void Ddes(from, into)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 des3_encrypt(inblock, outblock)unsigned char *inblock, *outblock;{ unsigned long work[2]; unsigned char key1[8],key2[8],key3[8]; unsigned char temp1[8],temp2[8]; unsigned char tempout[17]; memset(key1,'\0',sizeof(key1)); memset(key2,'\0',sizeof(key2)); memset(key3,'\0',sizeof(key3)); memcpy(key1,Df_Key,8); memcpy(key2,&Df_Key[8],8); memcpy(key3,&Df_Key[16],8); deskey(key1,EN0); scrunch(inblock, work); desfunc(work, KnL); unscrun(work, temp1); deskey(key2,DE1); scrunch(temp1, work); desfunc(work, KnL); unscrun(work, temp2); deskey(key3,EN0); scrunch(temp2, work); desfunc(work, KnL); unscrun(work, tempout); xpasswd((char *)tempout,outblock); return;}void des3_decrypt(inblock, outblock)unsigned char *inblock, *outblock;{ unsigned long work[2]; unsigned char key1[8],key2[8],key3[8]; unsigned char temp1[8],temp2[8]; unsigned char tempin[16]; memset(key1,'\0',sizeof(key1)); memset(key2,'\0',sizeof(key2)); memset(key3,'\0',sizeof(key3)); memcpy(key1,Df_Key,8); memcpy(key2,&Df_Key[8],8); memcpy(key3,&Df_Key[16],8); xpasswd((char *)inblock,tempin); deskey(key3,DE1); scrunch(tempin, work); desfunc(work, KnL); unscrun(work, temp1); deskey(key2,EN0); scrunch(temp1, work); desfunc(work, KnL); unscrun(work, temp2); deskey(key1,DE1); scrunch(temp2, work); desfunc(work, KnL); unscrun(work, outblock); 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,mode)register char *aptr; /* NULL-terminated */register unsigned char *kptr; /* unsigned char[24] */int mode;{ register unsigned char *store; register int first, i; unsigned long savek[96]; des3key(Df_Key, mode); 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; } D3des((unsigned char*)aptr,kptr); 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 **********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -