银联通信MAC算法
时间:2022-07-22
本文章向大家介绍银联通信MAC算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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 );
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android studio集成ijkplayer的示例代码
- Android开发实现浏览器全屏显示功能
- Android动态人脸检测的示例代码(脸数可调)
- Android抽奖轮盘的制作方法
- Android 获取屏幕的多种宽高信息的示例代码
- Android编程实现禁止StatusBar下拉的方法
- Android自定义view圆并随手指移动
- Android仿微信发送语音消息的功能及示例代码
- 详解Android studio ndk配置cmake开发native C
- Android编程实现禁止状态栏下拉的方法详解
- Android进度条ProgressBar的实现代码
- Android画画板的制作方法
- Android实现bitmap指定区域滑动截取功能
- Android开发实现应用层面屏蔽状态栏的方法小结
- Android实现实时搜索框功能