银联des加密实现mac算法实现

uint8_t CalMAC(uint8_t * inbuf, int len, uint8_t * outbuf)
{
    uint8_t buf[17]={0}, tmpbuf[17]={0};
    int     i, l, k, ret;
    uint8_t Mac_key[17] = {0};

    
    memset(buf, 0, sizeof(buf));
    memset(inbuf+len, 0, 8);
    memset(Mac_key, 0, sizeof(Mac_key));

    if( len%8 ) 
        l = len/8 + 1;        
    else 
        l = len/8;
    
    for(i=0; i<l; i++) 
    {
        for(k=0; k<8; k++) 
        {
            buf[k] = buf[k] ^ inbuf[i*8+k];
        }
        buf[8] = '\0';
    }

    BcdToAsc(tmpbuf, buf, 16);
    tmpbuf[16] = 0;

    memcpy(buf, tmpbuf, 8);
    buf[8] = 0;
    GetKeyParam(NULL, Mac_key);
    
    ret = 8;
    API_Crypt(CRYPT_TYPE_DES, Mac_key,8, NULL, buf, 8, buf, 8, (u32*)&ret, CRYPT_MODE_ECB);
    for(k=0; k<8; k++) 
    {
        buf[k] = buf[k] ^ tmpbuf[8+k];
    }

    API_Crypt(CRYPT_TYPE_DES, Mac_key, 8, NULL, buf, 8, buf, 8, (u32*)&ret, CRYPT_MODE_ECB);
    BcdToAsc(tmpbuf, buf, 16);
    memcpy(outbuf, tmpbuf, 8);
    return (OK);    
}

发布了20 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhuimenglushang/article/details/82423010