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

时间: 2024-08-08 00:05:17

ANSI-X99MAC算法和PBOC的3DES MAC算法的相关文章

MP算法和OMP算法及其思想

主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1],这两个算法尽管在90年代初就提出来了,但作为经典的算法,国内文献(可能有我没有搜索到)都仅描写叙述了算法步骤和简单的应用,并未对其进行详尽的分析,国外的文献还是分析的非常透彻,所以我结合自己的理解,来分析一下写到博客里,算作笔记. 1. 信号的稀疏表示(sparse representation of signals) 给定一个过完备字典矩阵,当中它的每列表示一种原

SM2算法和RSA算法简介

SM2算法和RSA算法都是公钥密码算法,SM2算法是一种更先进安全的算法,在安全性能.速度性能等方面都优于RSA算法,在我国商用密码体系中被用来替换RSA算法.国家密码管理局于2010年12月17日发布了SM2算法,并要求现有的基于RSA算法的电子认证系统.密钥管理系统.应用系统进升级改造,使用SM2算法. SM2算法和RSA算法简介 RSA公钥加密算法是美国计算机学家Ron Rivest.Adi Shamir和Leonard Adleman于1977年提出,是最早的公钥加密算法之一,在全球范围

最小生成树 Prim(普里姆)算法和Kruskal(克鲁斯特尔)算法

Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场

使用Apriori算法和FP-growth算法进行关联分析(Python版)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

最短路径Dijkstra算法和Floyd算法整理、

转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹

Dijkstra算法和Floyed算法

写的比较好的三篇文章 Floyed算法 最短路径-Dijkstra算法和Floyed算法 最短路径之Dijkstra算法和Floyed算法 哈哈,他山之石,可以攻玉 自己有心得,慢慢补充

链接挖掘算法之PageRank算法和HITS算法

参考资料:http://blog.csdn.net/hguisu/article/details/7996185 更多数据挖掘算法:https://github.com/linyiqun/DataMiningAlgorithm 链接分析 在链接分析中有2个经典的算法,1个是PageRank算法,还有1个是HITS算法,说白了,都是做链接分析的.具体是怎么做呢,继续往下看. PageRank算法 要说到PageRank算法的作用,得先从搜索引擎开始讲起,PageRank算法的由来正式与此相关. 搜

最小生成树之 prim算法和kruskal算法(以 hdu 1863为例)

最小生成树的性质 MST性质:设G = (V,E)是连通带权图,U是V的真子集.如果(u,v)∈E,且u∈U,v∈V-U,且在所有这样的边中, (u,v)的权c[u][v]最小,那么一定存在G的一棵最小生成树,(u,v)为其中一条边. 构造最小生成树,要解决以下两个问题: (1).尽可能选取权值小的边,但不能构成回路(也就是环). (2).选取n-1条恰当的边以连接网的n个顶点. Prim算法的思想: 设G = (V,E)是连通带权图,V = {1,2,-,n}.先任选一点(一般选第一个点),首

Prim算法和Kruskal算法的正确性证明

今天学习了Prim算法和Kruskal算法,因为书中只给出了算法的实现,而没有给出关于算法正确性的证明,所以尝试着给出了自己的证明.刚才看了一下<算法>一书中的相关章节,使用了切分定理来证明这两个算法的正确性,更加简洁.优雅并且根本.相比之下,我的证明带着许多草莽气息,于此写成博客,只当是记录自己的思考 ------------------------------------------- 说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的