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

📄 cryptogram.cpp

📁 3des算法进行加解密并使用MD5进行相关签名算法
💻 CPP
字号:
// cryptogram.cpp: implementation of the Ccryptogram class.
//
//////////////////////////////////////////////////////////////////////
#include "memory.h"
#include "md5.h"
#include "cryptogram.h"
#include "d3des.h"
#define   CREPTY_VER   0x01 
/* 函数说明:这个函数是产生签名的时候调用
 * 参数说明:wPlainLen   :明文长度
 *			 pbyPlain    :指向明文的指针
 *			 wSignLen    :签名长度
 *			 pbySign     :指向签名的指针
 *	返回值: 0x00 :成功
 *	         0x01 :作签名失败
 *			 0x02 :存放签名的空间太小
 *
 */
unsigned char  TFCA_CreatSign(unsigned short wPlainLen, unsigned char *pbyPlain,
							  unsigned short wSignLen, unsigned char *pbySign)
{
	if(wSignLen < 16)
		return 0x02;
	if(TFCA_MD5(pbyPlain,wPlainLen,pbySign) != 0x00)
		return 0x01;
	return 0x00;
}

/* 函数说明:这个函数是验证签名的时候调用
 * 参数说明:wPlainLen   :明文长度
 *			 pbyPlain    :指向明文的指针
 *			 wSignLen    :签名长度
 *			 pbySign     :指向签名的指针
 *	返回值: 0x00 :签名有效
 *	         0x01 :作签无效
 *			 0x02 : 其它错误
 */
unsigned char  TFCA_VerifySign(unsigned short wPlainLen, unsigned char *pbyPlain,
							   unsigned short wSignLen, unsigned char *pbySign)
{
	unsigned char NewSing[16] = {0};
	if(wSignLen != 16)
		return 0x01;
	if(TFCA_CreatSign(wPlainLen,pbyPlain,16,NewSing) != 0)
		return  0x02;
	for(int i = 0; i < 16 ;i++)
	{
		if(pbySign[i] != NewSing[i])
			return 0x01;
	}
	return 0x00;
}
bool DES(bool bEnspot, bool bTriDES,  unsigned char* pbyKey,int nLength, unsigned char* pbySource, unsigned char* pbyTarget)
{
	if(nLength==0 || nLength%8)
		return false;
	int section = nLength/8;
	if(bTriDES){
		des2key(pbyKey,bEnspot?EN0:DE1);
		for(int i = 0 ;i<section;i++)
			Ddes(pbySource+8*i,pbyTarget+8*i);
	}
	else{
		deskey(pbyKey,bEnspot?EN0:DE1);
		for(int i = 0 ;i<section;i++)
			des(pbySource+8*i,pbyTarget+8*i);
	}
	return true;
}
unsigned char  TFCA_Encrypt(unsigned char byKeyType,unsigned short wKeyLen,
							unsigned char *pbyKey,unsigned short wPlainLen, unsigned char *pbyPlain,
						    unsigned short *pwEncryptLen, unsigned char *pbyEncrypt)
{
	int wFillLen = 0;

	wFillLen = ((wPlainLen + 16)) % 64;
	if(wFillLen > 0)
		wFillLen = 64 - wFillLen;
	if(byKeyType == 0x00)
	{
		if(wKeyLen != 16)
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x03;
		}
		
		if((*pwEncryptLen) < (wPlainLen + 16 + wFillLen))
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x02;
		}
		/*首先附加签名*/
		memcpy(pbyEncrypt , pbyPlain , wPlainLen );
		for(int i = 0 ; i < wFillLen; i++)
			pbyEncrypt[wPlainLen + i] = 0xf0;

		wPlainLen += wFillLen;
		if(TFCA_CreatSign(wPlainLen,pbyEncrypt,16,&pbyEncrypt[wPlainLen]) != 0x00)
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x01;
		}
		wPlainLen += 16;
		if(!DES(true,true,pbyKey,wPlainLen,pbyEncrypt,pbyEncrypt))
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x04;
		}
	}
	else if(byKeyType == 0x01)
	{
		if(wKeyLen != 8)
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x03;
		}
		
		if((*pwEncryptLen) < (wPlainLen + 16 + wFillLen))
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x02;
		}
		/*首先附加签名*/
		memcpy(pbyEncrypt , pbyPlain , wPlainLen );
		for(int i = 0 ; i < wFillLen; i++)
			pbyEncrypt[wPlainLen + i] = 0xf0;

		wPlainLen += wFillLen;
		if(TFCA_CreatSign(wPlainLen,pbyEncrypt,16,&pbyEncrypt[wPlainLen]) != 0x00)
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x01;
		}
		wPlainLen += 16;
		if(!DES(true,false,pbyKey,wPlainLen,pbyEncrypt,pbyEncrypt))
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x04;
		}
	}
	else
	{
		if((*pwEncryptLen) < (wPlainLen + 16))
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x02;
		}
		/*首先附加签名*/
		memcpy(pbyEncrypt , pbyPlain , wPlainLen );
		if(TFCA_CreatSign(wPlainLen,pbyEncrypt,16,&pbyEncrypt[wPlainLen]) != 0x00)
		{
			memset(pbyEncrypt, 0 ,*pwEncryptLen);
			*pwEncryptLen = 0x00;
			return 0x01;
		}
		wPlainLen += 16;;
	}
	*pwEncryptLen = wPlainLen;
	return 0x00;
}


unsigned char  TFCA_Decrypt(unsigned char byEncrypVer,unsigned char byKeyType,unsigned short wKeyLen,
							unsigned char *pbyKey,unsigned short *pwPlainLen, unsigned char *pbyPlain,
						    unsigned short wEncryptLen, unsigned char *pbyEncrypt)
{
	bool   bIsRootKet = false;
	if(byEncrypVer != CREPTY_VER)
	{
		*pwPlainLen = 0;
		return 0x01;
	}

	if(byKeyType == 0x00)
	{/*根密钥*/
		bIsRootKet = true;
		if(wKeyLen != 16)
		{
			*pwPlainLen = 0;
			return 0x03;
		}
	}
	else if(byKeyType == 0x01)
	{/*会话密钥*/
		if(wKeyLen != 8)
		{
			*pwPlainLen = 0;
			return 0x03;
		}
	}
	else/*不加密*/
	{
		if((*pwPlainLen) < wEncryptLen)
		{
			*pwPlainLen = 0;
			return 0x03;
		}
		*pwPlainLen = wEncryptLen;
		memcpy(pbyPlain,pbyEncrypt,wEncryptLen);
		(*pwPlainLen) = wEncryptLen-16;
		if(TFCA_VerifySign(*pwPlainLen,pbyPlain,16,&pbyPlain[*pwPlainLen]) != 0 )
		{
			*pwPlainLen = 0;
			return 0x02;
		}
		return 0x00;
	}

	if((*pwPlainLen) < wEncryptLen)
	{
		*pwPlainLen = 0;
		return 0x03;
	}

	if(!DES(false,bIsRootKet,pbyKey,wEncryptLen,pbyEncrypt,pbyPlain) != 0)
	{
		*pwPlainLen = 0;
		return 0x04;
	}
	if(wEncryptLen <= 16)
	{
		*pwPlainLen = 0;
		return 0x05;
	}
	(*pwPlainLen) = wEncryptLen-16;
	if(TFCA_VerifySign(*pwPlainLen,pbyPlain,16,&pbyPlain[*pwPlainLen]) != 0 )
	{
		*pwPlainLen = 0;
		return 0x02;
	}
	return 0x00;
}

unsigned char  TFCA_GetVer()
{
	return CREPTY_VER;
}

unsigned long  MCoef_32[2]={0xE7BD2160,0xDA3A2A9C};
// 两个小m序列系数

// dwMset: 随机发生器所使用的小m序列
// dwKey: 随机数种子
// nNumber: 产生的随机序列长度(以DWORD为单位)
// pdwRandom: 指向随机数存储空间的指针
// return value: 运算完成之后随机数发生器的状态
unsigned long  m_Seq_32_m(unsigned long  dwMset,unsigned long  dwKey,int nNumber, unsigned long  * pdwRandom)
{
_asm
	{
		CLD
		MOV EDI,pdwRandom;
		MOV ECX,nNumber;
		MOV ESI,dwMset;
		MOV EAX,dwKey;
		ALIGN 4
		LOOP_CIRCLE1:
		PUSH ECX
		MOV ECX,32
		LOOP_CIRCLE2:
		MOV EBX,EAX;
		SHL EAX,1
		AND EBX,ESI; //select the bit for xor
		MOV EDX,EBX;
		BSWAP EBX;
		XOR BX,DX;
		XOR BH,BL; // because P only judge one byte
		// so must XOR to judge the p of whole word
		JP NEXT //jp equals the xor
		INC EAX
		NEXT: DEC ecx
		JNZ LOOP_CIRCLE2
		POP ECX
		STOSD
		DEC ECX
		JNZ LOOP_CIRCLE1
		MOV dwKey,EAX
	}
	return dwKey;
}

// 产生长度为nLength字节的随机数
// Buffer: 指向随机数存放区域的指针
// nLength: 产生随机数数量
void RandomGenerator(unsigned char * Buffer, int nlength)
{
	unsigned long  A;
	unsigned char B[4];
	_asm
	{
		_emit 0x0f
		_emit 0x31
		MOV A,EAX
	}
	A=m_Seq_32_m(MCoef_32[0],A,nlength/4,(unsigned long*)Buffer);
	if(nlength%4!=0)
	{
		m_Seq_32_m(MCoef_32[0],A,1,(unsigned long*)B);
		memcpy(Buffer+(nlength/4)*4,B,nlength%4);
	}
	return;
} 
unsigned char  TFCA_CreateKey(unsigned short *pwKeyLen,unsigned char *pKey)
{
	if(*pwKeyLen < 8)
		return 0x02;
	*pwKeyLen = 8;
	RandomGenerator(pKey,*pwKeyLen);
	return 0;
}

⌨️ 快捷键说明

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