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

/*
**************************************************************************************************************
*
* 函数原型:void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata )
*
* 函数功能:3DES加密
*
* 函数输入:inkey 16字节password
* 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字节password
* 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

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

  1. 加密算法和MD5等散列算法的区别(转)

    本文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者 1.在软件开发的用户注册功能中常出现MD5加密这个概 ...

  2. 一种O(n)时间复杂度的计数排序算法和Top N热词算法

    排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...

  3. MP算法和OMP算法及其思想

    主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1],这两个算法尽管在90年代初就提出来了,但作为经典的算法,国内文献(可 ...

  4. DES算法和MAC算法总结

    需要用到的工具类,代码如下: import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java. ...

  5. 最小生成树---Prim算法和Kruskal算法

    Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...

  6. 经典算法和OJ网站(开发者必备-转)

    一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...

  7. BM算法和Sunday快速字符串匹配算法

    BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...

  8. 台球游戏的核心算法和AI(2)

    前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...

  9. ANSI X9.19 MAC算法

    /// <summary> /// 获取MAC校验字节数据 /// </summary> /// <param name="bankData"> ...

随机推荐

  1. vs2010和qt4.8.4配置

    最近项目要求在vs中开发qt程序,安装过后发现代码每天提示功能.由于本人记忆力有限,特在网上收罗了些配置方法. vs安装目录采用默认,qt安装目录:C:\Qt\4.8.4vs 在系统环境变量新建QTD ...

  2. Gradle编译spring3.x报错找不到itextpdf4.2.2解决方案

    google搜到一篇文章:http://www.bdtool.net/blog_356.html 试了文章里的两个方法,方法一不行,方法二有点搞头,但是还有些错.试着试着,突然成功了~ 我是这么做的 ...

  3. UnrealEngine4编码风格的思考

    第一次拿到UE4源码,扫了一遍.各种宏定义,各种模板,各种类层次.杂乱无章. 后来慢慢明确其规律: UE4的编码风格是在匈牙利命名法的基础下做了改进,使其更适用游戏引擎业务(业务特点:数据可视编辑.脚 ...

  4. CCNP路由实验之六 动态路由协议之IS-IS

     CCNP路由实验之六动态路由协议之IS-IS 动态路由协议能够自己主动的发现远程网络.仅仅要网络拓扑结构发生了变化.路由器就会相互交换路由信息,不仅能够自己主动获知新添加的网络.还能够在当前网络 ...

  5. html5的代码验证

    http://html5.validator.nu/ http://validator.w3.org/#validate_by_uri

  6. powerpoint(ppt) 的制作

    1. 幻灯片母版 所谓母版,是共享的部分,也即想在全部幻灯片重复出现的元素. 首先,幻灯片母版在菜单栏的[视图]选择[幻灯片母版]显示和查看. 通过幻灯片母版的编辑和设计,可进一步: 在幻灯片的相关位 ...

  7. 24.桌面移动qq

    #include <stdlib.h> #include <Windows.h> #include <stdio.h> #include <math.h> ...

  8. SCOPE_IDENTITY()和 SELECT @@IDENTITY 的用法

    这俩个,是在插入数据的时候使用,返回刚刚插入数据行的ID 大家慎用@@IDENTITY,而尽量采用 SCOPE_IDENTITY() 函数替换之. SCOPE_IDENTITY()  也是得到最后一条 ...

  9. BZOJ3645: Maze(FFT多项式快速幂)

    Description 众维拉先后在中土大陆上创造了精灵.人类以及矮人,其中矮人是生性喜好常年居住在地下的洞穴的存在,他们挖掘矿物甚至宝石,甚至用他们的勤劳勇敢智慧在地底下创造出了辉煌宏大的宫殿,错综 ...

  10. selenium使用报错“selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.”

    安装了python3,使用pip安装了selenium,但是在使用时,报了“selenium.common.exceptions.WebDriverException: Message: 'gecko ...