前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >银联通信MAC算法

银联通信MAC算法

作者头像
杨永贞
发布2020-08-04 17:15:09
发布2020-08-04 17:15:09
94700
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制
void DATE_XOR1(U08 *source, U08 *dest,long size)
{
   int i;
   for(i=0; i<size; i++)
	   dest[i] ^= source[i];

   return;
}
/*
*************************************************************************************************
*  异或		   
*************************************************************************************************
*/
void DataXOR( U08 *source, U08 *dest, U32 size, U08 *out )
{
   int i;
   for( i = 0; i < size; i++ )
   { out[i] = dest[i] ^ source[i]; }
}
/*******************************************************
* 名称:获取报文MAC值		    
* 功能:报文MAC算法				 
* 入口:
*      *buf     ,要计算的数据缓冲区;buf_size,计算数据的长度
*      *key     ,密钥(8B)
* 出口:mac_buf,计算出来的MAC值(8B)
********************************************************/
void UP_Get_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
{														     
	U08 val[8],Abuf[8],str1[8],str2[8];	
	U08 Bbuf[16];						     //中间变量
    U08 block[512],mac[8];	
	U16 x,n;
	U16 i,j=0;
	//准备工作
	memcpy( block, buf, buf_size );                          //将输入数据赋值给临时变量block
	x = buf_size / 8; 								         //计算有多少个完整的块
	n = buf_size % 8;                                        //计算最后一个块有几个字节
	if( n != 0 )											 //y非0,则在其后补上0x00...
	{
		memset( &block[x*8+n], 0x00, 8-n );							
		x += 1;                                              //将补上的这一块加上去 
	}
	//开始运算
	memset( val, 0x00, 8 );
	for( i = 0; i < x; i++ )						         //有多少块循环多少次
	{
		DATE_XOR1(&block[j], val,8);

	    j += 8;												 //用于取下一块的数据
	}

	 sprintf( (char *)Bbuf, "%02X%02X%02X%02X%02X%02X%02X%02X", val[0],val[1],val[2],val[3],val[4],val[5],val[6],val[7]);
	 memcpy( str1, Bbuf, 8 );
	 memcpy( str2, &Bbuf[8], 8 );
	 CurCalc_DES_Encrypt(key,str1,mac);

	 DataXOR( mac, str2, 8, Abuf );	
	 CurCalc_DES_Encrypt(key,Abuf,mac);
	 memcpy(Abuf,mac,8);
	 sprintf( (char *)Bbuf, "%02X%02X%02X%02X%02X%02X%02X%02X", Abuf[0],Abuf[1],Abuf[2],Abuf[3],Abuf[4],Abuf[5],Abuf[6],Abuf[7]);
	 memcpy( mac_buf, Bbuf, 8 );		//前8位密钥结果放入mac_buf	 
}

/*******************************************************
* 名称:获取报文MAC值
* 功能:报文MAC算法
* 入口:
* *buf ,要计算的数据缓冲区;buf_size,计算数据的长度
* *key ,密钥(8B)
* 出口:mac_buf,计算出来的MAC值(8B)
ansi x9.9 MAC算法

********************************************************/
void Ansi99X_Get_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
{
    U08 val[8],xor[8];
    U08 block[512];
    U16 x,n;
    U16 i,j=0;
    //准备工作
	memcpy( block, buf, buf_size ); //将输入数据赋值给临时变量block
	x = buf_size / 8; //计算有多少个完整的块
	n = buf_size % 8; //计算最后一个块有几个字节
	if( n != 0 )	 //y非0,则在其后补上0x00...
	{
	    memset( &block[x*8+n], 0x00, 8-n );
	    x += 1; //将补上的这一块加上去
	}
	//开始运算
	memset( val, 0x00, 8 );
	for( i = 0; i < x; i++ )	 //有多少块循环多少次
	{
	    DataXOR(val,&block[j], 8,xor);
	    CurCalc_DES_Encrypt(key,xor,val);//DES加密
	    j += 8;	 //用于取下一块的数据
	}
	memcpy(mac_buf,val, 8 );
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014/03/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档