////des.h
#pragma once
#include "table.h"
#include <string>
#include <afx.h>
using namespace std;
class DES
{
public:
DES();//char *initialKey,char *data
void SetEncodeValue(char *initialKey,char *data);
void SetDecodeValue(char *initialKey,char *data);
void EncodeData(); //加密
void DecodeData(); //解密
virtual ~DES(){}
char* GetPlainData();
char* GetCipherData();
private:
void run(char Out[8],char In[8],bool MS); //ms=0 時加密,反之解密
void keyfc(); //獲取密鑰函數
void ByteToBit(char *Out,char *In,int bits); //字節到位的轉換
void BitToByte(char *Out,char *In,int bits); //位到字節轉換
void Xor(char *InA,const char *InB,int len); //按位異或
char key[16][48]; //輪密鑰
char Ki[9]; //初始密鑰
char plaindata[9]; //明文
char cipherdata[9]; //密文
};
/////des.cpp
#include "stdafx.h"
#include "DES.h"
DES::DES()
{
memset(Ki,0,sizeof(Ki));
memset(plaindata,0,sizeof(plaindata));
memset(cipherdata,0,sizeof(cipherdata));
for(int i = 0; i < 16; i++)
{
memset(key[i],0,sizeof(key[i]));
}
}
void DES::SetEncodeValue(char *initialKey,char *data)
{
memcpy(Ki,initialKey,strlen(initialKey));
Ki[strlen(initialKey)] = '\0';
memcpy(plaindata,data,strlen(data));
plaindata[strlen(data)] = '\0';
keyfc();
}
void DES::SetDecodeValue(char *initialKey,char *data)
{
memcpy(Ki,initialKey,strlen(initialKey));
Ki[strlen(initialKey)] = '\0';
memcpy(cipherdata,data,strlen(data));
cipherdata[strlen(data)] = '\0';
keyfc();
}
void DES::EncodeData()
{
run(cipherdata,plaindata,0);
}
void DES::DecodeData()
{
run(plaindata,cipherdata,1);
}
void DES::run(char Out[8],char In[8],bool MS)
{
char MW[64],tmp[32],PMW[64];
char kzmw[48],keytem[48],ss[32];
int hang,lie;
ByteToBit(PMW,In,64);
for(int j=0;j<64;j++)
{
MW[j]=PMW[ip[j]-1]; //初始置換
}
char *Li=&MW[0],*Ri=&MW[32];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1];
if(!MS) //DES加密過程
{
for(int lun=0;lun<16;lun++)
{
for(int i=0;i<32;i++)
ss[i]=Ri[i];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1];
for(int i=0;i<48;i++)
keytem[i]=key[lun][i]; //輪密鑰
Xor(kzmw,keytem,48);
/*S盒置換*/
for(int i=0;i<8;i++)
{
hang=kzmw[i*6]*2+kzmw[i*6+5];
lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
}
for(int i=0;i<32;i++) //P置換
Ri[i]=tmp[Pzh[i]-1];
Xor(Ri,Li,32); //異或
for(int i=0;i<32;i++) //交換左右明文
{
Li[i]=ss[i];
}
}
for(int i=0;i<32;i++)
{
tmp[i]=Li[i];
Li[i]=Ri[i];
Ri[i]=tmp[i];
}
for(int i=0;i<64;i++)
PMW[i]=MW[fp[i]-1];
BitToByte(Out,PMW,64); //位到字節的轉換
}
else //DES解密過程
{
for(int lun=15;lun>=0;lun--)
{
for(int i=0;i<32;i++)
ss[i]=Ri[i];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針
for(int i=0;i<48;i++)
keytem[i]=key[lun][i]; //輪密鑰
Xor(kzmw,keytem,48);
/*S盒置換*/
for(int i=0;i<8;i++)
{
hang=kzmw[i*6]*2+kzmw[i*6+5];
lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
}
for(int i=0;i<32;i++) //P置換
Ri[i]=tmp[Pzh[i]-1];
Xor(Ri,Li,32); //異或
for(int i=0;i<32;i++) //交換左右明文
{
Li[i]=ss[i];
}
}
for(int i=0;i<32;i++)
{
tmp[i]=Li[i];
Li[i]=Ri[i];
Ri[i]=tmp[i];
}
for(int i=0;i<64;i++)
PMW[i]=MW[fp[i]-1];
BitToByte(Out,PMW,64); //位到字節的轉換
}
}
void DES::keyfc()
{
char key0[56],temp,keyin[64];
ByteToBit(keyin,Ki,64); //字節到位的轉換
for(int i=0;i<56;i++) //密鑰壓縮爲56位
key0[i]=keyin[Keyrar[i]-1];
for(int i=0;i<16;i++) //16輪密鑰產生
{
int mov;
if(i==0||i==1||i==8||i==15)
mov=1;
else
mov=2;
for(int k=0;k<mov;k++) //分左右兩塊循環左移
{
for(int m=0;m<8;m++)
{
temp=key0[m*7];
for(int j=m*7;j<m*7+7;j++)
key0[j]=key0[j+1];
key0[m*7+6]=temp;
}
temp=key0[0];
for(int m=0;m<27;m++)
key0[m]=key0[m+1];
key0[27]=temp;
temp=key0[28];
for(int m=28;m<55;m++)
key0[m]=key0[m+1];
key0[55]=temp;
}
for(int j=0;j<48;j++) //壓縮置換並儲存
key[i][j]=key0[rar[j]-1];
}
}
void DES::BitToByte(char *Out,char *In,int bits)
{
for(int i=0;i<bits/8;i++)
Out[i]=0;
for(int i=0;i<bits;i++)
Out[i/8]|=In[i]<<(i%8);
}
void DES::ByteToBit(char *Out,char *In,int bits)
{
for(int i=0;i<bits;i++)
Out[i]=(In[i/8]>>(i%8))&1;
}
void DES::Xor(char *InA,const char *InB,int len)
{
for(int i=0;i<len;i++)
InA[i]^=InB[i];
}
char* DES::GetPlainData()
{
return plaindata;
}
char* DES::GetCipherData()
{
return cipherdata;
}
////DisposeData.h
#pragma once
#include "DES.h"
#include <vector>
using namespace std;
class DisposeData
{
public:
DisposeData();
virtual ~DisposeData();
public:
void SetValue(char *key,char *data);
void SetValue(char *data);
//加密解密文件名
CString EncryptFileName();
CString DecryptFileName();
//解密文件內容
CString ProcessDecode();
//處理文件內容,參數爲真表示加密,爲假表示解密
CString ProcessData(BOOL IsEncode);
public:
//得到主機信息
void GetPCInfo(CString strAllInfo,CString &strIp,CString &strMac,CString &strHostName,CString &strDomain);
//得到文件名信息
void GetFileNameInfo(CString strFileName,CString &strMac,CString &strTime);
//得到文件內容中的信息
void GetRecordInfo(CString strFileConten,CString &strAppName,CString &strRecordInfo);
private:
//隨機產生8位密碼
CString RandStringKey();
//加密密鑰
CString ProcessKey(BOOL IsEncode);
void ASCAdd(string &s);
void ASCPlus(string &s);
void ChangeChar(string &s);
void TurnRound(string &s,bool IsTurnRight);
//拆分字符串
void SplitData();
DES m_des;
char* m_key;
char* m_data;
vector<CString> m_finaldata;
};
////DisposeData.cpp
#include "stdafx.h"
#include "DisposeData.h"
DisposeData::DisposeData()
{
m_data = new char();
m_data = '\0';
}
DisposeData::~DisposeData()
{
m_finaldata.clear();
if(m_data != NULL)
{
delete[]m_data;
m_data = NULL;
}
}
void DisposeData::SetValue(char *data)
{
m_data = new char[strlen(data)+1];
memcpy(m_data,data,strlen(data));
m_data[strlen(data)] = 0;
}
void DisposeData::SplitData()
{
size_t k = 0;
int round = strlen(m_data) / 8;
while(round-- > 0)
{
char tmpdata[9];
for(int i = 0; i < 8; i++)
{
tmpdata[i] = m_data[k++];
}
tmpdata[8] = 0;
CString tmpstr(tmpdata);
m_finaldata.push_back(tmpstr);
}
if(k < strlen(m_data))
{
char tmpdata[9];
int j = 0;
while(k < strlen(m_data))
{
tmpdata[j++] = m_data[k++];
}
tmpdata[j] = '\0';
CString tmpstr(tmpdata);
m_finaldata.push_back(tmpstr);
}
}
CString DisposeData::ProcessData(BOOL IsEncode)
{
CString str("");
CString key("12345678");
m_finaldata.clear();
SplitData();
vector<CString>::iterator iterStr = m_finaldata.begin();
if(IsEncode)
{
while(1)
{
CString cipherdata("");//加密後的密文
iterStr = m_finaldata.begin();
//加密
while(iterStr != m_finaldata.end())
{
char *tempData = (*iterStr).GetBuffer(0);
(*iterStr).ReleaseBuffer();
char *tempKey = key.GetBuffer(0);
key.ReleaseBuffer();
m_des.SetEncodeValue(tempKey,tempData);
m_des.EncodeData();
cipherdata += m_des.GetCipherData();
iterStr++;
}
//判斷密碼是否能恢復密文
CString detectionStr;
CString tmpCipherdata;
DisposeData tempDis;
BOOL tempb = FALSE;
char *tmpkey = key.GetBuffer(0);
key.ReleaseBuffer();
tempDis.SetValue(tmpkey);
tmpCipherdata.Format("%s%s",tempDis.ProcessKey(TRUE),cipherdata);
char *tempData = tmpCipherdata.GetBuffer(0);
tmpCipherdata.ReleaseBuffer();
tempDis.SetValue(tempData);
detectionStr = tempDis.ProcessData(tempb);
if(detectionStr.Compare(m_data) == 0)
{
DisposeData encodeKey;
tempData = key.GetBuffer(0);
key.ReleaseBuffer();
encodeKey.SetValue(tempData);
//將密碼的密文和密文一起保留並加特殊字符
str.Format("%s%s%s",encodeKey.ProcessKey(TRUE),cipherdata,"&ENCTYPT&");
break;
}
else
{
key = RandStringKey();;
}
}
}
else
{
//提取密碼的密文
char *cipherkey = (*iterStr).GetBuffer(0);
(*iterStr).ReleaseBuffer();
iterStr++;
DisposeData decodekey;
decodekey.SetValue(cipherkey);
//解析出密碼
key = decodekey.ProcessKey(FALSE);
//解密
while(iterStr != m_finaldata.end())
{
char *tempData = (*iterStr).GetBuffer(0);
(*iterStr).ReleaseBuffer();
char *tempKey = key.GetBuffer(0);
key.ReleaseBuffer();
m_des.SetDecodeValue(tempKey,tempData);
m_des.DecodeData();
str += m_des.GetPlainData();
iterStr++;
}
}
return str;
}
CString DisposeData::RandStringKey()
{
int i;
CString code;
CString s;
char temp;
unsigned m;
for(char ch = 'A'; ch <= 'Z';ch++)
code += ch;
for(char ch = '0'; ch <= '9';ch++)
code += ch;
for(char ch = 'a'; ch <= 'z';ch++)
code += ch;
for(i = 0; i < 8; i++)
{
m = rand() % 62;
temp = code[m];
s += temp;
}
return s;
}
CString DisposeData::ProcessKey(BOOL IsEncode)
{
CString str("");
if(IsEncode)
{
m_des.SetEncodeValue("12345678",m_data);
m_des.EncodeData();
str += m_des.GetCipherData();
}
else
{
m_des.SetDecodeValue("12345678",m_data);
m_des.DecodeData();
str += m_des.GetPlainData();
}
return str;
}
CString DisposeData::ProcessDecode()
{
CString tmpDecodeData(m_data);
CString encodeData("");
int start = 0;
// char ch = -128;
while((start = tmpDecodeData.Find("ENCTYPT")) != -1)
{
CString tmpData("");
tmpData = tmpDecodeData.Left(start-1);//取start左邊的一段
tmpDecodeData = tmpDecodeData.Right(tmpDecodeData.GetLength() - start - 8);//start右邊的一段
DisposeData tmpDis;
char *tmp = tmpData.GetBuffer(0);
tmpData.ReleaseBuffer();
tmpDis.SetValue(tmp);
encodeData += tmpDis.ProcessData(FALSE);
}
return encodeData;
}
void DisposeData::ASCAdd(string &s)
{
for(size_t i = 0; i < s.size(); i++)
{
if(s[i] >= 'C' && s[i] <= 'Z')
{
s[i] = 135 - s[i];
}
else if(s[i] >= 'a' && s[i] <= 'z')
{
s[i] -= 32;
}
else if(s[i] == 'A')
{
s[i] = '.';
}
else if(s[i] == 'B')
{
s[i] = '_';
}
}
}
void DisposeData::ASCPlus(string &s)
{
for(size_t i = 0; i < s.size(); i++)
{
if(s[i] >= 'A' && s[i] <= 'Z')
{
s[i] += 32;
}
else if(s[i] >= '0' && s[i] <= '9' || s[i] == '-')
{
s[i] = 135 - s[i];
}
else if(s[i] == '.')
{
s[i] = 'A';
}
else if(s[i] == '_')
{
s[i] = 'B';
}
}
}
void DisposeData::ChangeChar(string &s)
{
for(size_t i = 0; i < s.size()-1; i += 2)
{
char temp = s[i];
s[i] = s[i+1];
s[i+1] = temp;
}
}
void DisposeData::TurnRound(string &s,bool IsTurnRight)
{
// 交換以第一個字母的數字確定右移多少位置,
int b;
char tmpCh = 'F';
b = s[0] % 10;
b %= s.size();
string tmpS;
string::iterator iter = s.begin();
string::iterator iterTmp = tmpS.begin();
if(IsTurnRight)
{
tmpS.insert(iterTmp, iter, iter+s.size()-b);
iterTmp = tmpS.begin();
tmpS.insert(iterTmp, iter+(s.size()-b), s.end());
iterTmp = tmpS.begin();
tmpCh += b;
iterTmp = tmpS.insert(iterTmp, tmpCh);
}
else
{
tmpS.insert(iterTmp, iter+1, iter+b+1);
iterTmp = tmpS.begin();
tmpS.insert(iterTmp, iter+b+1, iter+s.size());
}
s = tmpS;
}
CString DisposeData::EncryptFileName()
{
CString FileName("");
string s(m_data);
ASCPlus(s);
ChangeChar(s);
TurnRound(s,true);
const char *data = s.c_str();
FileName.Format("%s",data);
return FileName;
}
CString DisposeData::DecryptFileName()
{
CString FileName("");
string s(m_data);
TurnRound(s,false);
ChangeChar(s);
ASCAdd(s);
const char *data = s.c_str();
FileName.Format("%s",data);
return FileName;
}
void DisposeData::GetPCInfo(CString strAllInfo,CString &strIp,CString &strMac,CString &strHostName,CString &strDomain)
{
int start = -1;
//去掉time
start = strAllInfo.Find("time:");
strAllInfo = strAllInfo.Left(start-1);
//取domain字段
start = strAllInfo.Find("domain:");
strDomain = strAllInfo.Right(strAllInfo.GetLength()-start - 7);
strAllInfo = strAllInfo.Left(start);
//取hostname字段
start = strAllInfo.Find("hostname:");
strHostName = strAllInfo.Right(strAllInfo.GetLength()-start - 9);
strAllInfo = strAllInfo.Left(start);
//取MAC字段
start = strAllInfo.Find("mac:");
strMac = strAllInfo.Right(strAllInfo.GetLength()-start - 4);
strAllInfo = strAllInfo.Left(start);
//取IP字段
start = strAllInfo.Find("ip:");
strIp = strAllInfo.Right(strAllInfo.GetLength()-start - 3);
strAllInfo = strAllInfo.Left(start);
}
void DisposeData::GetFileNameInfo(CString strFileName,CString &strMac,CString &strTime)
{
int start = -1;
while((start = strFileName.Find("-")) != -1)
{
strMac += strFileName.Left(start);
strFileName = strFileName.Right(strFileName.GetLength() - start - 1);
if(strFileName.Find("-") != -1)
strMac += '-';
}
strTime = strFileName;
}
void DisposeData::GetRecordInfo(CString strFileConten,CString &strAppName,CString &strRecordInfo)
{
int start = -1;
start = strFileConten.Find("[^");
strFileConten = strFileConten.Right(strFileConten.GetLength() - start - 2);
start = strFileConten.Find("^]");
strAppName = strFileConten.Left(start);
strRecordInfo = strFileConten.Right(strFileConten.GetLength() - start - 2);
}