⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.cpp

📁 大随机数生成器算法的研究与实现.大随机数已经在当今社会的各个领域中都频繁使用
💻 CPP
字号:
// DES.cpp:DES类的实现
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ansi917.h"
#include "DES.h"
#include "datas.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDES::CDES()
{

}

CDES::~CDES()
{

}

//////////////////////////////////////////////////////////
//函数名:    ToIP
//函数功能:  把64位的明文用IP表置换
//输入:      BinMinWen[64](明文二进制)
//输出:      LR[64](转换后的二进制)
//////////////////////////////////////////////////////////
void CDES::ToIP()
{
   char i;                        //初始置换IP
   for (i = 0; i < 64; ++i)
   {
      LR[i] = BinMinWen[IP[i] - 1];
    }
}
/////////////////////////////////////////////////////////
//函数名:    ToPC1
//函数功能:  把64位的密钥用PC_1表置换成56位的二进制
//输入:      BinKey[64](密钥二进制)
//输出:      CD[64](转换后的二进制)
////////////////////////////////////////////////////////

void CDES::ToPC1()               //密钥置换
{
   char i;
   for(i=0;i<56;++i)
   {
     CD[i]=BinKey[PC_1[i]-1];
   }
}

/////////////////////////////////////////////////////////
//函数名:    LAndR
//函数功能:  把64位的LR[64]分开成L[32]和R[32]
//输入:      LR[64]
//输出:       L[32],R[32]
////////////////////////////////////////////////////////
void CDES::LAndR()              //分开明文的L和R
{
   char i;
  for (i = 0; i < 32; ++i)
    {
      L[i] = LR[i];
      R[i] = LR[i + 32];
    }
}

/////////////////////////////////////////////////////////
//函数名:    ToE
//函数功能:  E表置换
//输入:      R[32]
//输出:       AfterE[48]
////////////////////////////////////////////////////////
void CDES::ToE()             //明文选择扩展运算E
{
   char i;
  for (i = 0; i < 48; ++i)
  {
    AfterE[i] = R[E[i] - 1];
   }
}
/////////////////////////////////////////////////////////
//函数名:    LeftCD
//函数功能:  CD和前28bit与后28bit要别左移n位
//输入:      CD[64],n:左移位数
//输出:       CD[64]
////////////////////////////////////////////////////////
void CDES::LeftCD(int n)                  
{
  char i,c,Temp1,Temp2;
  for (c = 1; c <= LeftCount[n]; ++c)
   {
      Temp1 = CD[0];
      Temp2 = CD[28];

     for (i = 1; i < 28; i++)
       {
         CD[i - 1] = CD[i];
         CD[i + 28 - 1] = CD[i + 28];

       }
       CD[27] = Temp1;
       CD[55] = Temp2;
    }

}
/////////////////////////////////////////////////////////
//函数名:     ToPC2
//函数功能:   密钥CD置换2
//输入:      左移后的CD
//输出:       AfterPC2[48]
////////////////////////////////////////////////////////
void CDES::ToPC2()      //密钥置换选择2
{
  char i;
  for (i = 0; i < 48; ++i)
  {
     AfterPC2[i] = CD[PC_2[i] - 1];
  }

}
/////////////////////////////////////////////////////////
//函数名:    XOR1
//函数功能:  第一次异或(见流程图)
//输入:      AfterE[48],AfterPC2[48]
//输出:       AfterXORq[48]
////////////////////////////////////////////////////////
void CDES::XOR1()            // 第1次XOR运算
{
   char i;
   for (i = 0; i < 48; ++i)
   {
     AfterXOR1[i] = AfterE[i] ^ AfterPC2[i];
     }
}
/////////////////////////////////////////////////////////
//函数名:     ToS
//函数功能:   S盒代换/选择(见流程图)
//输入:      AfterXOR1[48]
//输出:       AfterS[32]
////////////////////////////////////////////////////////
void CDES::ToS()                  //S盒运算
{
	 char i;
     char Temp1,Temp2,Temp3,Temp4;
     char Out;
  
     for (i = 0; i < 8; ++i)
       {
         Temp1 = (i << 2) + (i << 1) + 1;//i * 6 + 1;
         Temp2 = (i << 2) + (i << 1) + 6;//i * 6 + 6;

         Temp3 = (AfterXOR1[Temp1 - 1] << 1) + AfterXOR1[Temp2 - 1];
         Temp4 = (AfterXOR1[Temp1] << 3) 
			     + (AfterXOR1[Temp1 + 1] << 2) 
				 + (AfterXOR1[Temp1 + 2] << 1)
				 + AfterXOR1[Temp1 + 3];

         Out = S[i][Temp3][Temp4];
         AfterS[(i << 2) - 1 + 1] = Out >> 3 & 0x01;
         AfterS[(i << 2) - 1 + 2] = Out >> 2 & 0x01;
         AfterS[(i << 2) - 1 + 3] = Out >> 1 & 0x01;
         AfterS[(i << 2) - 1 + 4] = Out & 0x01; 
        }

}
/////////////////////////////////////////////////////////
//函数名:    ToP
//函数功能:  P置换(见流程图)
//输入:      AfterS[32]
//输出:       AfterP[32]
////////////////////////////////////////////////////////
void CDES::ToP()               //P置换
{
char i;
 for (i = 0; i < 32; ++i)
 {
    AfterP[i] = AfterS[P[i] - 1];
 }
}
/////////////////////////////////////////////////////////
//函数名:    AfterXOR2
//函数功能:  第二次异或
//输入:      AfterP[32]
//输出:       AfterXOR2[32]
////////////////////////////////////////////////////////
void CDES::ToXOR2()            //第2次XOR运算
{
	char i;
   for (i = 0; i < 32; ++i)
   {
     AfterXOR2[i] = AfterP[i] ^ L[i];
     }
}

/////////////////////////////////////////////////////////
//函数名:     DES
//函数功能:   DES加密
//输入:      CD[64],n:左移位数
//输出:       CD[64]
//调用函数:   ToIP(),ToPC1(),LAndR(), ToE(),LeftCD(i),ToPC2(),XOR1(),ToS(),ToP(),ToXOR2(); 
//修改时间:   2006.11.23
//修改内容:   增加ToPC1()函数
////////////////////////////////////////////////////////

void CDES::DES16()
{
  ToIP();//初始置换
  ToPC1();
  LAndR();//分开L,R

///开始16轮加密
 for (int i = 0; i < 16; i++)
 {

  ToE();
  LeftCD(i);
  ToPC2();
  XOR1();
  ToS();
  ToP();
  ToXOR2();

    for (int i = 0; i < 32; i++)
	{
	  L[i] = R[i];
	  R[i] = AfterXOR2[i];
	}

 }//16轮加密结束

//合并L,R
 for (i = 0; i < 32; i++)
 {
	 LR[i] =      L[i];
	 LR[i + 32] = R[i];
 }


}
/////////////////////////////////////////////////////////
//函数名:       EDE
//函数功能:     三重DES加密
//输入:        M[64](明文),K1[56],K2[56](密钥)
//输出:         char Result[64](密文)
//最新修改时间: 2006.11.23   
//修改内容:     K1,K2输入为64位,用ToPC1处理为56位
////////////////////////////////////////////////////////
void CDES::EDE(char M[], char K1[], char K2[], char Result[])
{
	int i;
//E
	for (i = 0; i < 64; i++)
	{
		BinMinWen[i] = M[i];
		BinKey[i] = K1[i];
	}
		
	DES16();  

//D
	for (i = 0; i < 64; i++)
	{
		BinMinWen[i] = LR[i];
		BinKey[i] = K2[i];		
	}

	DES16();

//E
	for(i = 0; i < 64; i++)
	{
		BinMinWen[i] = LR[i];	
		BinKey[i] = K1[i];
	}
	DES16();

//得出结果
	for (i = 0; i < 64; i++)
	{
		Result[i] = LR[i];
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -