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

📄 des.cpp

📁 单钥密码算法 AES DES IDEA LZW RC5
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		RCL ECX,1

		BT EAX,5
		RCL ECX,1
		BT EAX,12
		RCL ECX,1
		BT EAX,19
		RCL ECX,1
		BT EAX,26
		RCL ECX,1
		
		BT EBX,4	;5
		RCL ECX,1
		BT EBX,11
		RCL ECX,1
		BT EBX,18
		RCL ECX,1
		BT EBX,25
		RCL ECX,1

		BT EAX,4
		RCL ECX,1
		BT EAX,11
		RCL ECX,1
		BT EAX,18
		RCL ECX,1
		BT EAX,25
		RCL ECX,1

		BT EBX,3	;7
		RCL ECX,1
		BT EBX,10
		RCL ECX,1
		BT EBX,17
		RCL ECX,1
		BT EBX,24
		RCL ECX,1

		BT EBX,0	;1
		RCL EDX,1
		BT EBX,7
		RCL EDX,1
		BT EBX,14
		RCL EDX,1
		BT EBX,21
		RCL EDX,1

		BT EAX,0	
		RCL EDX,1
		BT EAX,7
		RCL EDX,1
		BT EAX,14
		RCL EDX,1
		BT EAX,21
		RCL EDX,1

		BT EBX,1	;3	
		RCL EDX,1
		BT EBX,8
		RCL EDX,1
		BT EBX,15
		RCL EDX,1
		BT EBX,22
		RCL EDX,1

		BT EAX,1
		RCL EDX,1
		BT EAX,8
		RCL EDX,1
		BT EAX,15
		RCL EDX,1
		BT EAX,22
		RCL EDX,1
		
		BT EBX,2	;5
		RCL EDX,1
		BT EBX,9
		RCL EDX,1
		BT EBX,16
		RCL EDX,1
		BT EBX,23
		RCL EDX,1

		BT EAX,2
		RCL EDX,1
		BT EAX,9
		RCL EDX,1
		BT EAX,16
		RCL EDX,1
		BT EAX,23
		RCL EDX,1

		BT EBX,3	;7	
		RCL EDX,1
		BT EBX,10
		RCL EDX,1
		BT EBX,17
		RCL EDX,1
		BT EBX,24
		RCL EDX,1
		
		MOV DWORD PTR tempkey+4,ECX
		MOV DWORD PTR tempkey,EDX
	}
	key=tempkey;
}

_inline _int64 Expansion(unsigned long input)
{
	_int64 temp;
	
	_asm
	{
		XOR EDX,EDX
		LEA EBX,E_Box
		MOV EAX,input
		MOV CH,24
AGAIN1:	MOV CL,[EBX]
		ROL EAX,CL
		RCL EDX,1
		INC EBX
		DEC CH
		JNZ AGAIN1
		MOV DWORD PTR temp+4,EDX
		MOV CH,24
AGAIN2:	MOV CL,[EBX]
		ROL EAX,CL
		RCL EDX,1
		INC EBX
		DEC CH
		JNZ AGAIN2
		MOV DWORD PTR temp,EDX
	}
	return temp;
}

_inline _int64 Compression(_int64 key)
{
	_int64 temp;
	_asm
	{
		MOV EAX,DWORD PTR key+4
		MOV EBX,DWORD PTR key
		
		BT EAX,14
		RCL ECX,1
		BT EAX,11
		RCL ECX,1
		BT EAX,17
		RCL ECX,1
		BT EAX,4
		RCL ECX,1

		BT EAX,27
		RCL ECX,1
		BT EAX,23
		RCL ECX,1
		BT EAX,25
		RCL ECX,1
		BT EAX,0
		RCL ECX,1

		BT EAX,13
		RCL ECX,1
		BT EAX,22
		RCL ECX,1
		BT EAX,7
		RCL ECX,1
		BT EAX,18
		RCL ECX,1
		
		BT EAX,5
		RCL ECX,1
		BT EAX,9
		RCL ECX,1
		BT EAX,16
		RCL ECX,1
		BT EAX,24
		RCL ECX,1
		
		BT EAX,2
		RCL ECX,1
		BT EAX,20
		RCL ECX,1
		BT EAX,12
		RCL ECX,1
		BT EAX,21
		RCL ECX,1
		
		BT EAX,1
		RCL ECX,1
		BT EAX,8
		RCL ECX,1
		BT EAX,15
		RCL ECX,1
		BT EAX,26
		RCL ECX,1
		
		BT EBX,15
		RCL EDX,1
		BT EBX,4
		RCL EDX,1
		BT EBX,25
		RCL EDX,1
		BT EBX,19
		RCL EDX,1
		
		BT EBX,9
		RCL EDX,1
		BT EBX,1
		RCL EDX,1
		BT EBX,26
		RCL EDX,1
		BT EBX,16
		RCL EDX,1
		
		BT EBX,5
		RCL EDX,1
		BT EBX,11
		RCL EDX,1
		BT EBX,23
		RCL EDX,1
		BT EBX,8
		RCL EDX,1
		
		BT EBX,12
		RCL EDX,1
		BT EBX,7
		RCL EDX,1
		BT EBX,17
		RCL EDX,1
		BT EBX,0
		RCL EDX,1
		
		BT EBX,22
		RCL EDX,1
		BT EBX,3
		RCL EDX,1
		BT EBX,10
		RCL EDX,1
		BT EBX,14
		RCL EDX,1
		
		BT EBX,6
		RCL EDX,1
		BT EBX,20
		RCL EDX,1
		BT EBX,27
		RCL EDX,1
		BT EBX,24
		RCL EDX,1

		MOV DWORD PTR temp+4,ECX
		MOV DWORD PTR temp,EDX
	}
	return temp;
}

void desenc(unsigned long& LData,unsigned long& RData,
			unsigned long& LKey,unsigned long& RKey)
{
	unsigned long per,Rnext;
	_int64 exp,cmp,key_64=LKey;
	key_64=(key_64<<32)|RKey;
	int i;

	Sub_Key(key_64);
	for(i=0;i<15;i++)
	{
		exp=Expansion(RData);
		RotateL(key_64,i);
		cmp=Compression(key_64);
		exp^=cmp;
		per=Substitution(exp);
		Rnext=LData^per;
		LData=RData;
		RData=Rnext;
	}
	exp=Expansion(RData);
	RotateL(key_64,i);
	cmp=Compression(key_64);
	exp^=cmp;
	per=Substitution(exp);
	LData^=per;
}

void desdec(unsigned long& LData,unsigned long& RData,
			unsigned long& LKey,unsigned long& RKey)
{
	int i;
	unsigned long per,Rnext;
	_int64 exp,cmp,key_64=LKey;
	key_64=(key_64<<32)|RKey;

	Sub_Key(key_64);
	for(i=0;i<15;i++)
	{
		exp=Expansion(RData);
		RotateR(key_64,i);
		cmp=Compression(key_64);
		exp^=cmp;
		per=Substitution(exp);
		Rnext=LData^per;
		LData=RData;
		RData=Rnext;
	}
	exp=Expansion(RData);
	RotateR(key_64,i);
	cmp=Compression(key_64);
	exp^=cmp;
	per=Substitution(exp);
	LData^=per;
}

void rebuild_s_box(unsigned long& LExKey,
				   unsigned long& RExKey)
{
	unsigned long temp_LExKey=LExKey;
	int i,j;
	for(j=0;j<64;j++)
		S_Box[0][j]=ogn_S_Box[1][j];
	for(j=0;j<64;j++)
		S_Box[1][j]=ogn_S_Box[3][j];
	for(j=0;j<64;j++)
		S_Box[2][j]=ogn_S_Box[5][j];
	for(j=0;j<64;j++)
		S_Box[3][j]=ogn_S_Box[6][j];
	for(j=0;j<64;j++)
		S_Box[4][j]=ogn_S_Box[2][j];
	for(j=0;j<64;j++)
		S_Box[5][j]=ogn_S_Box[0][j];
	for(j=0;j<64;j++)
		S_Box[6][j]=ogn_S_Box[4][j];
	for(j=0;j<64;j++)
		S_Box[7][j]=ogn_S_Box[7][j];
	_int8 xchgflag[16]=
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	_asm
	{
		MOV EAX,temp_LExKey
		MOV ECX,15
NEXT:	BT EAX,ECX
		RCL xchgflag[ECX],1
		LOOP NEXT
		BT EAX,ECX
		RCL xchgflag[ECX],1
	}
	_int32 mask[8]=
	{0xf0000000,0xf000000,0xf00000,0xf0000,
	0xf000,	0xf00,	  0xf0,    0xf};
	for(i=0;i<8;i++)
	{
		if(xchgflag[i+i])
		{
			//Exchange tow lines.
			for(j=0;j<64;++j,++j)
			{
				S_Box[i][j]^=S_Box[i][j+1];
				S_Box[i][j+1]^=S_Box[i][j];
				S_Box[i][j]^=S_Box[i][j+1];
			}
		}
		if(xchgflag[i+i+1])
		{
			//Exchange four rows.
			for(j=0;j<32;j++)
			{
				S_Box[i][j]^=S_Box[i][j+32];
				S_Box[i][j+32]^=S_Box[i][j];
				S_Box[i][j]^=S_Box[i][j+32];
			}
		}
		for(j=0;j<64;j++)
		{
			S_Box[i][j]^=RExKey&mask[i];
		}
	}
	temp_LExKey=0;
}

void reset_s_box()
{
	for(int i=0;i<8;i++)
		for(int j=0;j<64;j++)
			S_Box[i][j]=ogn_S_Box[i][j];
}

long isweakkey(unsigned long& LKey,unsigned long& RKey)
{
	for(int i=0;i<128;++i,++i)
	{
		if(WeakKeys[i]==LKey&&WeakKeys[i+1]==RKey)
			return 0xffffffff;
	}
	return 0;
}

void init_enc_cmpkeys(unsigned long& LKey,
					  unsigned long& RKey,
					  _int64* compressed_enc_key)
{
	_int64 key_64=LKey;

	key_64=(key_64<<32)|RKey;
	Sub_Key(key_64);
	for(int i=0;i<16;i++)
	{
		RotateL(key_64,i);
		compressed_enc_key[i]=Compression(key_64);
	}
}

void init_dec_cmpkeys(unsigned long& LKey,
					  unsigned long& RKey,
					  _int64* compressed_dec_key)
{
	_int64 key_64=LKey;

	key_64=(key_64<<32)|RKey;
	Sub_Key(key_64);
	for(int i=0;i<16;i++)
	{
		RotateR(key_64,i);
		compressed_dec_key[i]=Compression(key_64);
	}
}
void fast_desenc(unsigned long& LData,unsigned long& RData,
				 _int64* compressed_enc_key)
{
	int i;
	unsigned long per,Rnext;
	_int64 exp;

	for(i=0;i<15;i++)
	{
		exp=Expansion(RData);
		exp^=compressed_enc_key[i];
		per=Substitution(exp);
		Rnext=LData^per;
		LData=RData;
		RData=Rnext;
	}
	exp=Expansion(RData);
	exp^=compressed_enc_key[i];
	per=Substitution(exp);
	LData^=per;
}

void fast_desdec(unsigned long& LData,unsigned long& RData,
				 _int64* compressed_dec_key)
{
	int i;
	unsigned long per,Rnext;
	_int64 exp;

	for(i=0;i<15;i++)
	{
		exp=Expansion(RData);
		exp^=compressed_dec_key[i];
		per=Substitution(exp);
		Rnext=LData^per;
		LData=RData;
		RData=Rnext;
	}
	exp=Expansion(RData);
	exp^=compressed_dec_key[i];
	per=Substitution(exp);
	LData^=per;
}

⌨️ 快捷键说明

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