[cpp]  view plain copy
  1. /**************************************************
  2. * PBOC-3DES MAC计算
  3. **************************************************/
  4. void PBOC_3DES_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
  5. {
  6. U08 val[8],xor[8];
  7. U08 keyL[8],keyR[8];
  8. U08 block[512];
  9. U16 x,n;
  10. U16 i;
  11. memcpy(keyL,key,8);
  12. memcpy(keyR,&key[8],8);
  13. //准备工作
  14. memcpy( block, buf, buf_size ); //将输入数据赋值给临时变量block
  15. x = buf_size / 8; //计算有多少个完整的块
  16. n = buf_size % 8; //计算最后一个块有几个字节
  17. if( n != 0 )     //y非0,则在其后补上0x00...
  18. {
  19. memset( &block[x*8+n], 0x00, 8-n );
  20. block[x*8+n]=0x80;
  21. }
  22. else
  23. {
  24. memset( &block[x*8], 0x00, 8 );//如果最后一块长度是8个字节,则最后加80 00。。
  25. block[x*8]=0x80;
  26. }
  27. //开始运算
  28. memset( val, 0x00, 8 );//初始向量
  29. memcpy( val, UPPAN,8 );
  30. DataXOr(val,&block[0], 8,xor);
  31. for( i = 1; i < x+1; i++ )    //有多少块循环多少次
  32. {
  33. CurCalc_DES_Encrypt(keyL,xor,val);//DES加密
  34. DataXOr(val,&block[i*8], 8,xor);
  35. // j += 8;   //用于取下一块的数据
  36. }
  37. CurCalc_DES_Encrypt(keyL,xor,val);
  38. CurCalc_DES_Decrypt(keyR,val,xor);
  39. CurCalc_DES_Encrypt(keyL,xor,val);
  40. memcpy(mac_buf,val, 8 );
  41. }

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

[cpp]  view plain copy
  1. /*
  2. **************************************************************************************************************
  3. *
  4. * 函数原型:void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata )
  5. *
  6. * 函数功能:3DES加密
  7. *
  8. * 函数输入:inkey        16字节密码
  9. *           indata      8字节需要加密的数据
  10. *
  11. * 函数输出:outdata      8字节加密结果输出
  12. *
  13. * 函数返回:无
  14. *
  15. **************************************************************************************************************
  16. */
  17. void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata )
  18. {
  19. U08 LKey[8];
  20. U08 RKey[8];
  21. U08 TmpDest[8];
  22. MyCopy( LKey, inkey,   8 );
  23. MyCopy( RKey, inkey+8, 8 );
  24. CurCalc_DES_Encrypt( LKey, indata,  outdata );          //加
  25. CurCalc_DES_Decrypt( RKey, outdata, TmpDest );          //解
  26. CurCalc_DES_Encrypt( LKey, TmpDest, outdata );          //加
  27. }
  28. /*
  29. **************************************************************************************************************
  30. *
  31. * 函数原型:void CurCalc_3DES_Decrypt( U08 *inkey, U08 *indata, U08 *outdata )
  32. *
  33. * 函数功能:3DES解密
  34. *
  35. * 函数输入:inkey        8字节密码
  36. *           indata      8字节需要解密的数据
  37. *
  38. * 函数输出:outdata      8字节解密结果输出
  39. *
  40. * 函数返回:无
  41. *
  42. **************************************************************************************************************
  43. */
  44. void CurCalc_3DES_Decrypt( U08 *inkey, U08 *indata, U08 *outdata )
  45. {
  46. U08 LKey[8];
  47. U08 RKey[8];
  48. U08 TmpDest[8];
  49. MyCopy( LKey, inkey,   8 );
  50. MyCopy( RKey, inkey+8, 8 );
  51. CurCalc_DES_Decrypt( LKey, indata,  outdata );          //解
  52. CurCalc_DES_Encrypt( RKey, outdata, TmpDest );          //加
  53. CurCalc_DES_Decrypt( LKey, TmpDest, outdata );          //解
  54. }
[cpp]  view plain copy
  1. /*******************************************************
  2. * 名称:获取报文MAC值
  3. * 功能:报文MAC算法
  4. * 入口:
  5. * *buf ,要计算的数据缓冲区;buf_size,计算数据的长度
  6. * *key ,密钥(8B)
  7. * 出口:mac_buf,计算出来的MAC值(8B)
  8. ansi x9.9 MAC算法
  9. ********************************************************/
  10. void Ansi99X_Get_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )
  11. {
  12. U08 val[8],xor[8];
  13. U08 block[512];
  14. U16 x,n;
  15. U16 i,j=0;
  16. //准备工作
  17. memcpy( block, buf, buf_size ); //将输入数据赋值给临时变量block
  18. x = buf_size / 8; //计算有多少个完整的块
  19. n = buf_size % 8; //计算最后一个块有几个字节
  20. if( n != 0 )     //y非0,则在其后补上0x00...
  21. {
  22. memset( &block[x*8+n], 0x00, 8-n );
  23. x += 1; //将补上的这一块加上去
  24. }
  25. //开始运算
  26. memset( val, 0x00, 8 );
  27. for( i = 0; i < x; i++ )  //有多少块循环多少次
  28. {
  29. DataXOR(val,&block[j], 8,xor);
  30. CurCalc_DES_Encrypt(key,xor,val);//DES加密
  31. j += 8;  //用于取下一块的数据
  32. }
  33. memcpy(mac_buf,val, 8 );
  34. }
[cpp]  view plain copy
  1. /*
  2. *************************************************************************************************
  3. *  异或
  4. *************************************************************************************************
  5. */
  6. void DataXOR( U08 *source, U08 *dest, U32 size, U08 *out )
  7. {
  8. int i;
  9. for( i = 0; i < size; i++ )
  10. { out[i] = dest[i] ^ source[i]; }
  11. }

实现MAC算法的原理,可以参考CPU卡指令手册或PBOC规范。如图:

MAC的计算:

3DES算法计算MAC

DES算法工具:

下载:https://maxwoods.ctfile.com/fs/yNM165157404

ANSI-X99MAC算法和PBOC的3DES MAC算法,附DES算法工具相关推荐

  1. 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 ...

  2. 粒子群优化算法和python代码_Python编程实现粒子群算法(PSO)详解

    1 原理 粒子群算法是群智能一种,是基于对鸟群觅食行为的研究和模拟而来的.假设在鸟群觅食范围,只在一个地方有食物,所有鸟儿看不到食物(不知道食物的具体位置),但是能闻到食物的味道(能知道食物距离自己位 ...

  3. openssl java aes_Java AES算法和OpenSSL配对

    近日工作上的原因,需要实现Java  AES算法和C语言下基于OpenSSL的AES 算法通信.这是个老问题了,网上搜到不少资料,但都不是很详细,没能解决问题.只能自己来了. 先说说AES算法.AES ...

  4. DES算法和MAC算法总结

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

  5. Macos上的专业加密通讯工具,十分安全。使用了信号协议,该协议结合了预密钥,Double Ratchet算法和3-DH握手信号。

    想要让自己聊天信息变得更加安全有隐秘性吗?Signal Desktop for Mac版是一款Macos上的专业加密通讯工具,十分安全.使用了信号协议,该协议结合了预密钥,Double Ratchet ...

  6. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  7. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  8. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  9. 操作系统之存储管理——FIFO算法和LRU算法

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

最新文章

  1. 数据结构与算法-C++实现
  2. conda create -n python 3.6_conda创建python环境
  3. 看漫画学python电子书-看漫画还能学Python❓❓❓| 0基础小白福音
  4. blp模型 上读下写_CreditX在线借贷欺诈检测框架BLP
  5. CeneOS中使用Docker安装Gitlab
  6. mysql slave 状态_python脚本 监控MySQL slave 状态
  7. 《管理3.0》读书笔记
  8. cad卸载工具_如何卸载AutoCAD 附上清理注册表方法
  9. Java 函数式编程的妙用
  10. 《五分钟商学院》个人篇学习总结(下)
  11. Frame Relay - 简单介绍及基本配置
  12. pytorch 支持amd显卡吗_AMD平台上配置PyTorch+Apex开发环境
  13. 谷歌Chrome浏览器
  14. html让gif图片暂停,控制gif图片播放暂停插件-jquery.gif.js
  15. 使用python开发一个剪切视频、音频的小工具(完整案例)
  16. python 实战之模仿开发QQ聊天软件(二)MySQL数据库的连接和使用
  17. 利用Biopython 快速根据pmid 来下载参考文献信息
  18. 来认识一下国内可穿戴设备市场的玩家
  19. 3D游戏建模真的好找工作吗?
  20. mysql .pdb是什么文件_.NET PDB文件到底是什么?

热门文章

  1. segfault信息分析
  2. Unity模型导入相关知识
  3. 代正通_iPhone忘记密码怎么办?苹果手机忘记密码怎么办?iPhone已停用怎么办?
  4. 宏基笔记本 ATI 显卡卡死问题的解决办法
  5. 如何衡量 SLO 的有效性?
  6. 有感于“下一个七年,我是谁?”
  7. 2019-12 前端技术汇总
  8. 机器人的底盘结构是怎样的?
  9. iapd计算机软件,如何让iPad更强大 多款实用iPad软件推荐
  10. adjacent angle_【数学几何的英语用语包括图形的名称.】作业帮