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

📄 eps1000nd_md5_tea.c

📁 MD5算法在keil上实现。 其中设计到一些flash读写函数需要自己补充 上传上去只是给大家参考一下。
💻 C
📖 第 1 页 / 共 2 页
字号:
					(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
					(a) = ROTATE_LEFT ((a), (s)); \

					(a) += (b); \
				}
				#define GG(a, b, c, d, x, s, ac) { \
					(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
					(a) = ROTATE_LEFT ((a), (s)); \
					(a) += (b); \
				}
不难发现 FF,GG,HH,II除了调用F,G,H,I算法的不同外,其他的运算步骤一摸一样,	总结一下可以使用一个4*16的循环来完成MD5算法,
4代表FF,GG,HH,II四种算法,使用一个指针函数数组来完成F,G,H,I子程序的跳转,
16代表每一种算法下面的16个子运算.
再分析FGHI函数,均是对b,c,d进行操作,所以通过上述数组序列循环后,FGHI则会对数组中固定位置的数据进行运算,简化了运算步骤                                                                             
;***********************************************************************************************
;****创 建 人:                                                                                 
;****创建日期:                                                                                 
;***********************************************************************************************
;****修 改 人:                                                                                 
;****修改日期:                                                                                 
;***********************************************************************************************/
// 设定一个函数指针数据,便于识别4个轮回的功能操作
code void (*MD5Func[])(void)={MD5F,MD5G,MD5H,MD5I};

void MD5Transform()
{
	uint8 i,j;
	//EA = 0;
	PdataCopy(md5OldState,md5State,16);		// 复制md5State 使用md5Temp参与MD5运算,运算结束后,新的state + 旧的state,得到最终MD5运算结果	
	for(i=0;i<4;i++)
	{
		for(j=0;j<16;j++)
		{
			//1.执行对应的FGHI运算 	 结果保存在MD5_R中
			MD5Func[i](); 
			//2.(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); 
			//	(a) = ROTATE_LEFT ((a), (s)); 
			//	(a) += (b); 
		   	PD32Add_LE(md5AA,md5TEMP);
			PD32Add_LE(md5AA,md5Buf + MD5_XI[i][j]);
			Code2Pdata(md5TEMP,(uint16)(MD5_TI[i] + (j << 2)),4);
			PD32Add_LE(md5AA,md5TEMP);
			PD32Rlc_LE(md5AA,MD5_SI[i][j % 4],1);
			PD32Add_LE(md5AA,md5BB);
			//3.移动md5OldState中数据 使abcd->dabc->cdab->bcda->abcd...
			// PdataCopy 本身使用了从后向前复制的方法 所以在oldState的移动中使用两次内存拷贝就能实现功能
		   	PdataCopy(md5BB,md5AA,16);	//从A开始 复制到 B中 运算后md5TEMP中保存了MD5D
			PdataCopy(md5AA,md5TEMP,4);	// 把D恢复到A中
		}
	}
	for(i=0;i<16;i+=4) 					// state += oldState
	{
		PD32Add_LE(md5State + i,md5OldState + i);

	}
	//EA =1;
}
/***********************************************************************************************
;****函数名称:MD5Prefill                                                                               
;****入口参数:md5In  len                                                                               
;****出口参数:                                                                                 
;****全局变量:                                                                                 
;****调用模块:                                                                                 
;****说    明: 从md5In中提取len个数据填充到md5Buf中,
			   根据EPS1000ND-8K的特殊性,输入txt长度不超过55,key长度为16 
			   所以此处不做长度判断,每次填充均从md5Buf的第1位开始
			   填充完毕后,立即进行md5Transform运算                                                                           
;***********************************************************************************************
;****创 建 人:                                                                                 
;****创建日期:                                                                                 
;***********************************************************************************************
;****修 改 人:                                                                                 
;****修改日期:                                                                                 
;***********************************************************************************************/
void MD5Prefill(uint8 pdata *md5In,uint8 len)
{
	// 1.拷贝md5In 到 md5Buf
	PdataCopy(md5Buf,md5In,len);		// 复制md5In 到 md5Buf
	// 2.md5Buf中剩余数据 填充PADING和oldCount
	PdataFill(md5Buf + len ,0,64 - len);
	*(uint8 pdata *)(md5Buf + len) = 0x80;	// 填充padding
	// 填充MD5数据长度
	*(uint8 pdata *)(md5Buf + 56) = (uint8)(len << 3);
	*(uint8 pdata *)(md5Buf + 57) = (len >> 5) + 0x02; 
}

/***********************************************************************************************
;****函数名称:MD5HMAC                                                                               
;****入口参数:                                                                                 
;****出口参数:                                                                                 
;****全局变量:                                                                                 
;****调用模块:                                                                                 
;****说    明:                                                                              
;***********************************************************************************************
;****创 建 人:                                                                                 
;****创建日期:                                                                                 
;***********************************************************************************************
;****修 改 人:                                                                                 
;****修改日期:                                                                                 
;***********************************************************************************************/
uint8 MD5HMAC()
{
	//uint8 i;
	// 1.判断是否已经打开文件
	if(fileOpenInf->address == 0)
	{
		// 打开文件地址 空
		return ERROR_NOTOPEN;
	}
	
	// 2.判断是否具有权限
	if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
	{
		return ERROR_NOTAUTHORITY;
	}
	// 3.读取第一个key文件 并进行第一次MD5运算
	MD5Prefill(usbInBuf.bDat,usbInBuf.bDat[63]); 
	Code2Pdata(md5State,fileOpenInf->address,16);
	//Code2Pdata(md5State,0x1a08,16);	
	// 4.进行第一次MD5运算
	MD5Transform(); 
	// 5.打开第二个KEY文件
	// 定位usbInBuf中指定的文件
	if(FILELocateID() != FILE_LOCATE_OK)
	{
		return ERROR_INDEX;							// 如果文件打开错误,返回
	}
	// 6.判断是否具有权限
	if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
	{
		return ERROR_NOTAUTHORITY;
	}
	
	// 7.读取第二个key文件
	MD5Prefill(md5State,16);
	Code2Pdata(md5State,filePtr + 8,16);
	MD5Transform();
	PdataCopy(usbOutBuf.bDat,md5State,16);
   	return RIGHT_TOKEN;
}


/***********************************************************************************************
;****函数名称:                                                                               
;****入口参数:                                                                                 
;****出口参数:                                                                                 
;****全局变量:                                                                                 
;****调用模块:                                                                                 
;****说    明:                                                                              
;***********************************************************************************************
;****创 建 人:                                                                                 
;****创建日期:                                                                                 
;***********************************************************************************************
;****修 改 人:                                                                                 
;****修改日期:                                                                                 
;***********************************************************************************************/

uint8 TEAEnde()
{
	
	// 1.判断是否已经打开文件
	if((fileOpenInf->address == 0) || (fileOpenInf->type != TEA_TYPE))
	{
		// 打开文件地址 空
		return ERROR_NOTOPEN;
	}
	
	// 2.判断是否具有权限
	if(EPSCheckAuthority((fileOpenInf->authority >> OFFSET_ENCRYPT) & 0x03))
	{
		return ERROR_NOTAUTHORITY;
	}
	
	// 3.初始化key数据
	PdataCopy(teaBuf,usbInBuf.bDat,8);				// 复制teaY teaZ
	Code2Pdata(teaSum,(uint16)TEA_CONST,8);			// 读取teaSum teaDelta
	Code2Pdata(teaKey,fileOpenInf->address,16);		// 读取tea文件
	// 4.判断加密、解密
	if(usbInBuf.bCommand[1] == 1)
	{
		PdataFill(teaSum,0,4);
		TEAEncryption();
	}
	else if(usbInBuf.bCommand[1] == 2)
	{
		TEADecryption();
	}
	else
	{
		return ERROR_INDEX;
	}

	return RIGHT_TOKEN;
}
// teaTemp2 = (pIn << 4) + (teaKey[k1] ^ b) + (teaSum ^ (pIn >> 5)) + teaKey[k2];
void TEAProc(uint8 pdata *pIn,uint8 k1,uint8 k2)
{
	PdataFill(teaTemp2,0,4);
	
	PdataCopy(teaTemp1,pIn,4);					// temp1 = pIn
	PD32Rlc_LE(teaTemp1,4,0);					// teaTemp1 <<= 4
	PD32Add_LE(teaTemp2,teaTemp1);				// teaTemp2 += pIn << 4
	
	PdataCopy(teaTemp1,teaKey + k1,4);			// 复制teaKey
	//PD32Xrl_LE(teaTemp1,pIn);					// teaTemp1 ^= pIn
	*(uint8 *)(teaTemp1 + 0) ^= *(uint8 *)(pIn + 0);
	*(uint8 *)(teaTemp1 + 1) ^= *(uint8 *)(pIn + 1);
	*(uint8 *)(teaTemp1 + 2) ^= *(uint8 *)(pIn + 2);
	*(uint8 *)(teaTemp1 + 3) ^= *(uint8 *)(pIn + 3);
	PD32Add_LE(teaTemp2,teaTemp1);				// teaTemp2 += (teaKey[k1]) ^ pIn

	PdataCopy(teaTemp1,pIn,4);					// temp1 = pIn
	PD32Rrc_LE(teaTemp1,5,0);					// teaTemp1 >>= 5
	//PD32Xrl_LE(teaTemp1,teaSum);				// teaTemp ^= teaSum
	*(uint8 *)(teaTemp1 + 0) ^= *(uint8 *)(teaSum + 0);
	*(uint8 *)(teaTemp1 + 1) ^= *(uint8 *)(teaSum + 1);
	*(uint8 *)(teaTemp1 + 2) ^= *(uint8 *)(teaSum + 2);
	*(uint8 *)(teaTemp1 + 3) ^= *(uint8 *)(teaSum + 3);
	PD32Add_LE(teaTemp2,teaTemp1);				// teaTemp2 += (teaSum ^(b >> 5)

	PD32Add_LE(teaTemp2,teaKey + k2);			// a += teaKey[k2]
}
/***********************************************************************************************
;****函数名称:TEAEncription                                                                               
;****入口参数:                                                                                 
;****出口参数:                                                                                 
;****全局变量:                                                                                 
;****调用模块:                                                                                 
;****说    明: TEA加密                                                                             
;***********************************************************************************************
;****创 建 人:                                                                                 
;****创建日期:                                                                                 
;***********************************************************************************************
;****修 改 人:                                                                                 
;****修改日期:                                                                                 
;***********************************************************************************************/

void TEAEncryption()
{
	uint8 i;
	PdataFill(teaSum,0,4);
	for(i=0;i<TEA_ROUNDS;i++)
	{
		//sum += delta
		PD32Add_LE(teaSum,teaDelta);
		//teaTemp2 = (z << 4) + (k[0] ^ z) + (sum ^ (z >> 5)) + k[4];
		TEAProc(teaZ,0,4);
		// y+= teaTemp2;
		PD32Add_LE(teaY,teaTemp2);
		//teaTemp2 = (y << 4) + (k[8] ^ y) + (sum ^ (y >> 5)) + k[12];
		TEAProc(teaY,8,12);
		PD32Add_LE(teaZ,teaTemp2); 			
	}
	PdataCopy(usbOutBuf.bDat,teaY,8);	// 复制运算结果
}

/***********************************************************************************************
;****函数名称:TEADecription                                                                               
;****入口参数:                                                                                 
;****出口参数:                                                                                 
;****全局变量:                                                                                 
;****调用模块:                                                                                 
;****说    明: TEA解密                                                                             
;***********************************************************************************************
;****创 建 人:                                                                                 
;****创建日期:                                                                                 
;***********************************************************************************************
;****修 改 人:                                                                                 
;****修改日期:                                                                                 
;***********************************************************************************************/

void TEADecryption()
{
 	uint8 i;
	for(i=0;i<TEA_ROUNDS;i++)
	{
	 	TEAProc(teaY,8,12);
		PD32Sub_LE(teaZ,teaTemp2);
		TEAProc(teaZ,0,4);		    
		PD32Sub_LE(teaY,teaTemp2);
		PD32Sub_LE(teaSum,teaDelta);
	}
   	PdataCopy(usbOutBuf.bDat,teaY,8);	// 复制运算结果
}
		

⌨️ 快捷键说明

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