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字节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算法的更多相关文章
- 加密算法和MD5等散列算法的区别(转)
本文转自http://www.cnblogs.com/eternalwt/archive/2013/03/21/2973807.html 感谢作者 1.在软件开发的用户注册功能中常出现MD5加密这个概 ...
- 一种O(n)时间复杂度的计数排序算法和Top N热词算法
排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...
- MP算法和OMP算法及其思想
主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Matching Pursuit)算法[1],这两个算法尽管在90年代初就提出来了,但作为经典的算法,国内文献(可 ...
- DES算法和MAC算法总结
需要用到的工具类,代码如下: import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java. ...
- 最小生成树---Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (gra ...
- 经典算法和OJ网站(开发者必备-转)
一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...
- BM算法和Sunday快速字符串匹配算法
BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J St ...
- 台球游戏的核心算法和AI(2)
前言: 最近研究了box2dweb, 觉得自己编写Html5版台球游戏的时机已然成熟. 这也算是圆自己的一个愿望, 一个梦想. 承接该序列的相关博文: • 台球游戏核心算法和AI(1) 同时结合htm ...
- ANSI X9.19 MAC算法
/// <summary> /// 获取MAC校验字节数据 /// </summary> /// <param name="bankData"> ...
随机推荐
- Java基础学习总结(21)——数组
一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的元素可以是任何数据类型,包括基 ...
- 【转】 HTML解析:基于XPath的C#类库HtmlAgiliytyPack
[转] HTML解析:基于XPath的C#类库HtmlAgiliytyPack 最近处于毕业设计开始阶段,前期工作需要去国外的一些专业数据库网站比对一些所需TF家族信息,为了快捷方便,想到用程序去帮助 ...
- ArcGIS api for javascript——创建地图
描述 这个示例显示ArcGIS Server的一个地图.ArcGIS Server地图是缓存的,意味着它有服务器管理员建来提升性能的一组预先渲染的切片.由于这个原因地图通过ArcGISTiledMap ...
- KM最大匹配 HDU 2255
KM算法详解+模板 - wenr - 博客园 http://www.cnblogs.com/wenruo/p/5264235.html #include<iostream> #inclu ...
- 书剑恩仇录online全套源代码(服务端+client+文档)
书剑恩仇录online全套源代码(服务端+client+文档).vc++开发,解压后将近10G大小,眼下网上最完整版本号,包括client源代码.服务端源代码.工具源代码.sdk.文档-- <书 ...
- Oracle数据库备份恢复,巡检须要关注的对象设置以及相关恢复概述
数据库备份恢复.巡检须要关注的对象设置: 1.数据库名称,以及DBID: --dbid在v$database中 SYS@ORCL>select dbid,name from v$dat ...
- thinkphp5项目--企业单车网站(一)
thinkphp5项目--企业单车网站(一) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...
- expr---计算工具
expr命令是一款表达式计算工具,使用它完成表达式的求值操作. expr的常用运算符: 加法运算:+ 减法运算:- 乘法运算:\* 除法运算:/ 求摸(取余)运算:% 语法 expr(选项)(参数) ...
- 第四次python作业——叶耀宗
设计题2: 1.参考“三国演义”词频统计程序,实现对红楼梦出场人物的频次统计.2.(可选)将红楼梦出场人物的频次统计结果用词云显示. import jieba excludes = {"什么 ...
- pip版本及升级 pip安装指定模板
昨天在微信聊天,一妹子9点的时候告诉我她要看书了,让明天聊,瞬间自己心中那颗学习的种子燃烧起来,思来想去还是继续学习自己之前未学好的python吧,因为之前有了点点的python基础,所以本次打算从p ...