等差数列6《MAC》
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. 源代码实现:
void DoSSMac(const BYTE* input, intnInLen, const BYTE* key, int nKeyLen, BYTE* output)
{
BYTE byInitVec[8]; //初始向量
BYTE byTemp[8]; memset(byInitVec, 0x00,sizeof(byInitVec));
memset(byTemp, 0x00,sizeof(byTemp)); memcpy(byInitVec, input, 8); BYTEbySubKey[3][16][48]; //秘钥 memset(bySubKey, 0x01, sizeof(bySubKey)); int i = 0;
int j = (nInLen >> 3); //构造并生成SubKeys
BYTE nKey = (nKeyLen >> 3) > 3 ? 3 : (nKeyLen >> 3);
for (i = 0; i < nKey; i++)
{
SetSubKey(&bySubKey[i], &key[i << 3]);
} memcpy(output, input, 8);
if (1 == nKey) //单倍长Key(8字节)
{
j--;
for (int i = 0; i <j; ++i)
{
Xor(input + 8 * (i + 1), output, 8, output);
RunDes(output, 0, &bySubKey[0], output); //memcpy(byInitVec, output, 8); //将输出设定为扭转变量
}
}
<span style="color:#ff0000;"> //转换关系就在这里
else if (2 == nKey) //双倍长Key(16字节)
{
j -= 2;
for (i = 0; i < j;++i)
{
Xor(input + 8 * (i + 1), output, 8, output);
RunDes(output, 0, &bySubKey[0],output); //将输出设定为扭转变量
}
Xor(input + 8 * (++i),output, 8, output); //最后一块数据和上面加密结果异或
RunDes(output, 0,&bySubKey[0], output);
RunDes(output, 1,&bySubKey[1], output);
RunDes(output, 0,&bySubKey[0], output);
}</span>
else //三倍长Key(24字节) 尚未验证
{
//j -= 2;
for (i = 0, j =(nInLen >> 3) - 2; i < j; ++i, input += 8)
{
Xor(input + 8 * (i + 1), output, 8, byTemp);
RunDes(byTemp, 0, &bySubKey[0], output); memcpy(byInitVec, output, 8); //将输出设定为扭转变量
}
Xor(input + 8 * i,output, 8, output);
RunDes(output, 2,&bySubKey[0], output);
RunDes(output, 1,&bySubKey[1], output);
RunDes(output, 0,&bySubKey[0], output);
}
}
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》的更多相关文章
- 总结:Mac前端开发环境的搭建(配置)
新年新气象,在2016年的第一天,我入手了人生中第一台自己的电脑(大一时好友赠送的电脑在一次无意中烧坏了主板,此后便不断借用别人的或者网站的).macbook air,身上已无分文...接下来半年的房 ...
- JAVA for mac 的学习之路
要学习一门新技术,首先得下载相关的工具. 一 . 下载相关工具 1. 下载 jdk formac 下载地址为:http://www.oracle.com/technetwork/java/javase ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- mac下安装及配置tomcat
mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...
- Mac OS 使用 Vagrant 管理虚拟机(VirtualBox)
Vagrant(官网.github)是一款构建虚拟开发环境的工具,支持 Window,Linux,Mac OS,Vagrant 中的 Boxes 概念类似于 Docker(实质是不同的),你可以把它看 ...
- Mac OS、Ubuntu 安装及使用 Consul
Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...
- MAC Osx PHP安装指导
php.ini的位置 Mac OS X中没有默认的php.ini文件,但是有对应的模版文件php.ini.default,位于/private/etc/php.ini.default 或者说 /etc ...
- MAC下 mysql不能插入中文和中文乱码的问题总结
MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...
随机推荐
- Team Foundation Server 2015使用教程--默认团队权限说明
- ORACLE安装心得,大家一起分享,假设不正确的地方,大家请指出来
1. 安装\Oracle\10201_database_win32.zip: a) 安装图解: http://jingyan.baidu.com/article/5d6edee228308899ead ...
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)
对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method ...
- 有愿意共同发展USB固件做?
有愿意共同发展USB固件做.现在,它使用STC89S52+PDIUSBD12(环教你玩USB开发板)它实现了一个USB键盘,项目地址:https://github.com/artprogramming ...
- Web 前端开发环境
创建 Web 前端开发环境 Web 前端开发涉及多种工具,这里将常用工具的安装和配置进行说明,提供了详细的说明,为后继的开发创建一个坚实的基础. 本文介绍的工具有:NodeJS, NPM, Bower ...
- cocos2d-x 网络请求
[cocos2dx]rapidjson用法以及中文显示的解决方法 cocos2dx 读取json及解析 cocos2dx rapidjson 高速解析JSON --- [cocos2d-x官方文档] ...
- Java数据结构与算法(21) - ch09红黑树(RB树)
红-黑规则1. 每一个节点不是红色的就是黑色的2. 根总是黑色的3. 如果节点是红色的,则它的子节点必须是黑色的:如果节点是黑色的,其子节点不是必须为红色.4. 从根到叶节点或空子节点的每条路径,必须 ...
- Java数据结构与算法(13) - ch06递归(归并排序)
时间为O(N*logN). 归并排序的一个缺点是它需要在存储器中有另一个大小等于被排序的数据项数目的数组.归并两个有序的数组.利用递归,不断的将数组进行二分法排序,然后进行归并即可.
- linux下一个eclipse组态jdk
今天ubuntu12.04安装eclipse,安装该想法eclipse后.还需要配置jdk.但没想到eclipse我有自己主动做好(但最主要的原因是我的linux在刚刚安装了一个jdk,假设有两个或更 ...
- 假设动态运行java文字,当在脚本式配置,这是非常方便的
package com.bfrj.core.groovy; import java.util.HashMap; import java.util.Map; import org.jeecgframew ...