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

📄 cyptdlg.cpp

📁 可以实现RIJNDEAL和IDEA 2种加密方法的完整程序,还可以看到加密的所用时间的情况
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		for( i=0;i<turn;i++)
		{
			pBuf[i] = 0;
			str = strText.Mid( i*5, 5 );
			for( j=0;j<4;j++)
			{
				WCHAR ch = str.GetAt(j);
				if( ch >= 97 && ch <=102 )
				{
					pBuf[i] |= (ch - 87);
				}
				else
				{
					pBuf[i] |= (ch - 48);
				}
				if( j != 3) 
					pBuf[i] = pBuf[i]<<4;
			}
		}

		/*************************************************/
		double dCpuHz=1.8;
		long HighStart,LowStart,HighEnd,LowEnd;
		unsigned long numhigh,numlow;
		
		//获取代码运行开始时cpu内部计数器的值
		__asm              
		{
			RDTSC 
				mov HighStart, edx
				mov LowStart, eax
		}
		/*************************************************/

		if( m_nSeltype == 0 )
		{
			for( j=0;j<TURN;j++)
			{
				for(i=0;i<turn/4;i++)
				{
					m_idea.Decrypt( pBuf + i*4, sRes + i*4 );
				}
			}
		}
		else
		{
			for( j=0;j<TURN;j++)
			{
				m_idea.Init( m_ideaKey );
				for(i=0;i<turn/4;i++)
				{
					m_idea.Decrypt( pBuf + i*4, sRes + i*4 );
				}
			}
		}

		/*************************************************************/
		__asm
		{
			RDTSC
				mov HighEnd, edx
				Mov LowEnd,  eax
				;获取两次计数器值得差
				sub eax,  LowStart
				cmp    eax,  0       ; 如果低32的差为负则求反,因为第二次取得永远比第一次的大
				jg     L3
				neg     eax 
				jmp     L4
				L3: mov numlow,  eax
				L4: sbb edx,  HighStart
			mov numhigh, edx
		}
		m_dwCycle2 = numhigh * pow( 2.0,32 ) + numlow;				m_dwCycle2 /= TURN;
		m_dwTime2 = m_dwCycle2/dCpuHz/1000000000;					m_dwTime2 /=  TURN;
		m_dwSpeed2 = turn/(m_dwCycle2/dCpuHz/1000000000)/1024;
		/***************************************************************/

		delete []pBuf;
		
		for(i=0;i<turn;i++)
		{
			WCHAR ch = sRes[i];
			if( ch == 13 )
				m_strPlain2.Insert( i, '\r' );
			else if( ch == 10 )
				m_strPlain2.Insert( i, '\n' );
			else
				m_strPlain2.Insert( i, sRes[i] );
		}
		delete []sRes;
	}
	UpdateData(0);
	return 1;
}

bool CCyptDlg::AESDeEncrypt(CString strText, bool bEn)
{
	if( strText.IsEmpty() ) return 0;
	int i,j, dwSize, len = strText.GetLength();
	if( bEn )
	{
		if( len%16 != 0 ) dwSize = len + 16-len%16;
		else dwSize = len;
		BYTE *pBuf = new BYTE[ dwSize ];
		BYTE *sRes = new BYTE[ dwSize ];

		WideCharToMultiByte( CP_ACP,
							 WC_COMPOSITECHECK,
							 strText.GetBuffer(len),
							 len,
							 (LPSTR)pBuf,
							 len,
							 NULL,
							 NULL
							);

		if( len%16 != 0 )
		{
			for(i=1;i<=16-len%16;i++)
			{
				pBuf[ dwSize - i ] = 0;
			}
		}

		/*************************************************/
		double dCpuHz=1.8;
		long HighStart,LowStart,HighEnd,LowEnd;
		unsigned long numhigh,numlow;
		
		//获取代码运行开始时cpu内部计数器的值
		__asm              
		{
			RDTSC 
				mov HighStart, edx
				mov LowStart, eax
		}
		/*************************************************/

		if( m_nSeltype == 0 )
		{
			for( j=0;j<TURN;j++)
			{
				for(i=0;i<dwSize/16;i++)
				{
					m_aes.Encrypt( pBuf + i*16, sRes + i*16 );
				}
			}
		}
		else
		{
			for( j=0;j<TURN;j++)
			{
				m_aes.Init( m_aesKey );
				for(i=0;i<dwSize/16;i++)
				{
					m_aes.Encrypt( pBuf + i*16, sRes + i*16 );
				}
			}
		}
		/*************************************************************/
		__asm
		{
			RDTSC
				mov HighEnd, edx
				Mov LowEnd,  eax
				;获取两次计数器值得差
				sub eax,  LowStart
				cmp    eax,  0       ; 如果低32的差为负则求反,因为第二次取得永远比第一次的大
				jg     L1
				neg     eax 
				jmp     L2
				L1: mov numlow,  eax
				L2: sbb edx,  HighStart
			mov numhigh, edx
		}
		m_dwCycle = numhigh * pow( 2.0,32 ) + numlow;			m_dwCycle /= TURN;
		m_dwTime = m_dwCycle/dCpuHz/1000000000;					m_dwTime  /= TURN;
		m_dwSpeed = dwSize/(m_dwCycle/dCpuHz/1000000000)/1024;
		/***************************************************************/

		delete []pBuf;
	
		CString str;
		for(i=0;i<dwSize;i++)
		{
			str.Format( _T("%x "), sRes[i] );
			if( str.GetLength() == 2 )
				str = _T("0") + str;
			m_strCipher += str;
		}
		delete []sRes;
	}
	else
	{
		CString str;
		int turn = len/3;
		BYTE *pBuf = new BYTE[ turn ];
		BYTE *sRes = new BYTE[ turn ];
		for( i=0;i<turn;i++)
		{
			str = strText.Mid( i*3, 3 );
			WCHAR ch = str.GetAt(0);
			if( ch >= 97 && ch <=102 )
			{
				pBuf[i] = (ch - 87)*16;
			}
			else
			{
				pBuf[i] = (ch - 48)*16;
			}

			ch = str.GetAt(1);
			if( ch >= 97 && ch <=102 )
			{
				pBuf[i] += (ch - 87);
			}
			else
			{
				pBuf[i] += (ch - 48);
			}
		}

		/*************************************************/
		double dCpuHz=1.8;
		long HighStart,LowStart,HighEnd,LowEnd;
		unsigned long numhigh,numlow;
		
		//获取代码运行开始时cpu内部计数器的值
		__asm              
		{
			RDTSC 
				mov HighStart, edx
				mov LowStart, eax
		}
		/*************************************************/
		if( m_nSeltype == 0 )
		{
			for( j=0;j<TURN;j++)
			{
				for(i=0;i<turn/16;i++)
				{
					m_aes.Decrypt( pBuf + i*16, sRes + i*16 );
				}
			}
		}
		else
		{
			for( j=0;j<TURN;j++)
			{
				m_aes.Init( m_aesKey );
				for(i=0;i<turn/16;i++)
				{
					m_aes.Decrypt( pBuf + i*16, sRes + i*16 );
				}
			}
		}

		/*************************************************************/
		__asm
		{
			RDTSC
				mov HighEnd, edx
				Mov LowEnd,  eax
				;获取两次计数器值得差
				sub eax,  LowStart
				cmp    eax,  0       ; 如果低32的差为负则求反,因为第二次取得永远比第一次的大
				jg     L3
				neg     eax 
				jmp     L4
				L3: mov numlow,  eax
				L4: sbb edx,  HighStart
			mov numhigh, edx
		}
		m_dwCycle = numhigh * pow( 2.0,32 ) + numlow;			m_dwCycle /= TURN;
		m_dwTime = m_dwCycle/dCpuHz/1000000000;					m_dwTime  /= TURN;
		m_dwSpeed = turn/(m_dwCycle/dCpuHz/1000000000)/1024;
		/***************************************************************/

		delete []pBuf;

		CString strRes( sRes );
		m_strPlain2 = strRes;
		delete []sRes;
	}
	UpdateData(0);
	return 1;
}

void CCyptDlg::OnBnClickedButtonDecrypt()
{
	UpdateData();
	m_strPlain2.Empty();
	if( m_nSel == 0 )
	{
		CString strKey( m_strPsw );
		int i,len = m_strPsw.GetLength();
		BYTE key[17];
		if( len > 16 )
		{
			len = 16;
			strKey = m_strPsw.Left(16);
		}
		WideCharToMultiByte(	CP_ACP,
								WC_COMPOSITECHECK,
								strKey.GetBuffer(len),
								len,
								(LPSTR)key,
								len,
								NULL,
								NULL
							);
		for( i=len;i<16;i++)
			key[i]=i;
		m_aes.Init( key );
		AESDeEncrypt( m_strCipher, 0);
	}
	else
	{
		CString strKey( m_strPsw );
		int i,len = m_strPsw.GetLength();
		BYTE key[9];
		if( len > 8 )
		{
			len = 8;
			strKey = m_strPsw.Left(8);
		}
		WideCharToMultiByte(	CP_ACP,
								WC_COMPOSITECHECK,
								strKey.GetBuffer(len),
								len,
								(LPSTR)key,
								len,
								NULL,
								NULL
							);
		for( i=len;i<8;i++)
			key[i]=i;

		short unsigned keys[9];
		for( i=0;i<8;i++)
			keys[i+1] = key[i];
		m_idea.Init( keys );
		IDEADeEncrypt( m_strCipher, 0);
	}
}

void CCyptDlg::OnCbnSelchangeComboAlgri()
{
	m_nSel = m_comboAlgi.GetCurSel();
}

void CCyptDlg::OnCbnSelchangeComboTesttype()
{
	m_nSeltype = m_comboTesttype.GetCurSel();
}

⌨️ 快捷键说明

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