今天工作主要学习是计算MAC 和PINBLOCK 。计算pinblock的时候首先要对数据进行处理,卡号,一般的处理过程位从倒数第二位开始截取,向前截取12位,获取的这12位前加0补足16位。
Pin的处理:一般密码为六位或者四位,当为四位时在密码前面添加04,不足16位在后面补足F。当密码为六位时前面添加06,不足16位后面补足F。然后将两组数据异或,再与密钥进行3des运算。结果即为所求。
注意:所有数据进行3des前都必须要进行压缩,而且在运算处理后还应该进行解压,这样才可以保证数据正确,在进行des运算时,不但要传入指向数据的指针,而且还要有数据的长度,这样才能才能保证数据的完整性。des_ec只是des运算的一部分,之前还要很多其他的操作,所以不能直接使用,要参照之前的程序来模仿这来。
示例:ANSI X9.8密码加密:
1、将卡号去校验位,取右12位。如5309833221044200,取下画部分,前拼4个0得到CARDNO,并压成BCD码。
2、 将PINPAD输入的密码正文拼接,得06??????FFFFFFFF, 04????FFFFFFFFFF,并压成BCD码。
3、将1、2步所得异或得PAN。
4、TRIPLE-DES(PIN-BLOCK-KEY ,PAN)结果即为加密后的PIN-BLOCK;
MAC的产生:采用ANSI X9.19算法
终端与前置机之间的交易报文格式为:
报文长度 TPDU 报文标识 bitmap 交易数据 MAC
2Bytes 5Bytes 2Bytes 8Bytes 变长 8Bytes
计算MAC:首先将8Bytes 的bitmap和变长的交易数据分成若干个64位的数据段,
最后一个数据段(N)不足64位的在后面加零补够64位。然后计算
(1) ANSI X9.19MAC算法只使用双倍长密钥。
(2) MAC数据先按8字节分组,表示为D0~Dn,如果Dn不足8字节时,尾部以字节00补齐。
(3) 用MAC密钥左半部加密(单DES)D0,加密结果与D1异或作为下一次的输入。
(4) 将上一步的加密结果与下一分组异或,然后用MAC密钥左半部加密(单DES)。
(5) 直至所有分组结束。
(6) 用MAC密钥右半部解密(5)的结果。
(7) 用MAC密钥左半部加密(6)的结果。
(8) 取(7)的结果作为MAC。
2.MAC的校验:
MAC的校验采用了跟MAC的产生相同的算法,它通过在正文后面附加64位的MAC,作为正文确认用;信息传送到对方后,接受方通过与发送方相同的密钥和算法对信息进行加密后,比较计算出来的MAC与收到的MAC是否一致来判断信息本身是否完整和准确。