📄 _des.cpp
字号:
fval |= SP2[(work >> 24) & 0x3fL];
leftt ^= fval;
work = (leftt << 28) | (leftt >> 4);
work ^= *keys++;
fval = SP7[ work & 0x3fL];
fval |= SP5[(work >> 8) & 0x3fL];
fval |= SP3[(work >> 16) & 0x3fL];
fval |= SP1[(work >> 24) & 0x3fL];
work = leftt ^ *keys++;
fval |= SP8[ work & 0x3fL];
fval |= SP6[(work >> 8) & 0x3fL];
fval |= SP4[(work >> 16) & 0x3fL];
fval |= SP2[(work >> 24) & 0x3fL];
right ^= fval;
}
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;
}
void DES::DES2Key(unsigned char * hexkey, short mode) //根据加或解密标志处理16位密钥
{
//TODO: Add your source code here
short revmod;
revmod = (mode == EN0) ? DE1 : EN0; //判断标志
DESKey(&hexkey[8], revmod); //调用DESKey处理高8位
Cpkey(KnR);
DESKey(hexkey, mode); //处理低8位
Cpkey(Kn3); /* Kn3 = KnL */
return;
}
void DES::Cpkey(register unsigned long * into) //拷贝处理过的密钥到寄存器内
{
//TODO: Add your source code here
register unsigned long *from, *endp;
from = KnL, endp = &KnL[32];
while( from < endp ) *into++ = *from++;
return;
}
void DES::DDes(unsigned char * from, unsigned char * into) //用16位密钥处理8位信息
{
//TODO: Add your source code here
unsigned long work[2];
Scrunch(from, work);
DESfunc(work, KnL);
DESfunc(work, KnR);
DESfunc(work, Kn3);
Unscrun(work, into);
return;
}
void DES::D2Des(unsigned char * from, unsigned char * into) //用16位密钥处理16位信息
{
//TODO: Add your source code here
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 DES::MakeKey(register char * aptr, register unsigned char * kptr) //根据密码生成密钥
{
//TODO: Add your source code here
register unsigned char *store;
register int first, i;
unsigned long savek[96];
Cp2Key(savek); //拷贝16位的密钥
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;
}
Use2Key(savek); //将处理好的密码存入寄存器
return;
}
void DES::Cp2Key(register unsigned long * into) //处理16位的密钥
{
//TODO: Add your source code here
register unsigned long *from, *endp;
Cpkey(into); //拷贝高位密钥
into = &into[32];
from = KnR, endp = &KnR[32];
while( from < endp ) *into++ = *from++; //将剩余部分拷入KnR
return;
}
void DES::Use2Key(register unsigned long * from) //拷贝处理过的16位密钥入寄存器
{
//TODO: Add your source code here
register unsigned long *to, *endp;
UseKey(from);
from = &from[32]; //拷贝高位入KnR
to = KnR, endp = &KnR[32];
while( to < endp ) *to++ = *from++; //处理低位
Cpkey(Kn3); //低位入Kn3 /* Kn3 = KnL */
return;
}
void DES::Make2Key(register char * aptr, register unsigned char * kptr) //根据密码生成16位密钥
{
//TODO: Add your source code here
register unsigned char *store;
register int first, i;
unsigned long savek[96];
Cp2Key(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;
}
Use2Key(savek);
return;
}
void DES::DES3Key(unsigned char * hexkey, short mode) //处理24位密钥
{
//TODO: Add your source code here
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 DES::D3_1Des(unsigned char * from, unsigned char * into) //根据24位密钥处理8位信息
{
//TODO: Add your source code here
unsigned long work[2];
Scrunch(from, work);
DESfunc(work, KnL);
DESfunc(work, KnR);
DESfunc(work, Kn3);
Unscrun(work, into);
return;
}
void DES::D3_2Des(unsigned char * from, unsigned char * into) //根据24位密钥处理16位信息
{
//TODO: Add your source code here
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 DES::D3_3Des(unsigned char * from, unsigned char * into) //根据24位密钥处理24位信息
{
//TODO: Add your source code here
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 DES::Make3Key(register char * aptr, register unsigned char * kptr) //根据密码生成24位密钥
{
//TODO: Add your source code here
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';
}
D3_3Des(kptr, kptr);
first = 0;
}
Use3Key(savek);
return;
}
void DES::Cp3key(register unsigned long * into) //拷贝24位密钥
{
//TODO: Add your source code here
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 DES::Use3Key(register unsigned long * from) //将处理过的24位密钥写入寄存器
{
//TODO: Add your source code here
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -