ANSI-X99MAC算法和PBOC的3DES MAC算法,附DES算法工具
![](https://code.csdn.net/assets/CODE_ico.png)
- /**************************************************
- * 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 );
- }
只要有标准的DES加密和解密算法,类似ANSI-X99MAC算法和PBOC3DES算法就很好实现。他们都是用DES算法再经过一层算法实现的。实现原理看图就能看明白。3DES算法实现就更简单了。就是DES算法再加解密一次。
![](https://code.csdn.net/assets/CODE_ico.png)
- /*
- **************************************************************************************************************
- *
- * 函数原型: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 ); //解
- }
![](https://code.csdn.net/assets/CODE_ico.png)
- /*******************************************************
- * 名称:获取报文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 );
- }
![](https://code.csdn.net/assets/CODE_ico.png)
- /*
- *************************************************************************************************
- * 异或
- *************************************************************************************************
- */
- 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算法的原理,可以参考CPU卡指令手册或PBOC规范。如图:
MAC的计算:
3DES算法计算MAC
DES算法工具:
下载:https://maxwoods.ctfile.com/fs/yNM165157404
ANSI-X99MAC算法和PBOC的3DES MAC算法,附DES算法工具相关推荐
- MAC: PBOC-MAC DES算法
MAC: PBOC-MAC DES算法 密钥 长度8(0x08)字节 4F F6 3E 5D 02 FF CA 1B 初始向量 长度8(0x08)字节 00 00 00 00 00 00 00 00 ...
- 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解
1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...
- openssl java aes_Java AES算法和OpenSSL配对
近日工作上的原因,需要实现Java AES算法和C语言下基于OpenSSL的AES 算法通信.这是个老问题了,网上搜到不少资料,但都不是很详细,没能解决问题.只能自己来了. 先说说AES算法.AES ...
- DES算法和MAC算法总结
需要用到的工具类,代码如下: import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java. ...
- Macos上的专业加密通讯工具,十分安全。使用了信号协议,该协议结合了预密钥,Double Ratchet算法和3-DH握手信号。
想要让自己聊天信息变得更加安全有隐秘性吗?Signal Desktop for Mac版是一款Macos上的专业加密通讯工具,十分安全.使用了信号协议,该协议结合了预密钥,Double Ratchet ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...
- BF算法和KMP算法
给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...
- Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)
Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...
- 操作系统之存储管理——FIFO算法和LRU算法
操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...
最新文章
- 数据结构与算法-C++实现
- conda create -n python 3.6_conda创建python环境
- 看漫画学python电子书-看漫画还能学Python❓❓❓| 0基础小白福音
- blp模型 上读下写_CreditX在线借贷欺诈检测框架BLP
- CeneOS中使用Docker安装Gitlab
- mysql slave 状态_python脚本 监控MySQL slave 状态
- 《管理3.0》读书笔记
- cad卸载工具_如何卸载AutoCAD 附上清理注册表方法
- Java 函数式编程的妙用
- 《五分钟商学院》个人篇学习总结(下)
- Frame Relay - 简单介绍及基本配置
- pytorch 支持amd显卡吗_AMD平台上配置PyTorch+Apex开发环境
- 谷歌Chrome浏览器
- html让gif图片暂停,控制gif图片播放暂停插件-jquery.gif.js
- 使用python开发一个剪切视频、音频的小工具(完整案例)
- python 实战之模仿开发QQ聊天软件(二)MySQL数据库的连接和使用
- 利用Biopython 快速根据pmid 来下载参考文献信息
- 来认识一下国内可穿戴设备市场的玩家
- 3D游戏建模真的好找工作吗?
- mysql .pdb是什么文件_.NET PDB文件到底是什么?