DES

////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);

}

 

 

 

 

 

 

發佈了56 篇原創文章 · 獲贊 5 · 訪問量 81萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章