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

📄 des.cpp

📁 机顶盒加解密工作示例代码
💻 CPP
字号:
// Des.cpp: implementation of the CDes class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "sevr.h"
#include "Des.h"
#include<math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CDes::CDes()
{

}

CDes::~CDes()
{

}
CString CDes::jiami()
{ 
	CString str="";
	int table1[65]={0},table2[65]={0};
	int i=0,j=0,ch=0,k=0;
	int L[33]={0};
	int Lsave[33]={0};
	int R[33]={0};
	int RE[49]={0};
	int s[9][7]={0};
	int sboxout[9]={0};
	int temp[5]={0},f[33]={0},frk[33]={0};
    for(i=1;i<=64;i++)
		table2[i]=yuanshishujuerjinzhi[IP[i-1]];//IP置换
	for(i=1;i<=32;i++)
	{	L[i]=table2[i];
	    R[i]=table2[i+32];
	}//L0,R0
     for(k=1;k<=16;k++)
	 {
       for(j=1;j<=48;j++)
		   RE[j]=R[E[j-1]];//E扩展
	   for(j=1;j<=48;j++)//与Key[i]加密
	   {  RE[j]+=key16[k][j];//RE是过程性存放数据的变量
	       if(2==RE[j])
			   RE[j]=0;
	   }//mod2加
       for(i=1;i<=8;i++)//48位分成8组
	    for(j=1;j<=6;j++)
		   s[i][j]=RE[6*(i-1)+j];
	   //下面经过S盒,得到8个数
	   int x=0,y=0;
	   for(i=1;i<=8;i++)
	   {   x=s[i][6]+2*s[i][1];
	       y=s[i][5]+2*s[i][4]+4*s[i][3]+8*s[i][2];
		   sboxout[i]=sbox[i-1][x][y];
	   }
    for(i=1;i<=8;i++)//8个数变换输出四位二进制
	{
		for(j=1;j<=4;j++)
		{
 		  temp[5-j]=sboxout[i]%2;//
		  sboxout[i]/=2;
		}
		for(j=1;j<=4;j++)
	      f[4*(i-1)+j]=temp[j];//把8个四位二进制数转换位32位向量
	}
	for(i=1;i<33;i++)
		frk[i]=f[P[i-1]];//p置换
	   for(i=1;i<33;i++)
	   {  Lsave[i]=L[i];
          L[i]=R[i];
	   }
	   for(i=1;i<33;i++)
	   { R[i]=Lsave[i]+frk[i];
	      if(2==R[i])
			  R[i]=0;
	   }	      
	 }//十六轮迭代加密 
	for(i=1;i<=32;i++)
    {
		table1[i]=R[i];
		table1[i+32]=L[i];
	}
    for(i=1;i<=64;i++)
		table2[i]=table1[IP_1[i-1]];//IP逆变换
	str="";
	for(i=1;i<=64;i++)
	{
		if(0==table2[i])
			str+='0';
		else
		str+='1';
	}
	return str;
}//函数体
int  CDes::subkey()
{
	int table2[57]={0};//密钥二进制
	int i=0,j=0,m=0;
	int Csave[29];
	int Dsave[29];
	int D[29];
	int C[29];
    for(i=1;i<57;i++)
		table2[i]=yushimiyaoerjinzhi[PC_1[i-1]];//56位压缩
	for(i=1;i<=28;i++)
	{   C[i]=table2[i];
	    D[i]=table2[i+28];
	}//得到C0,D0
	for(i=1;i<=16;i++)//十六次子密钥迭代
	{	if(i==1||i==2||i==9||i==16)
		{
         for(j=1;j<28;j++)
		 {
			 Csave[j]=C[j+1];
			 Dsave[j]=D[j+1];
		 }//for
		 Csave[28]=C[1];
		 Dsave[28]=D[1];
		}//if
		else
		{
          for(j=1;j<27;j++)
		 {
			 Csave[j]=C[j+2];
			 Dsave[j]=D[j+2];//Csave,Dsave,用来做移位时的临时存放变量
		 }//for
		 Csave[27]=C[1];
		 Csave[28]=C[2];
		 Dsave[27]=D[1];
		 Csave[28]=D[2];
		}//else
		for(j=1;j<=28;j++)
		{	C[j]=Csave[j];
		    D[j]=Dsave[j];
		}
      for(m=1;m<=28;m++)
	  {
		  table2[m]=C[m];
		  table2[m+28]=D[m];
	  }//
	 for(m=1;m<=48;m++)
		  key16[i][m]=table2[PC_2[m-1]];
	}//for 密钥循环
	return 0;
}//函数体

void CDes::changekey()
{
	int temp[49]={0};
	int k=0,i=0;
	for(k=1;k<=8;k++)
    {	
		for(i=1;i<=48;i++)
		{ temp[i]=key16[k][i];
		  key16[k][i]=key16[17-k][i];
		  key16[17-k][i]=temp[i];
		}
	}
}

⌨️ 快捷键说明

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