?? 復(fù)件 desencrypt.cpp
字號:
// DesEncrypt.cpp --- implementation of the DesEncrypt
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DesEncrypt.h"
// Buffer的加密密鑰
#define XSTR_KEY "key_words"
// 全局矩陣變量
const int lpIP[64] =
{
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7,
56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6
};
const int lpIB[64] =
{
39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25, 32, 0, 40, 8, 48, 16, 56, 24
};
const int lpKP[56] =
{
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3
};
const int lpKB[48] =
{
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31
};
const int lpEP[48] =
{
31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8,
7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16,
15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24,
23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0
};
const int lpSP[8][64] =
{
// S1
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
// S2
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
// S3
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
// S4
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
// S5
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
// S6
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
// S7
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
// S8
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
};
const int lpPP[32] =
{
15, 6, 19, 20, 28, 11, 27, 16, 0, 14, 22, 25, 4, 17, 30, 9,
1, 7, 23, 13, 31, 26, 2, 8, 18, 12, 29, 5, 21, 10, 3, 24
};
//////////////////////////////////////////////////////////////////
// 字符的擴充與收縮
void ExpandSegment(char lpByte[8], char lpBit[64]);
void ShrinkSegment(char lpBit[64], char lpByte[8]);
// 將Key循環(huán)移位nBit位
void LeftShiftKey(char lpKey[64], int nBit);
void RightShiftKey(char lpKey[64], int nBit);
//////////////////////////////////////////////////////////////////
void ExpandSegment(char lpByte[8], char lpBit[64])
{
const unsigned char lpBase[8] = { 0x80, 0x40,
0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
int i, j, nIdx = 0;
for(i = 0; i < 8; i ++)
{
for(j = 0; j < 8; j ++)
{
if(lpByte[i] & lpBase[j])
lpBit[nIdx] = 0x01;
else
lpBit[nIdx] = 0x00;
nIdx ++;
}
}
}
void ShrinkSegment(char lpBit[64], char lpByte[8])
{
const unsigned char lpBase[8] = { 0x80, 0x40,
0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
int i, j, nIdx = 0;
for(i = 0; i < 8; i ++)
{
lpByte[i] = 0x00;
for(j = 0; j < 8; j ++)
{
if( lpBit[nIdx] )
lpByte[i] = lpByte[i] | lpBase[j];
nIdx ++;
}
}
}
// 將56位Key分兩部分循環(huán)移位nBit位
void LeftShiftKey(char lpKey[64], int nBit)
{
int i;
// 保存頭部的nBit個
for(i = 0; i < nBit; i ++)
lpKey[i + 56] = lpKey[i];
// 開始移nBit位
for(i = nBit; i < 56; i ++)
lpKey[i - nBit] = lpKey[i];
// RKey 的尾部
for(i = 0; i < nBit; i ++)
lpKey[56 - nBit + i] = lpKey[28 - nBit + i];
// LKey 的尾部
for(i = 0; i < nBit; i ++)
lpKey[28 - nBit + i] = lpKey[i + 56];
}
void RightShiftKey(char lpKey[64], int nBit)
{
int i;
// 開始移nBit位
for(i = 0; i < 56; i ++)
lpKey[55 - i + nBit] = lpKey[55 - i];
// LKey 的頭部
for(i = 0; i < nBit; i ++)
lpKey[i] = lpKey[i + 28];
// RKey 的頭部
for(i = 0; i < nBit; i ++)
lpKey[i + 28] = lpKey[i + 56];
}
//////////////////////////////////
// Des加密方法的實現(xiàn) //
//////////////////////////////////
// S 盒變換
void SBoxConvert(char lpSrc[48], char lpDest[32])
{
char nTemp;
int i, k, nIdx = 0, nOff = 0;
for(i = 0; i < 8; i ++)
{
k = (lpSrc[nOff] << 1) + lpSrc[nOff + 5];
k = (k << 4) + lpSrc[nOff + 4];
k = k + (lpSrc[nOff + 3] << 1);
k = k + (lpSrc[nOff + 2] << 2);
k = k + (lpSrc[nOff + 1] << 3);
nTemp = lpSP[i][k];
lpDest[nIdx + 1] = (nTemp >> 2) & 0x01;
lpDest[nIdx + 2] = (nTemp >> 1) & 0x01;
lpDest[nIdx] = (nTemp >> 3) & 0x01;
lpDest[nIdx + 3] = nTemp & 0x01;
nIdx += 4; nOff += 6;
}
}
// 用 Des方法來加密8個字節(jié)的數(shù)據(jù)
void Des_Encrypt(char lpSrc[8], char lpDest[8], char lpKey[8])
{
const int lpMove[16] = { 1, 1, 2, 2, 2,
2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
int i, k, nIdx;
char lpLBit[64], lpKBit[64];
char lpSave[64], lpTemp[64];
char nTemp, *lpRBit = lpLBit + 32;
// 擴展加密段
ExpandSegment(lpSrc, lpTemp);
for(i = 0; i < 64; i ++)
{
nIdx = lpIP[i];
lpLBit[i] = lpTemp[nIdx];
}
// 擴展密鑰
ExpandSegment(lpKey, lpTemp);
for(i = 0; i < 56; i ++)
{
nIdx = lpKP[i];
lpKBit[i] = lpTemp[nIdx];
}
// 開始16次循環(huán)過程
for(k = 0; k < 16; k ++)
{
// 密鑰移位
LeftShiftKey(lpKBit, lpMove[k]);
// 壓縮Key + E變換 + 求異或
for(i = 0; i < 48; i ++)
{
nIdx = lpKB[i];
nTemp = lpKBit[nIdx];
nIdx = lpEP[i];
lpSave[i] = nTemp ^ lpRBit[nIdx];
}
// S盒變換
SBoxConvert(lpSave, lpTemp);
// 保存 RBit
memcpy(lpSave, lpRBit, 32);
// P變換 + 求異或
for(i = 0; i < 32; i ++)
{
nIdx = lpPP[i];
nTemp = lpTemp[nIdx];
lpRBit[i] = nTemp ^ lpLBit[i];
}
// RBit 換到 LBit中
memcpy(lpLBit, lpSave, 32);
}
// RBit 和 LBit 合并
memcpy(lpTemp, lpRBit, 32);
memcpy(lpTemp + 32, lpLBit, 32);
// IP-1 變換
for(i = 0; i < 64; i ++)
{
nIdx = lpIB[i];
lpSave[i] = lpTemp[nIdx];
}
// 將結(jié)果輸出
ShrinkSegment(lpSave, lpDest);
}
// 用 Des方法來解密8個字節(jié)的數(shù)據(jù)
void Des_Decrypt(char lpSrc[8], char lpDest[8], char lpKey[8])
{
const int lpMove[16] = { 1, 1, 2, 2, 2,
2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
int i, k, nIdx;
char lpLBit[64], lpKBit[64];
char lpSave[64], lpTemp[64];
char nTemp, *lpRBit = lpLBit + 32;
// 擴展加密段
ExpandSegment(lpSrc, lpTemp);
for(i = 0; i < 64; i ++)
{
nIdx = lpIP[i];
lpLBit[i] = lpTemp[nIdx];
}
// 擴展密鑰
ExpandSegment(lpKey, lpTemp);
for(i = 0; i < 56; i ++)
{
nIdx = lpKP[i];
lpKBit[i] = lpTemp[nIdx];
}
// 開始16次循環(huán)過程
for(k = 0; k < 16; k ++)
{
// 壓縮Key + E變換 + 求異或
for(i = 0; i < 48; i ++)
{
nIdx = lpKB[i];
nTemp = lpKBit[nIdx];
nIdx = lpEP[i];
lpSave[i] = nTemp ^ lpRBit[nIdx];
}
// S盒變換
SBoxConvert(lpSave, lpTemp);
// 保存 RBit
memcpy(lpSave, lpRBit, 32);
// P變換 + 求異或
for(i = 0; i < 32; i ++)
{
nIdx = lpPP[i];
nTemp = lpTemp[nIdx];
lpRBit[i] = nTemp ^ lpLBit[i];
}
// RBit 換到 LBit中
memcpy(lpLBit, lpSave, 32);
// 密鑰移位
RightShiftKey(lpKBit, lpMove[15 - k]);
}
// RBit 和 LBit 合并
memcpy(lpTemp, lpRBit, 32);
memcpy(lpTemp + 32, lpLBit, 32);
// IP-1 變換
for(i = 0; i < 64; i ++)
{
nIdx = lpIB[i];
lpSave[i] = lpTemp[nIdx];
}
// 將結(jié)果輸出
ShrinkSegment(lpSave, lpDest);
}
// 加解密一個緩沖區(qū)
TCP_API void EncryptBuffer(char * lpSrc, char * lpDest, long nSize)
{
for(long i = 0; i < nSize; i += 8)
Des_Encrypt(lpSrc + i, lpDest + i, XSTR_KEY);
}
TCP_API void DecryptBuffer(char * lpSrc, char * lpDest, long nSize)
{
for(long i = 0; i < nSize; i += 8)
Des_Decrypt(lpSrc + i, lpDest + i, XSTR_KEY);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -