想要一个Java Mac加密和方法支持Ansi X9.9的Mac加密有方法提供或者有解决方案提供者重赏:)

解决方案 »

  1.   

    csdn别处c&p来的C代码,小改一下就成。void xor(unsigned char *input1,unsigned char *input2,unsigned char *output,int len)
    {
         while (len) {
             *output++=*input1++^*input2++;
             len--;
        }
    }
    /*
     *@brief: 根据输入数据计算MAC,初始IV向量默认为"\x00\x00\x00\x00\x00\x00\x00\x00"
     *@param: sMacKey     密钥
     *@param: pInData     输入数据
     *@param: iInLen     输入数据长度
     *@param: pRetData    计算出来的MAC
     *@调用自定义xor和des函数
     */void MacArithmetic(unsigned char *sMacKey,unsigned char *pInData,int iInLen,unsigned char *pRetData)
    {
        //MAC算法:
        //将字符串pInata分为8字节为单位的数据块,不足补\x00,分别标号为D1,D2,D3,...,Dn
        //设置初始向量E0="\x00\x00\x00\x00\x00\x00\x00\x00"
        //将E0^D1 —---->E1(E0,D1异或的后结果经des加密得到E1)
        //将E1^D2 ----->E2
        //如此类推,知道得出En结束,En即是计算出来的MAC
       
        unsigned char sUpData[512];
        unsigned char sData[20];
        unsigned char sXorData[20];
        unsigned char sDesData[20];
        int i,n,iNum;
       
        memset(sUpData,0,sizeof(sUpData));
        memset(sData,0,sizeof(sData));
        memset(sXorData,0,sizeof(sXorData));
        memset(sDesData,0,sizeof(sDesData));
       
       
        //补全要加密数据成8倍数到sUpData,不足补\x00
        memcpy(sUpData,pInData,iInLen);
        iNum = iInLen%8;
        if (iNum == 0)
            n=iInLen/8;
        else {
            n=iInLen/8+1;
            memcpy(sUpData+iInLen,"\x00\x00\x00\x00\x00\x00\x00\x00",8-iNum);
        }
       
        printf("n=%d\nsUpData=[%s]\n",n,sUpData);
       
        //轮循异或,加密
        memcpy(sDesData,"\x00\x00\x00\x00\x00\x00\x00\x00",8);        //初始向量赋给sDesData
        for(i=0;i<n;i++)
        {
            //拷贝sUpData中下一个8位到sData
            memcpy(sData,sUpData+i*8,8);
           
            xor(sDesData,sData,sXorData,8);            //异或
            Des(sXorData,sDesData,sMacKey,1);        //des加密
        }
       
        memcpy(pRetData,sDesData,8);
       
        return ;
    }