ANSI-X99MAC算法和PBOC的3DES MAC算法

只要有标准的DES加密和解密算法,类似ANSI-X99MAC算法和PBOC3DES算法就很好实现。他们都是用DES算法再经过一层算法实现的。实现原理看图就能看明白。3DES算法实现就更简单了。就是DES算法再加解密一次。

 

/*
**************************************************************************************************************
*
* 函数原型:void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata )
*
* 函数功能:3DES加密
*
* 函数输入:inkey		16字节密码
*			indata		8字节需要加密的数据
*                
* 函数输出:outdata		8字节加密结果输出
*
* 函数返回:无
*   
**************************************************************************************************************
*/
void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata )
{
	U08 LKey[8];
	U08 RKey[8];
	U08 TmpDest[8];

	MyCopy( LKey, inkey,   8 );
	MyCopy( RKey, inkey+8, 8 );

	CurCalc_DES_Encrypt( LKey, indata,  outdata );			//加
	CurCalc_DES_Decrypt( RKey, outdata, TmpDest );			//解
	CurCalc_DES_Encrypt( LKey, TmpDest, outdata );			//加
}

/*
**************************************************************************************************************
*
* 函数原型:void CurCalc_3DES_Decrypt( U08 *inkey, U08 *indata, U08 *outdata )
*
* 函数功能:3DES解密
*
* 函数输入:inkey		8字节密码
*			indata		8字节需要解密的数据
*                
* 函数输出:outdata		8字节解密结果输出
*
* 函数返回:无
*   
**************************************************************************************************************
*/
void CurCalc_3DES_Decrypt( U08 *inkey, U08 *indata, U08 *outdata )
{
	U08 LKey[8];
	U08 RKey[8];
	U08 TmpDest[8];

	MyCopy( LKey, inkey,   8 );
	MyCopy( RKey, inkey+8, 8 );

	CurCalc_DES_Decrypt( LKey, indata,  outdata );			//解
	CurCalc_DES_Encrypt( RKey, outdata, TmpDest );			//加
	CurCalc_DES_Decrypt( LKey, TmpDest, outdata );			//解
}
/*******************************************************
* 名称:获取报文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 );
}
/*
*************************************************************************************************
*  异或		   
*************************************************************************************************
*/
void DataXOR( U08 *source, U08 *dest, U32 size, U08 *out )
{
   int i;
   for( i = 0; i < size; i++ )
   { out[i] = dest[i] ^ source[i]; }
}
/**************************************************
* PBOC-3DES MAC计算
**************************************************/
void PBOC_3DES_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
{
    U08 val[8],xor[8];
	U08 keyL[8],keyR[8];
    U08 block[512];
    U16 x,n;
    U16 i;
	memcpy(keyL,key,8);
    memcpy(keyR,&key[8],8);
    //准备工作
	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 );
		block[x*8+n]=0x80;	
	}
	else
	{
		memset( &block[x*8], 0x00, 8 );//如果最后一块长度是8个字节,则最后加80 00。。
	    block[x*8]=0x80;
	}
	//开始运算
	memset( val, 0x00, 8 );//初始向量
	memcpy( val, UPPAN,8 );
	DataXOr(val,&block[0], 8,xor);
	for( i = 1; i < x+1; i++ )	 //有多少块循环多少次
	{ 
		CurCalc_DES_Encrypt(keyL,xor,val);//DES加密
		DataXOr(val,&block[i*8], 8,xor);
	    // j += 8;	 //用于取下一块的数据
	}
	CurCalc_DES_Encrypt(keyL,xor,val);
	CurCalc_DES_Decrypt(keyR,val,xor);
	CurCalc_DES_Encrypt(keyL,xor,val);
	memcpy(mac_buf,val, 8 );
}

实现MAC算法的原理,可以参考CPU卡指令手册或PBOC规范。如图:

 

MAC的计算:

3DES算法计算MAC

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据引用和引用的内容,RSA PBOC工具是一种用于银行卡的密码算法工具,主要用于密钥生成、公私钥加密与解密以及联机交易验证和脱机数据验证等功能。在银行卡的应用中,RSA算法用于脱机数据验证,而PBOC标准则是指中国的银行卡标准,其中包括PBOC1.0和PBOC2.0标准,分别支持使用3DES算法MAC、数据加解密和密钥离散算法。国密算法是用于PBOC3.0标准的增强安全部分的内容。根据引用的描述,该工具在智能卡、USB Key、POS等产品中发挥重要作用,并适用于需要基于命令行测试的嵌入式产品。如果您有更多疑问,可以咨询引用中提供的联系方式。123 #### 引用[.reference_title] - *1* *3* [银行卡安全密码算法辅助计算工具(3DES+RSA)](https://blog.csdn.net/goldboar/article/details/39254663)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [PowerScript--功能强大的智能卡,USB Key, POS脚本命令工具](https://blog.csdn.net/l_z_h/article/details/124048086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值