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

📄 des3dlg.cpp

📁 DES的完整实现!是我们密码学的课程设计。。。
💻 CPP
字号:
// DES3Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "DES3.h"
#include "DES3Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void CDES3Dlg::chartobit(char a[],int b[],int n)
{
  int i,k,c,j=0;

  for(i=0;i<n;i++)
  { 
	c=int(a[i]);
    if(c<0) c+=256;
    for(k=7;k>=0;k--)
    {
      b[j++]=(c>>k)%2;
    }
  }
}

void CDES3Dlg::bittochar(char a[],int b[], int n)
{
    int i,j,k;
 
    for(i=0; i<n; i++)
    {   
		k=0;
		for(j=0;j<8;j++)
        k+=(b[8*i+j]<<(7-(j%8)));
		a[i]=(char)k;
    }
	a[i]='\0';
}

void CDES3Dlg::lrotate(int a[], int n)
{
    int i;
    int temp[65];

    for(i=0;i<n;i++)
      temp[i]=a[i];
    for(i=0;i<28-n;i++)
      a[i]=a[i+n];
    for(i=0;i<n;i++)
    a[28+i-n]=temp[i];
}

void CDES3Dlg::pc1tran(int c[],int d[],int k[])
{
  int i;
  int temp[65];

  for(i=0;i<56;i++)
  temp[i]=k[pc1[i]-1];
  for(i=0;i<28;i++)
  {
     c[i]=temp[i];
     d[i]=temp[i+28];
  }
}

void CDES3Dlg::pc2tran(int subkey[],int k[])
{
  int i;

  for(i=0;i<48;i++)
  {
     subkey[i]=k[pc2[i]-1];
  }
}

void CDES3Dlg::createkey(int k[])
{
  int i,j,flag=0;
  int c[29],d[29],temp[57];

  T=0;
  pc1tran(c,d,k);
  for(i=0;i<28;i++)
  {
    temp[i]=c[i];
	temp[i+28]=d[i];
  }
  for(i=0;i<56;)
  {
     if(temp[i]==0)
		   i++;
	 else  break;
  }
  if(i==56)   T=1;
  if(T==0)
  {
     for(i=0;i<28;)
  {
     if(temp[i]==0&&temp[i+28]==1)
		   i++;
	 else  break;
  }
  if(i==28)   T=1;
  }
  if(T==0)
  {
     for(i=0;i<28;)
  {
     if(temp[i]==1&&temp[i+28]==0)
		   i++;
	 else  break;
  }
  if(i==28)   T=1;
  }
  if(T==0)
  {
     for(i=0;i<56;)
  {
     if(temp[i]==1)
		   i++;
	 else  break;
  }
  if(i==56)   T=1;
  }
  for(i=0;i<16;i++)
  {
     lrotate(c,ls[i]);
     lrotate(d,ls[i]);
     for(j=0;j<28;j++)
     {
       k[j]=c[j];
       k[j+28]=d[j];
     }
     pc2tran(subkey[i],k);
  }
}

void CDES3Dlg::iptran(int l[],int r[],int m[])
{
  int i;
  int temp[65];

  for(i=0;i<64;i++)
  {
    temp[i]=m[ip[i]-1];
  }
  for(i=0;i<32;i++)
  {
    l[i]=temp[i];
    r[i]=temp[i+32];
  }
}

void CDES3Dlg::etran(int m[],int r[])
{
  int i;

  for(i=0;i<48;i++)
    m[i]=r[e[i]-1];
}

void CDES3Dlg::xor(int m[],int sub[],int n)
{
   int i;

   for(i=0;i<n;i++)
   {
     if(m[i]==sub[i])
       m[i]=0;
     else m[i]=1;
   }
}

void CDES3Dlg::change(int temp[],int j)
{
   int i=0;

   for(i=0;i<4;i++)
   {
      temp[i]=(j>>(3-i))&1;
   }
}

void CDES3Dlg::stran(int m[],int temp[])
{
  int i,j,k,t;

  for(i=0;i<8;i++,m+=6,temp+=4)
  {
     j=(m[0]<<1)+m[5];
     k=(m[1]<<3)+(m[2]<<2)+(m[3]<<1)+m[4];
     t=s[i][j][k];
     change(temp,t);
  }
}

void CDES3Dlg::ptran(int r[],int temp[])
{
  int i;

  for(i=0;i<32;i++)
  r[i]=temp[p[i]-1];
}

void CDES3Dlg::ip1tran(int m[],int temp[])
{
   int i;

   for(i=0;i<64;i++)
   m[i]=temp[ip1[i]-1];
}

void CDES3Dlg::encrypt(int in[],int out[],int n)
{
  int i,j,k;
  int temp[65],tmp[33],m[49];
  int l[33],r[33];

  k=64*n;
  for(i=0;i<64;i++)
     temp[i]=in[ip[i]-1+k];
  for(i=0;i<32;i++)
  {
     l[i]=temp[i];
     r[i]=temp[32+i];
  }
  for(i=0;i<16;i++)
  {
    for(j=0;j<32;j++)
      tmp[j]=r[j];
    etran(m,r);
    xor(m,subkey[i],48);
    stran(m,temp);
    ptran(r,temp);
    xor(r,l,32);
    for(j=0;j<32;j++)
      l[j]=tmp[j];
  }
  for(i=0;i<32;i++)
  {
    temp[i]=r[i];
    temp[i+32]=l[i];
  }
  for(i=0;i<64;i++)
     out[i+k]=temp[ip1[i]-1];
}

void CDES3Dlg::decrypt(int in[],int out[],int n)
{
  int i,j,k;
  int miw[49],temp[65],tmp[33],l[33],r[33];

  k=64*n;
  for(i=0;i<64;i++)
    temp[i]=in[ip[i]-1+k];
  for(i=0;i<32;i++)
  {
     l[i]=temp[i];
     r[i]=temp[i+32];
  }
  for(i=15;i>=0;i--)
  {
    for(j=0;j<32;j++)
      tmp[j]=r[j];
    etran(miw,r);
    xor(miw,subkey[i],48);
    stran(miw,temp);
    ptran(r,temp);
    xor(r,l,32);
    for(j=0;j<32;j++)
      l[j]=tmp[j];
  }
  for(i=0;i<32;i++)
  {
    temp[i]=r[i];
    temp[i+32]=l[i];
  }
  for(i=0;i<64;i++)
  out[k+i]=temp[ip1[i]-1];
}

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CString	m_help;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	m_help = _T("");
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Text(pDX, IDC_EDIT1, m_help);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDES3Dlg dialog

CDES3Dlg::CDES3Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDES3Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDES3Dlg)
	m_t = _T("");
	m_ming = _T("");
	m_mi = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDES3Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDES3Dlg)
	DDX_Control(pDX, IDC_EDIT7, m_ruo);
	DDX_Control(pDX, IDC_EDIT4, m_code);
	DDX_Control(pDX, IDC_EDIT1, m_key);
	DDX_Text(pDX, IDC_EDIT5, m_t);
	DDX_Text(pDX, IDC_EDIT2, m_ming);
	DDX_Text(pDX, IDC_EDIT3, m_mi);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDES3Dlg, CDialog)
	//{{AFX_MSG_MAP(CDES3Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, Onencrypt)
	ON_BN_CLICKED(IDC_BUTTON2, Ondecrypt)
	ON_BN_CLICKED(IDC_BUTTON3, Onclrscr)
	ON_BN_CLICKED(IDC_BUTTON4, Ontest)
	ON_BN_CLICKED(IDC_BUTTON5, Onhelp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDES3Dlg message handlers

BOOL CDES3Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_t="请输入8bytes的密钥字符和少于2000bytes的明文字符!";
    UpdateData(false);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDES3Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDES3Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDES3Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CDES3Dlg::Onencrypt() 
{
	// TODO: Add your control notification handler code here
	int i,k,num,t,r,flag=0;
    int temp[64],tmp[64];
    char key[10];
	char tip1[]="加密成功!";
	char tip2[]="加密失败!密钥字符数不为8,请重新输入密钥!";
	int *m,*code;
	char *ming,*mw;
	
	UpdateData(true);
	m_key.GetWindowText(key,10);
	k=strlen(key);
	if(k!=0){
	if(k==8){
      chartobit(key,temp,8);
      createkey(temp);
      num=strlen(m_ming);
	  if(num!=0){
	  if(num>=8)
	  {
		ming=(char *)malloc(num*(sizeof(char)));
		for(i=0;i<num;i++)
			ming[i]=m_ming[i];
        t=num/8;
	    r=num%8;
		m=(int *)malloc(8*num*(sizeof(int)));
        chartobit(ming,m,num);
		code=(int *)malloc(8*num*(sizeof(int)));
        for(i=0;i<t;i++)
            encrypt(m,code,i);
        if(r!=0)
		{
	      for(i=0;i<8*(8-r);i++)
          temp[i]=code[8*(num-8)+i];
          for(i=8*(8-r);i<64;i++)
              temp[i]=m[8*(num-8)+i];
          encrypt(temp,tmp,0);
          for(i=0;i<64;i++)
              code[i+8*(num-8)]=tmp[i];
		}
        mw=(char *)malloc(8*num*(sizeof(char)));
	    for(i=0;i<8*num;i++)
		mw[i]=(char)(code[i]+48);
	    mw[8*num]='\0';
	    m_mi.Format(mw);
		m_t.Format(tip1);
	  }
	  else if(num>0)
	  {
		   ming=(char *)malloc(65*(sizeof(char)));
		   for(i=0;i<num;i++)
			   ming[i]=m_ming[i];
		   for(i=0;i<8-num;i++)
	           ming[i+num]=' ';
		   m=(int *)malloc(65*sizeof(int));
	       chartobit(ming,m,8);
		   code=(int *)malloc(65*sizeof(int));
		   encrypt(m,code,0);
		   mw=(char *)malloc(65*sizeof(char));
		   for(i=0;i<64;i++)
		   mw[i]=(char)(code[i]+48);
		   mw[64]='\0';
	       m_mi.Format(mw);
		   m_t.Format(tip1);
	  }}
	}else m_t.Format(tip2);}
	UpdateData(false);
}

void CDES3Dlg::Ondecrypt() 
{
	// TODO: Add your control notification handler code here
	int i,j,k,num,t,r,flag=0;
    int  temp[64],tmp[64];
    char key[9];
    char tip1[]="解密成功!";
    char tip2[]="解密失败!密钥字符数不为8,请重新输入密钥!";
    char tip3[]="解密失败,密文01序列字符数小于64或者不是8的倍数,请重新输入密文(>=64bytes且为8的倍数)!";
	char tip4[]="解密失败,输入的密文序列不是01序列,请重新输入密文!";
	int *code,*mi;
	char *mw,*c;

	UpdateData(true);
	m_key.GetWindowText(key,9);
	j=strlen(key);
	if(j!=0){
	if(j==8){
	   chartobit(key,temp,8);
       createkey(temp);  
       k=strlen(m_mi);
	   if(k!=0){
	   for(i=0;i<k;i++)
	   {
	      if(m_mi[i]!='0'&&m_mi[i]!='1')
          {   
				flag=1;
	            break;
		  }
	   }
	   if(flag!=1){
   	     num=k/8;
	     if(!(k%8)&&k>=64)
		 {
            mw=(char *)malloc(k*sizeof(char));
	        for(i=0;i<k;i++)
		      mw[i]=m_mi[i];
	        t=num/8;
	        r=num%8;
	        mi=(int *)malloc(k*(sizeof(int)));
	        for(i=0;i<k;i++)
		       mi[i]=(int)(mw[i]-48);
            if(r!=0)
			{
              for(i=0;i<64;i++)
                 temp[i]=mi[8*(num-8)+i];
              decrypt(temp,tmp,0);
              for(i=0;i<8*(8-r);i++)
                 mi[8*(num-8)+i]=tmp[i];
			}
	        code=(int *)malloc(k*sizeof(int));
            for(i=0;i<t;i++)
              decrypt(mi,code,i);
	        for(i=0;i<8*r;i++)
		      code[64*t+i]=tmp[8*(8-r)+i];
	        c=(char *)malloc(k*(sizeof(char)));
            bittochar(c,code,num); 
            m_code.SetWindowText(c);
            m_t.Format(tip1);
	   }else m_t.Format(tip3);
	   }else m_t.Format(tip4);  }
	}else m_t.Format(tip2);}
    UpdateData(false);
}

void CDES3Dlg::Onclrscr() 
{
	// TODO: Add your control notification handler code here
	int i,n;
	char *c;
    
	UpdateData(true);
	n=strlen(m_mi);
	c=(char *)malloc(n*sizeof(char));
	for(i=0;i<n;i++)
		c[i]=' ';
	c[i]='\0';
    m_key.SetWindowText(c);
    m_ming.Format(c);
    m_mi.Format(c);
    m_code.SetWindowText(c);
	m_ruo.SetWindowText(c);
    m_t="请您输入密钥字符(8bytes)和明文字符!";
	UpdateData(false);
}

void CDES3Dlg::Ontest() 
{
	// TODO: Add your control notification handler code here
    char tip1[]="弱密钥,不安全,请您重新输入密钥!";
    char tip2[]="非弱密钥,请您放心使用!";
	char tip3[]="密钥字符个数不为8,请重新输入密钥!";
    int  k,temp[65];
	char key[10]; 
	
	m_key.GetWindowText(key,10);
	k=strlen(key);
	if(k==8)
	{  
      chartobit(key,temp,8);
      createkey(temp);
	  if(T==1)
          m_ruo.SetWindowText(tip1);
	  else  m_ruo.SetWindowText(tip2);
	}
	else m_ruo.SetWindowText(tip3);
}

void CDES3Dlg::Onhelp() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg aaa;
	aaa.DoModal();
}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_help="软件运行说明:\r\n\r\n1、功能说明:\r\n    此软件能够对各种字符进行加密,其加密结果\
为01序列,并且可以直接解密由单重DES加密产生的密文01序列;此外,本软件还附加了检验密钥是否安全,\
清屏功能和软件运行相关的帮助功能;\r\n\r\n2、操作说明:\r\n    加密时,请输入8bytes的字符密钥(数字,汉字或者字符)\
和字符明文,验证加密结果时直接点击解密按钮\n\r就可得到相应的明文;\r\n    单独解密时,请在密钥\
框输入8bytes的字符密钥并且在密文框输入由单重DES加密产生的密文01序列,点击解密按纽即可得到对应的\
明文!\r\n\r\n3、问题反馈:如果您在使用中有任何问题请发邮件至aaron_up9999@126.com,作者将长期负\
责维护和改进!";
	UpdateData(false);	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

⌨️ 快捷键说明

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