iso8583报文计算mac值
1.0-63域作为计算mac值数据data;
2.将data每8字节进行异或运算;
3.将异或结果扩充,取前8和后8;
4.使用3des双倍长对前8进行加密;
5.将4步结果异或后8;
6.将5步结果进行3des双倍长加密;
7.最后转16进制字符串并取左半部分;

public String cal_ANSI9_19_MAC(byte[] isoMacKey, byte[] data){
    /* 获取0-63域数据 */
    byte[] nomac_body = new byte[data.length -8];
    System.arrycopy(data, 0, nomac_body, 0, data.length-8);
    
    /* 对0-64域每8字节进行分组,并每组进行异或 */
    byte[] xorBlock = xorBlock(nomac_body);
    
    byte[] hexBlock = StringUtil.byte2HexStr(xorBlock).getBytes();
    
    byte[] frontHexBlock = new byte[8];
    byte[] tailHexBlock = new byte[8];
    System.arraycopy(hexBlock, 0, frontHexBlock, 0, 8);
    System.arraycopy(hexBlock, 8, tailHexBlock, 0, 8);
    byte[] result = des3Encrypt(isoMacKey, frontHexBlock);
    for(int i = 0; i<8; i++){
        result[i] = (byte)(result[i] ^ tailHexBlock[i]);
    }
    byte[] dest_result = des3Encrypt(isoMacKey, result);
    String strMac =StringUtil.byte2HexStr(dest_result).subString(0,8);
    
}

/* 每8字节异或 */
public byte[] xorBlock(byte[] block){
    int length = block.length;
    int round = 0;
    int i = 0;
    int j = 0;
    byte[] xorByte =  new byte[8];
    if (length % 8 != 0){
        round = length / 8 + 1;
    }
    else{
        round = length / 8;
    }
    for(i = 0; i<round; i++){
        for(j = 0; j<8; j++){
            if (i*8 + j > length){
                break;
            }
            xoByte[j] = (byte)(xorByte[j] ^ block[i*8 + j]);
        }
    }
    return xorByte;
}

byte[] des3Encrypt(byte[] key, byte[] block){
    byte[] newkey = expandKey(key);
    byte[] paddingData = paddingData(data);
    try{
        SecretKey deskey = new Secretekey(newkey, \"DESede\");
        Cipher cpr = Cipher.getInstance(\"DESede/ECB/NoPadding\");
        cpr.init(Cipher.ENCRYPT_MODE, deskey);
        return cpr.doFinal(paddingData);
    }catch(java.security.NoSuchAlgorithmException e1){
        e1.printStackTrace();
    }
    catch(java.security.NoSuchPaddingException e2){
        e2.printStackTrace();
    }
    catch(java.lang.Exception e3){
        e3.printStackTrace();
    }

}
收藏 打印