银联通信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 );
}
- 评估一个预测模型性能通常都有那些指标
- nautilus出现一闪而过现象
- PIL遇到问题解决
- 使用神经网络来拟合函数y = x^3 +b
- GO语言如何调用C写的函数
- 使用Anaconda搭建TensorFlow-GPU环境
- google gflag使用方法举例
- caffe源码学习之Proto数据格式【1】
- 降维之pca算法
- 聚类之dbscan算法
- ubuntu 使用sudo apt-get update 出现 被配置多次导致无法升级错误解决方法
- morestack与goroutine pool
- 关于python使用threadpool中的函数单个参数和多个参数用法举例
- python科学计算之numpy
- 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 数组属性和方法
- 通过PHP设置BugFree获取邮箱通知
- Django封装交互接口代码
- 使用K.function()调试keras操作
- tensorflow图像裁剪进行数据增强操作
- ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
- Python+PyQt5+MySQL实现天气管理系统
- 浅谈Python协程
- Python logging模块异步线程写日志实现过程解析
- php-fpm重启导致的程序执行中断问题详解
- Python Socket TCP双端聊天功能实现过程详解
- django 将自带的数据库sqlite3改成mysql实例
- 利用python对mysql表做全局模糊搜索并分页实例
- PHP chop()函数讲解
- Linux下安装Memcached服务器和客户端与PHP使用示例
- PHP xpath()函数讲解