信息安全概论中的DES加密解密算法的用C++实现,附上实验报告 下载本文

2.加密过程(同时生成密文文档)

3.解密过程(同时生成明文外部文档)

三、 源代码

#include \

#include \

#include \

#include \

void CDES::deskey(unsigned char key[8], Mode md) { register int ii, 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] = (key[l >> 3] & bytebit[m]) ? 1:0; }

for (ii = 0; ii < 16; ii++) { if (md == DECRYPT) m = (15 - ii) << 1; else m = ii << 1; n = m + 1; kn[m] = kn[n] = 0L;

for (j = 0; j < 28; j++) { l = j + totrot[ii]; }

if (l < 28) pcr[j] = pc1m[l]; else pcr[j] = pc1m[l - 28];

for (j = 28; j < 56; j++) { l = j + totrot[ii]; 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]; } }

cookey(kn);

return; }

void CDES::cookey(register unsigned long *raw1) { register unsigned long *cook, *raw0; unsigned long dough[32]; register int i; 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); }

usekey(dough); return; }

void CDES::usekey(register unsigned long *from) {

register unsigned long *to, *endp;

to = KnL, endp = &KnL[32]; while (to < endp) {

*to++ = *from++; } return; }

void CDES::scrunch(register unsigned char *outof, register unsigned long *into ) { *into = (*outof++ & 0xffL) << 24; *into |= (*outof++ & 0xffL) << 16; *into |= (*outof++ & 0xffL) << 8; *into++ |= (*outof++ & 0xffL); *into = (*outof++ & 0xffL) << 24; *into |= (*outof++ & 0xffL) << 16; *into |= (*outof++ & 0xffL) << 8; *into |= (*outof & 0xffL); return; }

void CDES::unscrun(register unsigned long *outof, register unsigned char *into) { *into++ = (*outof >> 24) & 0xffL; *into++ = (*outof >> 16) & 0xffL; *into++ = (*outof >> 8) & 0xffL; *into++ = *outof++ & 0xffL; *into++ = (*outof >> 24) & 0xffL; *into++ = (*outof >> 16) & 0xffL; *into++ = (*outof >> 8) & 0xffL; *into = *outof & 0xffL; return; }

void CDES::desfunc(register unsigned long *block, register unsigned long *keys) { register unsigned long fval, work, right, leftt; register int round; leftt = block[0]; right = block[1]; work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; right ^= work; leftt ^= (work << 4); work = ((leftt >> 16) ^ right) & 0x0000ffffL;