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

📄 cbc_crydlg.cpp

📁 des cbc加密的一个演示C++。net编的
💻 CPP
字号:
// CBC_cryDlg.cpp : 实现文件
//


#include "stdafx.h"
#include "WjcDes.h"
#include "CBC_cry.h"
#include "CBC_cryDlg.h"
#include ".\cbc_crydlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CCBC_cryDlg 对话框

bool sw=0;

CCBC_cryDlg::CCBC_cryDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCBC_cryDlg::IDD, pParent)
	, CBC_Key(_T(""))
	, CBC_IV(_T(""))
	, CBC_Plai(_T(""))
	, CBC_Ciph(_T(""))
	, CBC_DEC_P(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCBC_cryDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_Key, CBC_Key);
	DDX_Text(pDX, IDC_IV, CBC_IV);
	DDX_Text(pDX, IDC_Plain, CBC_Plai);
	DDX_Text(pDX, IDC_Ciph, CBC_Ciph);
	DDX_Text(pDX, IDC_DE_pla, CBC_DEC_P);
}

BEGIN_MESSAGE_MAP(CCBC_cryDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
//	ON_BN_CLICKED(IDC_Gen_Key, OnBnClickedGenKey)
	ON_BN_CLICKED(IDC_CBC_Cry, OnBnClickedCbcCry)
	ON_BN_CLICKED(IDC_CBC_Dec, OnBnClickedCbcDec)
END_MESSAGE_MAP()


// CCBC_cryDlg 消息处理程序

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

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CCBC_cryDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		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;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CCBC_cryDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

char * get_IV()
{
	char IV[8],ch;
int num;
int i=0;
  for(i=0;i<8;i++)
  { 
	   num=((float)RAND_MAX * rand()/(float)RAND_MAX * rand()); 
//   /*
//	   if(hi==15) IV[i]='F';
//	   if(hi==14) IV[i]='E';
//       if(hi==13) IV[i]='D';
//	   if(hi==12) IV[i]='C';
//	   if(hi==11) IV[i]='B';
//	   if(hi==10) IV[i]='A';
//	   if(hi<10) {hi=hi+48; IV[i]=(char)hi;} 
//       i=i+1;
//       if(lo==15) IV[i]='F';
//	   if(lo==14) IV[i]='E';
//       if(lo==13) IV[i]='D';
//	   if(lo==12) IV[i]='C';
//	   if(lo==11) IV[i]='B';
//	   if(lo==10) IV[i]='A';
//	   if(lo<10) {lo=lo+48; IV[i]=(char)lo;} 
//       i=i+2;
//	   IV[i]=(int)40;;*/
	   IV[i]=(char) num; 	
      } 
  //IV[8]='\0';
  return IV;
// strcpy(CBC_IV.GetBuffer(),IV);
// UpdateData(FALSE);
}


void CCBC_cryDlg::OnBnClickedCbcCry()
{
 char temp1[9],in[9],out[9],buf[247],out_buf[255],tt[255];
 char SIV[9];
    int j=0,k;
memset(out_buf,0,sizeof(out_buf));
memset(buf,0,sizeof(buf));
memset(tt,0,sizeof(tt));
	 //if(!i) i=!i;
	if (!UpdateData())
		return;
	/*
	temp1用于放临时块;
	in和out分别是每块加密的输入输出指针
	buf用于接收明文
	out_buf用于输出密文
	tt缓存输入的IV
	*/
   
   //strcpy(CBC_IV.GetBuffer(),SIV);
	UpdateData(TRUE);
	if(CBC_IV.GetLength()==0) {strcpy(SIV,get_IV());SIV[8]='\0';}
	else if(CBC_IV.GetLength()<8) 
	        {
				for(k=0;k<CBC_IV.GetLength();k++)  SIV[k]=CBC_IV.GetAt(k);
                for(k=CBC_IV.GetLength();k<8;k++) SIV[k]='l';
				SIV[8]='\0';
			}
	     else 
		 {
			 for(k=0;k<8;k++) SIV[k]=CBC_IV.GetAt(k);
			 SIV[8]='\0';
		 }
   
   //获取IV如果没有输入随机产生,输入不够8位补l,超过8位只取前8位//
	
    strcpy(buf,CBC_Plai.GetBuffer());
	//buf[CBC_Plai.GetLength()]='\n';
	strcpy(tt,SIV);
    for(k=0;k<8;k++) temp1[k]=tt[k];
	temp1[8]='\0';
    strcpy(out_buf,temp1);
	if(!sw) sw=!sw;
	while(buf[j]!='\0')
	{ 
		for(k=0;k<8&&buf[j]!='\0';k++)
		{
			
			in[k]=buf[j];
			in[k]=in[k]^temp1[k];
            j++;
		}
       if(k<8) 
	     { for(k;k<8;k++)  
	        {
				in[k]='\0';
			    in[k]=in[k]^temp1[k];
			}
		}
		in[8]='\0';
	    Des_Go(out, in, 8, CBC_Key.GetBuffer(), CBC_Key.GetLength(), 0);
	    out[k]='\0';
      

	  strcpy(temp1,out);
	  temp1[k]='\0';
	   strcat(out_buf,out);
	}
     memset(temp1, 0, sizeof(temp1)); 
       CBC_Ciph=out_buf;
       CBC_IV=SIV;
   bool buff1[4096];
   char buff[256],buff2[256];
   strcpy(buff,buf);
  // ByteToBit(buff1,buff,sizeof(buff)*8);
   //BitToByte(buff2,buff1,sizeof(buff1));
      sw=!sw;
	  UpdateData(FALSE);

}

void CCBC_cryDlg::OnBnClickedCbcDec()
{
  if(sw) return;
	char temp1[9],in[9],out[9],buf[256],out_buf[256],tt[256],SIV[9];
    int j=0,k,l;
	 //if(!i) i=!i;
	if (!UpdateData())
		return;
	/*
	temp1用于放临时块;
	in和out分别是每块加密的输入输出指针
	buf用于接收明文
	out_buf用于输出密文
	tt缓存输入的IV
	*/
	memset(out_buf,0,sizeof(out_buf));
  strcpy(buf,CBC_Ciph.GetBuffer());
     for(k=0;k<8&&buf[j]!='\0';k++)
		{
			
			SIV[k]=buf[j];
            j++;
		}
		SIV[k]='\0';
  
   while(buf[j]!='\0')
	{ 
		for(k=0;k<8&&buf[j]!='\0';k++)
		{
			temp1[k]=buf[j-8];
			in[k]=buf[j];
            j++;
		}
		temp1[k]='\0';
		in[k]='\0';
	    Des_Go(out, in, 8, CBC_Key.GetBuffer(), CBC_Key.GetLength(), 1);
        
		 for(l=0;l<k;l++) out[l]=out[l]^temp1[l];
		 out[k]='\0';
		strcat(out_buf,out);
	}

	  CBC_DEC_P=out_buf;
      CBC_IV=SIV;
      sw=!sw;
     UpdateData(FALSE);
}

⌨️ 快捷键说明

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