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

📄 idea.cpp

📁 IDEA加密算法
💻 CPP
字号:
#include "stdafx.h"
#include "IDEA.h"

CIDEA::CIDEA()
{
	wKeySeed[ 0 ] = 0x1dd2;	wKeySeed[ 1 ] = 0x3004;	wKeySeed[ 2 ] = 0x745b;	wKeySeed[ 3 ] = 0x5981;
	wKeySeed[ 4 ] = 0x6abd;	wKeySeed[ 5 ] = 0x2f74;	wKeySeed[ 6 ] = 0x0d0e;	wKeySeed[ 7 ] = 0x1498;
}

CIDEA::~CIDEA()
{

}

//WORD CIDEA:: wKeySeed [ ] = { 0x0102 , 0x0304 , 0x0506 , 0x0708 , 0x090a , 0x0b0c , 0x0d0e , 0x0f10 } ;

/* 两数相加,模65536 */
WORD CIDEA::Addition(WORD wNum1, WORD wNum2)
{
	return ( wNum1 + wNum2 ) ;
}

/* 两数相乘,模65537 */ 
WORD CIDEA::Multiplication(WORD wNum1, WORD wNum2)
{
	if ( ! wNum1 && ! wNum2 ) 
		return 0 ;
	else if ( ! wNum1 ) 
		return ( WORD ) ( (  wNum2 * CARDINALITY ) % ( CARDINALITY + 1 ) ) ;          
	else if ( ! wNum2 ) 
		return ( WORD ) ( (  wNum1 * CARDINALITY ) % ( CARDINALITY + 1 ) ) ;          
	else 
		return ( WORD ) ( ( ( DWORD ) wNum1 * wNum2 ) % ( CARDINALITY + 1 ) ) ;          
}

/* 利用辗转相除法,求一个数模65537的逆 */
WORD CIDEA::Inverse(WORD wNum)
{
	DWORD dwQuotient ;								// 商
	DWORD dwResidual ;								// 余
	DWORD dwDividend = CARDINALITY + 1 ;			// 被除数
	DWORD dwDivisor = ( DWORD ) wNum ;				// 除数
	DWORD dwResult ;								// 结果
	DWORD dwValue1 = 1 , dwValue2 ;					// 中间值	
	
	if ( wNum <=1 ) 
		return wNum ;
	dwResult = dwValue2 = dwDividend / dwDivisor ;
	dwResidual = dwDividend % dwDivisor ;
	dwDividend = dwDivisor ;
	dwDivisor = dwResidual ;
	dwQuotient = dwDividend / dwDivisor ;
	dwResidual = dwDividend % dwDivisor ;
	while ( dwResidual )
	{
		dwResult = dwQuotient * dwValue2 + dwValue1 ;
		dwValue1 = dwValue2 ;
		dwValue2 = dwResult ;
		dwDividend = dwDivisor ;
		dwDivisor = dwResidual ;
		dwQuotient = dwDividend / dwDivisor ;
		dwResidual = dwDividend % dwDivisor ;
	}
	if ( ( ( dwResult * wNum ) % ( CARDINALITY + 1 ) ) == CARDINALITY )
	{
		int nModular = - ( int ) dwResult ;
		while ( ( nModular += ( CARDINALITY + 1 ) ) <= 0 ) ;
		dwResult = nModular ;
	}
	return ( WORD ) dwResult ;
}

/* 循环左移25位,生成一组密钥子块 */
void CIDEA::GenSubKey( )
{
/*	DWORD dwSave , dwTemp ;
	DWORD * pdwShift =( DWORD * ) wKeySeed ;
	short sPos ;
	
	dwSave = pdwShift [ 0 ] >> ( 8 * sizeof ( DWORD ) - SHIFTLEFT ) ;
	for ( sPos = 1 ;sPos < BLOCKSIZE ; sPos ++ )
	{
		dwTemp = dwSave ;
		dwSave = pdwShift [ sPos ] >> ( 8 * sizeof ( DWORD ) - SHIFTLEFT ) ;
		pdwShift [ sPos ] = ( pdwShift [ sPos ] << SHIFTLEFT ) | dwTemp ;
	}
	pdwShift [ 0 ] = ( pdwShift [ 0 ] << SHIFTLEFT ) | dwSave ;
*/
	WORD wSave , wTemp ;
	WORD * pwShift = wKeySeed ;
	short sPos ;

	wSave = pwShift [ 0 ] ;
	wTemp = pwShift [ 1 ] ;
	for ( sPos = 1 ; sPos < ROUND - 1; sPos ++ )
	{
		pwShift [ sPos - 1 ] = ( pwShift [ sPos ]  << 9 ) | ( pwShift [ sPos + 1 ] >> 7 ) ;
	}
    pwShift [ sPos - 1 ] = ( pwShift [ sPos ] << 9 ) | ( wSave >> 7 ) ;
	pwShift [ sPos ] = ( wSave << 9 ) | ( wTemp >> 7 ) ;

}

/* 生成全部密钥*/
void CIDEA::GenEncryptKey( ) 
{
	short sTimes , sPos , sLength = ROUND ;
	
	for ( sPos = 0 ; sPos < sLength ; sPos ++ )
	{
		pwEncryptKey [ sPos ] =	wKeySeed [ /*ROUND - 1 -*/ sPos ] ;
	}
	for ( sTimes = 1 ; sTimes <= SUBKEYSIZE ; sTimes ++ )
	{
		GenSubKey ( ) ;
		if ( SUBKEYSIZE == sTimes )
			sLength = ROUND / 2 ;
		else
			sLength = ROUND ;
		for ( sPos = 0 ; sPos < sLength ; sPos ++ )
		{
			pwEncryptKey [ sTimes * ROUND + sPos ] = wKeySeed [ /*ROUND - 1 -*/ sPos ] ;
		}
	}
}

/* 单轮迭代 */
void CIDEA::Iteration( short sTurn , bool bCrypt )
{
	short sPos ;
	WORD wSubKey [ SUBKEYSIZE ];
	WORD wMidValue [ 10 ] ;
	WORD * pwKey , * wInputText , * wOutputText;
	
	if ( bCrypt )
	{
		wInputText = wCleartext ;
		pwKey = pwEncryptKey ;
		wOutputText = wCiphertext ;
	}
	else
	{
		wInputText = wCiphertext ;
		pwKey = pwDecryptKey ;
		wOutputText = wCleartext ;
	}
	if ( sTurn < ROUND )
	{
		/* 单轮执行过程 */
		for ( sPos = 0 ; sPos < SUBKEYSIZE ; sPos ++ ) 
		{
			wSubKey [ sPos ] = pwKey [ sTurn * SUBKEYSIZE + sPos ] ;
		}
		wMidValue [ 0 ] = Multiplication ( wInputText [ 0 ] ,wSubKey [ 0 ] ) ;
		wMidValue [ 1 ] = Addition ( wInputText [ 1 ] , wSubKey [ 1 ] ) ;
		wMidValue [ 2 ] = Addition ( wInputText [ 2 ] , wSubKey [ 2 ] ) ;
		wMidValue [ 3 ] = Multiplication ( wInputText [ 3 ] ,wSubKey [ 3 ] ) ;
		wMidValue [ 4 ] = wMidValue [ 0 ] ^ wMidValue [ 2 ] ;
		wMidValue [ 5 ] = wMidValue [ 1 ] ^ wMidValue [ 3 ] ;
		wMidValue [ 6 ] = Multiplication ( wMidValue [ 4 ] , wSubKey [ 4 ] ) ;
		wMidValue [ 7 ] = Addition ( wMidValue [ 5 ] , wMidValue [ 6 ] ) ;
		wMidValue [ 8 ] = Multiplication ( wMidValue [ 7 ] , wSubKey [ 5 ] ) ;
		wMidValue [ 9 ] = Addition ( wMidValue [ 6 ] , wMidValue [ 8 ] ) ;
		
		/* 单轮输出 */
		wInputText [ 0 ] = wMidValue [ 0 ] ^ wMidValue [ 8 ] ;
		wInputText [ 1 ] = wMidValue [ 2 ] ^ wMidValue [ 8 ] ;
		wInputText [ 2 ] = wMidValue [ 1 ] ^ wMidValue [ 9 ] ;
		wInputText [ 3 ] = wMidValue [ 3 ] ^ wMidValue [ 9 ] ;
	}
	else
	{
		/* 最后输出子块 */
		for ( sPos = 0 ; sPos < ROUND / 2 ; sPos ++ ) 
		{
			wSubKey [ sPos ] = pwKey [ sTurn * SUBKEYSIZE + sPos ] ;
		}
		wOutputText [ 0 ] = Multiplication ( wInputText [ 0 ] , wSubKey [ 0 ] ) ;
		wOutputText [ 1 ] = Addition ( wInputText [ 2 ] , wSubKey [ 1 ] ) ;
		wOutputText [ 2 ] = Addition ( wInputText [ 1 ] , wSubKey [ 2 ] ) ;
		wOutputText [ 3 ] = Multiplication ( wInputText [ 3 ] , wSubKey [ 3 ] ) ;
	}
}

/* 对一组明文块进行加密 */
void CIDEA::Ciphering( )
{
	short sTurn ;
	
	for ( sTurn = 0 ; sTurn <= ROUND ; sTurn ++ )
	{
		Iteration  ( sTurn , true ) ;
	}
}

/* 生成解密密钥 */
void CIDEA::GenDecryptKey( )
{
	short sTurn ;

	GenEncryptKey ( ) ;				// 生成加密密钥

	/* 由加密密钥生成解密密钥 */
	for ( sTurn = 0 ; sTurn < ROUND ; sTurn ++ )
	{
		/* 生成8轮迭代解密密钥 */
		pwDecryptKey [ sTurn * SUBKEYSIZE ] = Inverse ( pwEncryptKey [ ( ROUND - sTurn ) * SUBKEYSIZE ] ) ;
		if( sTurn )
		{
			pwDecryptKey [ sTurn * SUBKEYSIZE + 1 ] = - pwEncryptKey [ ( ROUND - sTurn ) * SUBKEYSIZE + 2 ] ;
			pwDecryptKey [ sTurn * SUBKEYSIZE + 2 ] = - pwEncryptKey [ ( ROUND - sTurn ) * SUBKEYSIZE + 1 ] ;
		}
		else
		{
			pwDecryptKey [ sTurn * SUBKEYSIZE + 1 ] = - pwEncryptKey [ ( ROUND - sTurn ) * SUBKEYSIZE + 1 ] ;
			pwDecryptKey [ sTurn * SUBKEYSIZE + 2 ] = - pwEncryptKey [ ( ROUND - sTurn ) * SUBKEYSIZE + 2 ] ;
		}

		pwDecryptKey [ sTurn * SUBKEYSIZE + 3 ] = Inverse ( pwEncryptKey [ ( ROUND - sTurn ) * SUBKEYSIZE + 3 ] ) ;
		pwDecryptKey [ sTurn * SUBKEYSIZE + 4 ] = pwEncryptKey [ ( ROUND - 1 - sTurn ) * SUBKEYSIZE + 4 ] ;
		pwDecryptKey [ sTurn * SUBKEYSIZE + 5 ] = pwEncryptKey [ ( ROUND - 1 - sTurn ) * SUBKEYSIZE + 5 ] ;

	}

	/* 生成输出密钥 */
	pwDecryptKey [ sTurn * SUBKEYSIZE     ] = Inverse ( pwEncryptKey [ 0 ] );
	pwDecryptKey [ sTurn * SUBKEYSIZE + 1 ] = - pwEncryptKey [ 1 ] ;
	pwDecryptKey [ sTurn * SUBKEYSIZE + 2 ] = - pwEncryptKey [ 2 ] ;
	pwDecryptKey [ sTurn * SUBKEYSIZE + 3 ] = Inverse ( pwEncryptKey [ 3 ] );
}

/* 对一组密文块进行解密 */
void CIDEA::Deciphering( )
{
	short sTurn ;

	for ( sTurn = 0 ; sTurn <= ROUND ; sTurn ++ )
	{
		Iteration  ( sTurn , false ) ;			// 单轮迭代
	}

}

void CIDEA::SetNewKey( WORD * pwKeySeed, int nCount )
{
	nCount = min( nCount, ROUND );
	for( int i = 0; i < nCount; i ++ )
	{
		wKeySeed[ i ] = pwKeySeed[ i ];
	}
	GenDecryptKey( );
}

⌨️ 快捷键说明

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