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

📄 1-tst-interfacr.cpp

📁 一个SCSI的编程
💻 CPP
字号:
#include<stdio.h>
#include"3DES-WjcDes.cpp"
#include<time.h>
#include"rc4.cpp"

///////////////////////////////////////////////
//static bool SubKey[2][16][48];// 16圈子密钥
static int readbyte=0;
///////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////
int En_encryption(unsigned char *uchIn,unsigned char *uchOut,unsigned int iPatten,const char *KEY, int iEncryptionAlgorithm);
int En_decryption(unsigned char *uchIn, 
		unsigned char *uchOut, 
		unsigned int iPatten, 
		unsigned char *KEY, 
		int iEncryptionAlgorithm);
void IntToBit(bool *bOut,unsigned int uiIn,int iBits);
void StartKey(const char* KEY, int iLen,int iEncryptionAlgorithm);
void start_rc4_key1(unsigned char *uchOut,const char *KEY,unsigned char *uchIv);
////////////////////////////////////////////////////////////////////////////////////////////


/*return 0:encrypt successful
 	 1:false of encrypt
*uchIn:the original text
*uchOut:the encrypted text
iPatten:encrypt mode,16bits
每个bit对应一个8字节的数据单元,共128字节;
		当对应的位是1,该数据单元加密;
		对应的字节是0,该数据单元不加密;
		例如:	iPatten 是 FF00, 表示128个字节中的前64字节加密,后64字节不加密
			iPatten 是 AAAA, 表示每隔8个字节加密一次
			iPatten 是 FFFF,表示所有的字节加密
			iPatten 是 0000,表示所有的字节不加密
	*KEY,加密使用的密钥,和算法对应
	encryption_algorithm  加密算法,是DES, TRIPLE_DES
*/
int En_encryption(unsigned char *uchIn,unsigned char *uchOut,unsigned int iPatten,const char *KEY,int iEncryptionAlgorithm)
{
	
	bool bPTmp[16];
	int i,j,iDataLen=0,iKeyLen=0;
	clock_t startd,endd;
	double iElaspedd=0;
	unsigned char uchRc4Seed[128];
	unsigned char uchTMP[256];
	unsigned char uchIv[3];


	memset(uchIv,0,3);
	memset(uchRc4Seed,6,128);
//	memset(uchTMP,0,256);

	memset(bPTmp,0,16);
	IntToBit(bPTmp,iPatten,16);

//	if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) ) 
//		return false;

	switch(iEncryptionAlgorithm)
	{
		///////////////////////////////////////
		case 1:/*DES*/
		if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) ) 
			return false;
			while(KEY[iKeyLen]!='\0')
				iKeyLen++;
			StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
			for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
			{
				if(bPTmp[i%16]!=0)
				{
					DES((char *)uchOut, (char *)uchIn, &SubKey[0],true);
				}
				else
				{
					memcpy(uchOut,uchIn,8);
				}
			}	
			break;
		///////////////////////////////////////////	
		case 2:/*3DES*/
		if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) ) 
			return false;
			while(KEY[iKeyLen]!='\0')
				iKeyLen++;
			StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
			for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
			{
				if(bPTmp[i%16]!=0)
				{
					DES((char *)uchOut,(char *)uchIn,  &SubKey[0], true);
					DES((char *)uchOut,(char *)uchOut, &SubKey[1], false);
					DES((char *)uchOut,(char *)uchOut, &SubKey[0], true);						}
				else
				{
					memcpy(uchOut,uchIn,8);
				}
			}
			break;
		/////////////////////////////////////////////	
		case 3:/*rc4*/
			memcpy(uchIv,uchIn+256,3);
			memset(uchIn+256,0,3);
//			memset(uchRc4Seed,6,sizeof(uchRc4Seed));
			start_rc4_key1(uchRc4Seed,KEY,uchIv);
			Encrypt(uchRc4Seed,readbyte,uchIn);
		break;	
			
	}		
	return 0;
}

/********************************************************************
int En_decryption(unsigned char *uchIn, 
		unsigned char *uchOut, 
		unsigned int iPatten, 
		unsigned char *KEY, 
		int encrpypt_algorithm);
返回值: 0  解密成功
	1  解密失败
参数: 	*uchIn 输入的加密的密文
	*uchOut 输出的解密后的明文
	iPatten 加密模式,unsigned int 长度为16bits,;
		每个bit对应一个8字节的数据单元,共128字节;
		当对应的位是1,该数据单元解密;
		对应的字节是0,该数据单元不解密;
		例如:	iPatten 是 FF00, 表示128个字节中的前64字节解密,后64字节不解密
			iPatten 是 AAAA, 表示每隔8个字节解密一次
			iPatten 是 FFFF,表示所有的字节解密
			iPatten 是 0000,表示所有的字节不解密
	*KEY,解密使用的密钥,和算法对应
	encryption_algorithm  解密算法,是DES, TRIPLE_DES
********************************************************************/
int En_decryption(unsigned char *uchIn,unsigned char *uchOut,unsigned int iPatten,const char *KEY,int iEncryptionAlgorithm)
{
	
	bool bPTmp[16];
	int i,j,iDataLen=0,iKeyLen=0;
	clock_t startd,endd;
	double iElaspedd=0;
	unsigned char uchRc4Seed[128];
	unsigned char uchIv[3];

	memset(bPTmp,0,16);
	IntToBit(bPTmp,iPatten,16);
	memset(uchRc4Seed,6,128);

	memset(uchIv,0,3);


	switch(iEncryptionAlgorithm)
	{
		///////////////////////////////////
		case 1:/*DES*/
		if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) ) 
			return false;
			while(KEY[iKeyLen]!='\0')
				iKeyLen++;
			StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
			for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
			{
				if(bPTmp[i%16]!=0)
				{
					DES((char *)uchOut, (char *)uchIn, &SubKey[0],false);
				}
				else
				{
					memcpy(uchOut,uchIn,8);
				}
			}	
			break;
		////////////////////////////////////////////////////	
		case 2:/*3DES*/
		if( !( uchOut && uchIn && KEY&&(readbyte=(readbyte+7)&0xfffffff8)) ) 
			return false;
			while(KEY[iKeyLen]!='\0')
				iKeyLen++;
			StartKey(KEY,iKeyLen,iEncryptionAlgorithm);
			for(i=0,j=readbyte>>3;i<j;i++,uchOut+=8,uchIn+=8)
			{
				if(bPTmp[i%16]!=0)
				{
					DES((char *)uchOut,(char *)uchIn,  &SubKey[0], false);
					DES((char *)uchOut,(char *)uchOut, &SubKey[1], true);
					DES((char *)uchOut,(char *)uchOut, &SubKey[0], false);						}
				else
				{
					memcpy(uchOut,uchIn,8);
				}
			}
			break;	
		////////////////////////////////////////////////////////////	
		case 3:
				memcpy(uchIv,uchIn+256,3);
				memset(uchIn+256,0,3);
//				memset(uchRc4Seed,6,sizeof(uchRc4Seed));
				start_rc4_key1(uchRc4Seed,KEY,uchIv);
				Decrypt(uchRc4Seed,readbyte,uchIn);
			break;	
			
	}		
	return 0;
}

void StartKey(const char* KEY, int iLen,int iEncryptionAlgorithm)
{
	memset(deskey, 0, 16);
	
	if(iEncryptionAlgorithm=1)
		memcpy(deskey,KEY,iLen<8?iLen:8);	
	if(iEncryptionAlgorithm=2)
		memcpy(deskey,KEY,iLen>16?16:iLen);	
	
	SetSubKey(&SubKey[0], &deskey[0]);
}

void IntToBit(bool *bOut,unsigned int uiIn,int iBits)
{
	for(int i=0; i<iBits; ++i)
        	bOut[i] = (uiIn>>(15-i)) & 1;
}
void start_rc4_key1(unsigned char *uchOut,const char *KEY,unsigned char *uchIv)
{
	unsigned char uchTMP[16];
	memset(uchTMP,0,16);
	memcpy(uchTMP,KEY,13);
	memcpy(uchTMP+13,uchIv,3);
	ByteToBit((char *)uchOut,(const char *)uchTMP,128);
}



#if 0
void main(void)
{
	const char *KEY="CeressiaJasminea";
	unsigned char uchOut[1024];
	 
	clock_t start,end;
     double elapsed;

  	 unsigned char buf[1024];	
	 FILE *fd1, *fd2, *fd3,*fd4;
	 memset(uchOut,0,1024);

	 fd1=fopen("h:\\txt\\5.wma","rb");
	 fd2=fopen("h:\\txt\\c5.wma","wb");
//	 fd4=fopen("h:\\txt\\po.txt","wb");
	  start = clock();
  		while(!feof(fd1))
		{	
			memset(buf,0,1024);
			memset(uchOut,0,1024);

    		readbyte=fread(buf,sizeof(char),1024,fd1);
			En_encryption(buf,uchOut,0xffff,KEY,2);
//			Encryption (seed1,readbyte,buf);
			fwrite(uchOut,sizeof(char),readbyte,fd2);
		}
		fclose(fd2);

		fd3=fopen("h:\\txt\\c5.wma","rb");
		fd4=fopen("h:\\txt\\p5.wma","wb");
		while(!feof(fd3))
		{	
			memset(buf,0,1024);
			memset(uchOut,0,1024);

    		readbyte=fread(buf,sizeof(char),1024,fd3);
			En_decryption(buf,uchOut,0xffff,KEY,2);
			fwrite(uchOut,sizeof(char),readbyte,fd4);
		}
	end = clock();
	elapsed = ((double)(end-start))/CLOCKS_PER_SEC;

	fclose(fd1);
//	fclose(fd2);
	fclose(fd3);
	fclose(fd4);
	printf("%fOK!",elapsed);

}
#endif


⌨️ 快捷键说明

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