📄 des.cpp
字号:
0?0000008L, 0?0020208L, 0?0020200L, 0?8000008L,
0?8020000L, 0?8000208L, 0?0000208L, 0?8020000L,
0?0020208L, 0?0000008L, 0?8020008L, 0?0020200L };
static unsigned long SP4[64] = {
0?0802001L, 0?0002081L, 0?0002081L, 0?0000080L,
0?0802080L, 0?0800081L, 0?0800001L, 0?0002001L,
0?0000000L, 0?0802000L, 0?0802000L, 0?0802081L,
0?0000081L, 0?0000000L, 0?0800080L, 0?0800001L,
0?0000001L, 0?0002000L, 0?0800000L, 0?0802001L,
0?0000080L, 0?0800000L, 0?0002001L, 0?0002080L,
0?0800081L, 0?0000001L, 0?0002080L, 0?0800080L,
0?0002000L, 0?0802080L, 0?0802081L, 0?0000081L,
0?0800080L, 0?0800001L, 0?0802000L, 0?0802081L,
0?0000081L, 0?0000000L, 0?0000000L, 0?0802000L,
0?0002080L, 0?0800080L, 0?0800081L, 0?0000001L,
0?0802001L, 0?0002081L, 0?0002081L, 0?0000080L,
0?0802081L, 0?0000081L, 0?0000001L, 0?0002000L,
0?0800001L, 0?0002001L, 0?0802080L, 0?0800081L,
0?0002001L, 0?0002080L, 0?0800000L, 0?0802001L,
0?0000080L, 0?0800000L, 0?0002000L, 0?0802080L };
static unsigned long SP5[64] = {
0?0000100L, 0?2080100L, 0?2080000L, 0x42000100L,
0?0080000L, 0?0000100L, 0x40000000L, 0?2080000L,
0x40080100L, 0?0080000L, 0?2000100L, 0x40080100L,
0x42000100L, 0x42080000L, 0?0080100L, 0x40000000L,
0?2000000L, 0x40080000L, 0x40080000L, 0?0000000L,
0x40000100L, 0x42080100L, 0x42080100L, 0?2000100L,
0x42080000L, 0x40000100L, 0?0000000L, 0x42000000L,
0?2080100L, 0?2000000L, 0x42000000L, 0?0080100L,
0?0080000L, 0x42000100L, 0?0000100L, 0?2000000L,
0x40000000L, 0?2080000L, 0x42000100L, 0x40080100L,
0?2000100L, 0x40000000L, 0x42080000L, 0?2080100L,
0x40080100L, 0?0000100L, 0?2000000L, 0x42080000L,
0x42080100L, 0?0080100L, 0x42000000L, 0x42080100L,
0?2080000L, 0?0000000L, 0x40080000L, 0x42000000L,
0?0080100L, 0?2000100L, 0x40000100L, 0?0080000L,
0?0000000L, 0x40080000L, 0?2080100L, 0x40000100L };
static unsigned long SP6[64] = {
0x20000010L, 0x20400000L, 0?0004000L, 0x20404010L,
0x20400000L, 0?0000010L, 0x20404010L, 0?0400000L,
0x20004000L, 0?0404010L, 0?0400000L, 0x20000010L,
0?0400010L, 0x20004000L, 0x20000000L, 0?0004010L,
0?0000000L, 0?0400010L, 0x20004010L, 0?0004000L,
0?0404000L, 0x20004010L, 0?0000010L, 0x20400010L,
0x20400010L, 0?0000000L, 0?0404010L, 0x20404000L,
0?0004010L, 0?0404000L, 0x20404000L, 0x20000000L,
0x20004000L, 0?0000010L, 0x20400010L, 0?0404000L,
0x20404010L, 0?0400000L, 0?0004010L, 0x20000010L,
0?0400000L, 0x20004000L, 0x20000000L, 0?0004010L,
0x20000010L, 0x20404010L, 0?0404000L, 0x20400000L,
0?0404010L, 0x20404000L, 0?0000000L, 0x20400010L,
0?0000010L, 0?0004000L, 0x20400000L, 0?0404010L,
0?0004000L, 0?0400010L, 0x20004010L, 0?0000000L,
0x20404000L, 0x20000000L, 0?0400010L, 0x20004010L };
static unsigned long SP7[64] = {
0?0200000L, 0?4200002L, 0?4000802L, 0?0000000L,
0?0000800L, 0?4000802L, 0?0200802L, 0?4200800L,
0?4200802L, 0?0200000L, 0?0000000L, 0?4000002L,
0?0000002L, 0?4000000L, 0?4200002L, 0?0000802L,
0?4000800L, 0?0200802L, 0?0200002L, 0?4000800L,
0?4000002L, 0?4200000L, 0?4200800L, 0?0200002L,
0?4200000L, 0?0000800L, 0?0000802L, 0?4200802L,
0?0200800L, 0?0000002L, 0?4000000L, 0?0200800L,
0?4000000L, 0?0200800L, 0?0200000L, 0?4000802L,
0?4000802L, 0?4200002L, 0?4200002L, 0?0000002L,
0?0200002L, 0?4000000L, 0?4000800L, 0?0200000L,
0?4200800L, 0?0000802L, 0?0200802L, 0?4200800L,
0?0000802L, 0?4000002L, 0?4200802L, 0?4200000L,
0?0200800L, 0?0000000L, 0?0000002L, 0?4200802L,
0?0000000L, 0?0200802L, 0?4200000L, 0?0000800L,
0?4000002L, 0?4000800L, 0?0000800L, 0?0200002L };
static unsigned long SP8[64] = {
0x10001040L, 0?0001000L, 0?0040000L, 0x10041040L,
0x10000000L, 0x10001040L, 0?0000040L, 0x10000000L,
0?0040040L, 0x10040000L, 0x10041040L, 0?0041000L,
0x10041000L, 0?0041040L, 0?0001000L, 0?0000040L,
0x10040000L, 0x10000040L, 0x10001000L, 0?0001040L,
0?0041000L, 0?0040040L, 0x10040040L, 0x10041000L,
0?0001040L, 0?0000000L, 0?0000000L, 0x10040040L,
0x10000040L, 0x10001000L, 0?0041040L, 0?0040000L,
0?0041040L, 0?0040000L, 0x10041000L, 0?0001000L,
0?0000040L, 0x10040040L, 0?0001000L, 0?0041040L,
0x10001000L, 0?0000040L, 0x10000040L, 0x10040000L,
0x10040040L, 0x10000000L, 0?0040000L, 0x10001040L,
0?0000000L, 0x10041040L, 0?0040040L, 0x10000040L,
0x10040000L, 0x10001000L, 0x10001040L, 0?0000000L,
0x10041040L, 0?0041000L, 0?0041000L, 0?0001040L,
0?0001040L, 0?0040040L, 0x10000000L, 0x10041000L };
static void desfunc(block, keys)
register unsigned long *block, *keys;
{
register unsigned long fval, work, right, leftt;
register int round;
leftt = block[0];
right = block[1];
work = ((leftt >> 4) ^ right) & 0?f0f0f0fL;
right ^= work;
leftt ^= (work << 4);
work = ((leftt >> 16) ^ right) & 0?000ffffL;
right ^= work;
leftt ^= (work << 16);
work = ((right >> 2) ^ leftt) & 0x33333333L;
leftt ^= work;
right ^= (work << 2);
work = ((right >> 8) ^ leftt) & 0?0ff00ffL;
leftt ^= work;
right ^= (work << 8);
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;
work = (leftt ^ right) & 0xaaaaaaaaL;
leftt ^= work;
right ^= work;
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;
for( round = 0; round < 8; round++ ) {
work = (right << 28) | (right >> 4);
work ^= *keys++;
fval = SP7[ work & 0x3fL];
fval |= SP5[(work >> 8) & 0x3fL];
fval |= SP3[(work >> 16) & 0x3fL];
fval |= SP1[(work >> 24) & 0x3fL];
work = right ^ *keys++;
fval |= SP8[ work & 0x3fL];
fval |= SP6[(work >> 8) & 0x3fL];
fval |= SP4[(work >> 16) & 0x3fL];
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) & 0?0ff00ffL;
right ^= work;
leftt ^= (work << 8);
work = ((leftt >> 2) ^ right) & 0x33333333L;
right ^= work;
leftt ^= (work << 2);
work = ((right >> 16) ^ leftt) & 0?000ffffL;
leftt ^= work;
right ^= (work << 16);
work = ((right >> 4) ^ leftt) & 0?f0f0f0fL;
leftt ^= work;
right ^= (work << 4);
*block++ = right;
*block = leftt;
return;
}
/* Validation sets:
*
* Single-length key, single-length plaintext -
* Key : 0123 4567 89ab cdef
* Plain : 0123 4567 89ab cde7
* Cipher : c957 4425 6a5e d31d
*
**********************************************************************/
void des_key(des_ctx *dc, unsigned char *key){
deskey(key,EN0);
cpkey(dc->ek);
deskey(key,DE1);
cpkey(dc->dk);
}
/* Encrypt several blocks in ECB mode. Caller is responsible for
short blocks. */
void des_enc(des_ctx *dc, unsigned char *data, int blocks){
unsigned long work[2];
int i;
unsigned char *cp;
cp = data;
for(i=0;iek);
unscrun(work,cp);
cp+=8;
}
}
void des_dec(des_ctx *dc, unsigned char *data, int blocks){
unsigned long work[2];
int i;
unsigned char *cp;
cp = data;
for(i=0;idk);
unscrun(work,cp);
cp+=8;
}
}
void main(void){
des_ctx dc;
int i;
unsigned long data[10];
char *cp,key[8] = {0?1,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
char x[8] = {0?1,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7};
cp = x;
des_key(&dc,key);
des_enc(&dc,cp,1);
printf("Enc(0..7,0..7) = ");
for(i=0;i<8;i++) printf("%02x ", ((unsigned int) cp[i])&0?0ff);
printf("\n");
des_dec(&dc,cp,1);
printf("Dec(above,0..7) = ");
for(i=0;i<8;i++) printf("%02x ",((unsigned int)cp[i])&0?0ff);
printf("\n");
cp = (char *) data;
for(i=0;i<10;i++)data[i]=i;
des_enc(&dc,cp,5); /* Enc 5 blocks. */
for(i=0;i<10;i+=2) printf("Block %01d = %08lx %08lx.\n",
i/2,data[i],data[i+1]);
des_dec(&dc,cp,1);
des_dec(&dc,cp+8,4);
for(i=0;i<10;i+=2) printf("Block %01d = %08lx %08lx.\n",
i/2,data[i],data[i+1]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -