zoukankan      html  css  js  c++  java
  • 等差数列6《MAC》



    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

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

  • 相关阅读:
    H5移动前端完美布局之-margin百分比的使用
    javascript 一个关于时间排序的算法(一个页面多个倒计时排序)
    html5 getComputedStyle + resize 实现动态宽高度等比响应式页面设计
    Windows 下关于转码的函数
    项目编译完之后自动提交
    eclipse 包含头文件出错
    Eclipse 包含头文件 添加环境变量
    linux下mongodb程序和c++客户端的编译
    简单谈谈消息发送缓冲区
    epoll 性能分析(解决占用CPU 过高问题)2
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4618452.html
Copyright © 2011-2022 走看看