watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXhzdGFycw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

1. 简单介绍

MAC是使用命令的全部元素(包含命令头)产生的。一条命令的完整性,包含命令数据域(假设存在的话)中的数据元,通过安全报文传送得以保证。依照例如以下的方式使用单重或三重DEA加密方式产生MAC:

第一步:取8个字节的16进制数字’0’作为初始变量。

第二步:依照顺序将数据串联在一起形成数据块。

第三步:将该数据块分成8字节为单位的数据块,标号为D1、D2、D3、D4等。最后的数据块有可能是1-8个字节。

第四步:假设最后的数据块长度是8字节的话,则在其后加上16进制数字’80 00 00 00 00 00 00 00’,转到第五步。

假设最后的数据块长度不足8字节,则在其后加上16进制数字’80’,假设达到8字节长度,则转入第五步。否则在其后增加16进制数字’0’直到长度达到8字节。

第五步:对这些数据块使用MAC过程密钥进行加密。

假设安全报文传送支持单长度的MAC DEA密钥,则按照下图的方式使用MAC 过程密钥来产生MAC。

第六步:终于得到是从计算结果左側取得的4字节长度的MAC。

2. 源代码实现:

  1. void DoSSMac(const BYTE* input, intnInLen, const BYTE* key, int nKeyLen, BYTE* output)
  2. {
  3. BYTE byInitVec[8]; //初始向量
  4. BYTE byTemp[8];
  5.  
  6. memset(byInitVec, 0x00,sizeof(byInitVec));
  7. memset(byTemp, 0x00,sizeof(byTemp));
  8.  
  9. memcpy(byInitVec, input, 8);
  10.  
  11. BYTEbySubKey[3][16][48]; //秘钥
  12.  
  13. memset(bySubKey, 0x01, sizeof(bySubKey));
  14.  
  15. int i = 0;
  16. int j = (nInLen >> 3);
  17.  
  18. //构造并生成SubKeys
  19. BYTE nKey = (nKeyLen >> 3) > 3 ?
  20.  
  21. 3 : (nKeyLen >> 3);
  22. for (i = 0; i < nKey; i++)
  23. {
  24. SetSubKey(&bySubKey[i], &key[i << 3]);
  25. }
  26.  
  27. memcpy(output, input, 8);
  28. if (1 == nKey) //单倍长Key(8字节)
  29. {
  30. j--;
  31. for (int i = 0; i <j; ++i)
  32. {
  33. Xor(input + 8 * (i + 1), output, 8, output);
  34. RunDes(output, 0, &bySubKey[0], output);
  35.  
  36. //memcpy(byInitVec, output, 8); //将输出设定为扭转变量
  37. }
  38. }
  39. <span style="color:#ff0000;"> //转换关系就在这里
  40. else if (2 == nKey) //双倍长Key(16字节)
  41. {
  42. j -= 2;
  43. for (i = 0; i < j;++i)
  44. {
  45. Xor(input + 8 * (i + 1), output, 8, output);
  46. RunDes(output, 0, &bySubKey[0],output); //将输出设定为扭转变量
  47. }
  48. Xor(input + 8 * (++i),output, 8, output); //最后一块数据和上面加密结果异或
  49. RunDes(output, 0,&bySubKey[0], output);
  50. RunDes(output, 1,&bySubKey[1], output);
  51. RunDes(output, 0,&bySubKey[0], output);
  52. }</span>
  53. else //三倍长Key(24字节) 尚未验证
  54. {
  55. //j -= 2;
  56. for (i = 0, j =(nInLen >> 3) - 2; i < j; ++i, input += 8)
  57. {
  58. Xor(input + 8 * (i + 1), output, 8, byTemp);
  59. RunDes(byTemp, 0, &bySubKey[0], output);
  60.  
  61. memcpy(byInitVec, output, 8); //将输出设定为扭转变量
  62. }
  63. Xor(input + 8 * i,output, 8, output);
  64. RunDes(output, 2,&bySubKey[0], output);
  65. RunDes(output, 1,&bySubKey[1], output);
  66. RunDes(output, 0,&bySubKey[0], output);
  67. }
  68. }

3. GP MAC

GP中定义的MAC能够和PBOC中的MAC通过简单计算相互转换,例如以下:

DATA=84820000100102030405060708800000

ICV=0000000000000000

KEY=404142434445464748494A4B4C4D4E4F

安全通道协议标识ALGSCP=02

 

3DES_MAC_1为PBOC中规定的计算MAC方法

3DES_MAC_1(ICV+DATA,KEY,MAC1)//MAC1=106729A5F51BFC24

 

 

GP_MAC为GP中规定的计算MAC方法。相当于CBC_MAC取后8字节。

DATAL=LAST(DATA,16)

DATAB=COPY(DATA,1,16)

KEY1=COPY(KEY,1,16)

CBC_3DES_EN(ICV+DATAB,KEY1,_DATA) 

XDATA=XOR(_DATA,DATAL)

GP_MAC(XDATA,KEY,MAC2)//MAC2=106729A5F51BFC24

 

在你细致读了PBOC_MAC源代码后,相信你就会理解上面GP_MAC和PBOC_MAC的转换关系了。





文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38456657

版权声明:本文博客原创文章,博客,未经同意,不得转载。

等差数列6《MAC》的更多相关文章

  1. 总结:Mac前端开发环境的搭建(配置)

    新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...

  2. JAVA for mac 的学习之路

    要学习一门新技术,首先得下载相关的工具. 一 . 下载相关工具 1. 下载 jdk formac 下载地址为:http://www.oracle.com/technetwork/java/javase ...

  3. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  4. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  5. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  6. Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)

    Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...

  7. Mac OS、Ubuntu 安装及使用 Consul

    Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...

  8. MAC Osx PHP安装指导

    php.ini的位置 Mac OS X中没有默认的php.ini文件,但是有对应的模版文件php.ini.default,位于/private/etc/php.ini.default 或者说 /etc ...

  9. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

随机推荐

  1. libsvm工具箱C++编程实践2

    转载请注明出处  http://blog.csdn.net/u013491262/article/details/37344193   点击打开链接 上周因为皮肤有点过敏,去医院来来回回一周. 前几天 ...

  2. 比ORA-24777: 我不使用不可移植数据库链接更郁闷的事情达成一致

    现场有一个同步误差,内容如下面:    java.sql.BatchUpdateException: ORA-24777: 不同意使用不可移植的数据库链路    at oracle.jdbc.driv ...

  3. 微信QQ的二维码登录原理浅析

    在非常多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用開始多起来,这里先说下啥是二维码,事实上二维码就是存了二进制数据的 ...

  4. 64位WIN7+oracle11g+plsql

    64位WIN7+oracle11g+plsql安装 Posted on 2015-07-28 22:41 算命大师不算卦 阅读(27) 评论(0) 编辑 收藏 上部转自Oracle 11g R2 fo ...

  5. Javascript学习3 - 语句

    原文:Javascript学习3 - 语句 javascript语句同C/C++语句相似,但也几个特殊的语句,在C/C++中没在碰到,列举在下面. 3.1 for/in 语句     可以用来遍历对象 ...

  6. android在单身的对象和一些数据的问题被释放

    正式接触android我们一直在开发了一段时间,该项目的第一个版本最终会很快结束. 当有它自己的测试.拥有android后台.同一时候打开了几个应用之后又一次切回到自己的app.发现报错了.经过排查, ...

  7. NYoj The partial sum problem(简单深搜+优化)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=927 代码: #include <stdio.h> #include & ...

  8. 有趣iOS开展 - 网络请求

    网络请求 $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split(' ...

  9. Android测试流量的几种方法

    1. tcpdump + wireshark 1.1 tcpdump抓包 注意:Android设备使用tcpdump需要root权限 tcpdump是一个在Unix-like系统中通用的网络抓包工具, ...

  10. mysql中国的内容php网页乱码问题

    1.更改mysql编码在数据库 character_set_server=utf8 init_connect='SET NAMES utf8' 加入这两行 2.又第一次启动mysql数据库 版权声明: ...