求mac算法

MyDream83 2011-07-18 12:00:12
大侠们,求mac算法的java实现,搜了半天只有c的。
能支持银联ansi 9.9 mac 算法

参与消息校验码(MAC)的数据由三部分产生:初始数据,原始数据,补位数据。
MAC算法如下:
1)算法定义:采用DES CBC算法。
2)初始数据:0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00。
3)原始数据:原始数据包含整个包头和包体。
4)补位数据:若原始数据不是8的倍数,则右补齐0x00。若原
始数据为8的整数倍,则不用补齐0x00。
5)密 钥:MAC密钥。
MAC的产生由以下方式完成:(最后一组数据长度若不足8的倍数,则右补齐0x00;若数据长度为8的整数倍,则无需补充0x00)。


...全文
820 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwcomcn123 2012-07-26
  • 打赏
  • 举报
回复
唉 还是拿十分可用分好了
cosmic-bo 2012-07-26
  • 打赏
  • 举报
回复
我也遇到同样的问题 问题解决了 给我也发一分吧?QQ:216967956

1、使用主密钥:3016745AB289EFCDBADCFE0325476981,3des解密数据:737F4B7E02556282 ,得到MACKEY明文:07B0AB16A18AAB08 ;
2、然后用MACKEY:07B0AB16A18AAB08 ,初始数据:0000000000000000 ,mab的HEX数据:30383130822000008200080004000000000000013038313031303132343130323530313030383439393035373134303032303030303030303030303030303030313031 ,
经过ANSI-X9.9-MAC计算出MAC=7869E65451C9A183。
zhouxingyu896 2011-07-31
  • 打赏
  • 举报
回复
学习
学习
lcj_up 2011-07-27
  • 打赏
  • 举报
回复
只能帮顶了。。
KPRF2009 2011-07-24
  • 打赏
  • 举报
回复
mark一下
xiaotugege 2011-07-24
  • 打赏
  • 举报
回复
那按照你滴说法,终端的mac计算也要用加密机来做咯?
[Quote=引用 13 楼 guujiang 的回复:]
你真的做的是银行系统的话,就要用硬件加密机来实现,不使用加密机的话你们的系统应该是通不过银联的认证的吧,加密机里有现成的MAC实现
[/Quote]
xiaotugege 2011-07-24
  • 打赏
  • 举报
回复

public class AnsiiX99MAC {
static{
Security.addProvider(new BouncyCastleProvider());
}
public static void main(String[] args) {
//zak(mackey)
byte[] MACKEY = ConvertUtil.strToBcd("8F37EADF07CB5232");
//待计算数据
byte[] data = ConvertUtil.stringToBytes("0200702004C000C010532000008600898000005018600000000000000100000047021F9106323330303030303133303130303230303030303036313000000000000000000047525108980001FFFFFFFF00008600898000005018741ECF4A010000010001863C00000064020000000000017132B6B800114000000800000003303030","iso8859-1");
//进行分组
int group = (data.length + (8 - 1)) / 8;
//偏移量
int offset = 0 ;
//输入计算数据
byte[] edata = null;
for(int i = 0 ; i < group; i++){
byte[] temp = new byte[8];
if(i != group - 1){
System.arraycopy(data, offset, temp, 0, 8);
offset += 8;
}else{//只有最后一组数据才进行填充0x00
System.arraycopy(data, offset, temp, 0, data.length - offset);
}

if(i != 0){//只有第一次不做异或
temp = XOR(edata,temp);
}
edata = desedeEn(MACKEY,temp);
}
System.err.println(ConvertUtil.bcdToStr(edata));
}

public static byte[] XOR(byte[] edata, byte[] temp) {
byte [] result = new byte[8];
for (int i = 0 , j = result.length ; i < j; i++) {
result [i] = (byte) (edata[i] ^ temp[i]);
}
return result;
}

public static byte[] desedeEn(byte[] key,byte[] data){
byte[] result = null;
try {
SecretKey secretKey = getSecretKeySpec(key);
Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding","BC");
cipher.init(Cipher.ENCRYPT_MODE, secretKey,new IvParameterSpec(new byte[8]));//初始化项目为0
result = cipher.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}


private static SecretKey getSecretKeySpec(byte[] keyB) throws NoSuchAlgorithmException, InvalidKeySpecException {
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("Des");
SecretKeySpec secretKeySpec = new SecretKeySpec(keyB,"Des");
return secretKeyFactory.generateSecret(secretKeySpec);
}
}



9.9的标准在国内还是有不少变种的,记不太清你这是那的标准了,给你一个国际标准的实现...
GuuJiang 2011-07-22
  • 打赏
  • 举报
回复
你真的做的是银行系统的话,就要用硬件加密机来实现,不使用加密机的话你们的系统应该是通不过银联的认证的吧,加密机里有现成的MAC实现
  • 打赏
  • 举报
回复
这是个变种的 Mac 算法。

要实现不难,不过你得先去看一下 CBC 这种加密模式是如何工作的,否则你很难写出来。
http://it.wikipedia.org/wiki/Modalit%C3%A0_di_funzionamento_dei_cifrari_a_blocchi#Cipher_Block_Chaining_.28CBC.29

从这里看,基本就是个采用 CBC 模式的 DES 算法,而且还是个变了种的填充方式。
KPRF2009 2011-07-19
  • 打赏
  • 举报
回复
这么专业的问题。有人知道也不一定会回答你。
zn85600301 2011-07-18
  • 打赏
  • 举报
回复
你是要自己实现mac的加密算法 那就爱莫能助了

哎呦喂哈 2011-07-18
  • 打赏
  • 举报
回复
学习下,帮顶
皮特张 2011-07-18
  • 打赏
  • 举报
回复
阿门,看来我只能顶贴了呀。
zl3450341 2011-07-18
  • 打赏
  • 举报
回复
这么专业的东西,除了同行,其它人估计没法回答你
iis81365341 2011-07-18
  • 打赏
  • 举报
回复
这个东东没听过。
飞跃颠峰 2011-07-18
  • 打赏
  • 举报
回复
有现成的API,去查JCE文档
HeiBoyYang 2011-07-18
  • 打赏
  • 举报
回复
现成api没 你自己写好了可以=封装一下
MyDream83 2011-07-18
  • 打赏
  • 举报
回复
不想自己实现啊,有现成的api用吗?
HeiBoyYang 2011-07-18
  • 打赏
  • 举报
回复
简单的 :
一般是在数据的尾部增加一个信息摘要,一般用MD5、SHA、CRC32等算法计算。
MD5、SHA可以参考javax.security中的加密部分。
boolean CheckMac (byte [] data, int macOffset)
{
byte [] orgMac = new byte [data.length - macOffset] ;
ArrayCopy (orgMac, data, macOffset, orgMac.length) ;

byte [] mac = ComputeMac (data, 0, macOffset) ; ...计算的mac
// 比较mac是否相等
for (int i = 0 ; i < orgMac.length ; i ++)
if (orgMac [i] != mac [i]) return false ;

return true ;
}
飞跃颠峰 2011-07-18
  • 打赏
  • 举报
回复
用JCE(Java Cryptography Extension)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧