/** * */ package net.etongbao.common.utils; import java.util.Arrays; /** * Mac工具类,采用ECB算法 * * @author Fu Wei * */ public class MacEcbUtils { public static byte[] IV = new byte[8]; public static byte byteXOR(byte src, byte src1) { return (byte) ((src & 0xFF) ^ (src1 & 0xFF)); } public static byte[] bytesXOR(byte[] src, byte[] src1) { int length = src.length; if (length != src1.length) { return null; } byte[] result = new byte[length]; for (int i = 0; i < length; i++) { result[i] = byteXOR(src[i], src1[i]); } return result; } /** * mac计算,数据不为8的倍数,需要补0,将数据8个字节进行异或,再将异或的结果与下一个8个字节异或,一直到最后,将异或后的数据进行DES计算 * * @param key * @param Input * @return */ public static byte[] clacMac(byte[] key, byte[] Input) { int length = Input.length; int x = length % 8; int addLen = 0; if (x != 0) { addLen = 8 - length % 8; } int pos = 0; byte[] data = new byte[length + addLen]; System.arraycopy(Input, 0, data, 0, length); byte[] oper1 = new byte[8]; System.arraycopy(data, pos, oper1, 0, 8); pos += 8; for (int i = 1; i < data.length / 8; i++) { byte[] oper2 = new byte[8]; System.arraycopy(data, pos, oper2, 0, 8); byte[] t = bytesXOR(oper1, oper2); oper1 = t; pos += 8; } byte[] buff = DesUtils.encrypt(oper1, key); // 取8个长度字节 byte[] retBuf = new byte[8]; System.arraycopy(buff, 0, retBuf, 0, 8); return retBuf; } public static void main(String[] args) { byte[] buff = { 2, 1, 32, 32, 0, 0, 0, -64, -128, 25, 0, 0, 0, 0, 0, 86, 48, 49, 48, 52, 55, 51, 50, 53, 49, 48, 52, 49, 49, 48, 49, 53, 52, 49, 49, 52, 54, 54, 48, 67, 78, 89, 0, 6, 48, 49, 49, 48, 48, 48, 0, 68, 48, 48, 48, 48, 48, 49, 48, 56, 48, 48, 48, 49, 103, 80, 102, 53, 90, 72, 119, 67, 101, 105, 52, 61, 67, 90, 83, 83, 48, 48, 49, 53, 17, 49, 51, 49, 51, 49, 51, 49, 51, 49, 51, 49 }; System.out.println(Arrays.toString(clacMac("b69e6b76".getBytes(), buff))); } }