算法系列6——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的转换关系了。

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);
        }
    }

算法系列6——MAC

时间: 2024-10-09 00:14:34

算法系列6——MAC的相关文章

算法系列1——DES

1. DES算法简介 DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密. DES 使用一个56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feist

算法系列5——SSF33

SSF33算法是以128位分组为单位进行运算,密钥长度为16字节,该算法也可以被用于安全报文传送和MAC机制密文运算. 使用SSF33算法和基于3-DES的对称加密机制使用相同长度的密钥,能够同原有的基于3-DES的密钥管理兼容,其区别在于分组长度不同,在加密,计算MAC和密钥分散时填充和计算方式不同,但报文鉴别码和密钥分散输出结果的长度同3-DES算法保持一致. 算法系列5--SSF33,布布扣,bubuko.com

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

三白话经典算法系列 Shell排序实现

山是包插入的精髓排序排序.这种方法,也被称为窄增量排序,因为DL.Shell至1959提出命名. 该方法的基本思想是:先将整个待排元素序列切割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序. 由于直接插入排序在元素基本有序的情况下(接近最好情况),效率是非常高的,因此希尔排序在时间效率上比前两种方法有较大提高. 以n=10的一个数组49, 38, 65, 97

白话经典算法系列之四 直接选择排序及交换二个数据的正确实现

分类: 白话经典算法系列 2011-08-09 11:15 16682人阅读 评论(29) 收藏 举报 算法面试c 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后. 设数组为a[0…n-1]. 1.      初始时,数组全为无序区为a[0..n-1].令i=0 2.      在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交

算法系列笔记5(扩展数据结构-动态顺序统计和区间树)

在编程中,我们往往使用已有的数据结构无法解决问题,这是不必要急着创建新的数据结构,而是在已有数据结构的基础上添加新的字段.本节在上一次笔记红黑树这一基础数据结构上进行扩展,得出两个重要的应用-动态顺序统计和区间树. 动态顺序统计 在算法系列笔记2中我们在线性时间内完成了静态表的顺序统计,而这里我们在红黑树上进行扩展,在O(lgn)时间内完成该操作,主要包括返回第i 排名的元素os_select(i)和给定一个元素x,返回其排名(os_rank(x)). 思想:添加新项:在红黑树的结点上记录下该结

趣写算法系列之--匈牙利算法(真的很好理解)

[书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(-_-