首先关于RSA:
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
A=B^e2 mod n;B=A^e1 mod n(e1和e2可以互换使用,即:A=B^e1mod n;B=A^e2 mod n;)
---《百度百科.RSA算法》
在金融交易里面,站在终端的角度来看,RSA算法主要用于在公钥解密,并恢复证书(发卡行公钥证书,IC卡公钥证书)。
下面从三种不同的公钥,阐述在POS终端里,RSA算法在脱机数据认证过程中发挥的作用和使用过程。
一、 CA公钥:
1. 来源:从后台下发,通过8583协议获取,获取格式为:RID+索引+有效期+哈什算法标识+公钥算法标识+公钥模+公钥指数+公钥校验值。
2. 作用:通过RSA算法,把发卡行公钥从发卡行公钥证书中恢复出来。
3. 过程:下载CA公钥后,校验数据,然后通过RID和索引,确定使用的CA公钥,把发卡行公钥证书恢复出来。
二、 发卡行公钥:
1. 来源:通过ReadRecord 指令,从卡片读取三个数据:90(发卡行公钥证书),9F32(发卡行RSA公钥指数),92(发卡行RSA公钥余数)。通过上面CA公钥恢复发卡行公钥证书,得到下面的格式:图1.
公钥指数已经从Read Record获取得到,公钥模在恢复出来里面的数据有,不过根据发卡行公钥的长度,可能需要把发卡行余数拼凑起来。
2. 作用:通过RSA算法,把IC卡公钥从IC卡行公钥证书中恢复出来。如果卡片不支持DDA或者CDA,那么发卡行公钥的作用就是用于验证静态签名数据的正确性。
3. 过程:通过CA公钥,恢复发卡行公钥证书,得到发卡行公钥的一部分相关数据,再结合从卡片读取得到的数据,得到完整的发卡行公钥数据。注意在恢复数据后,需要拼凑其他数据,进行哈希计算比对校验值。如果卡片仅支持SDA,就在这里完成静态签名数据的恢复,并比对哈希值,完成SDA.
三、 IC卡公钥:
1. 来源:通过ReadRecord 指令,从卡片读取三个数据:9F46(IC卡公钥证书),9F47(IC卡RSA公钥指数),9F48(IC卡RSA公钥余数)。通过上面发卡行公钥恢复IC卡公钥证书,得到下面的格式:图2.
公钥指数已经从Read Record获取得到,公钥模在恢复出来里面的数据有,根据发卡行公钥的长度,可能需要把发卡行余数拼凑起来。
2. 作用:通过RSA算法,验证内部认证指令生成的签名的动态应用数据是否正确,以及可用于验证GAC之后可能生成的签名的动态应用数据。
3. 过程:使用IC卡公钥恢复签名的动态应用数据,获取哈希结果以及其他数据。比对哈希结果,完成DDA或者CDA。
之所以写这篇文章,是因为想清晰一些问题。
特别是在刚开始看到BCTC发的IC卡送检指南里面,某一个长度的RSA数据里面,写着:“发卡行公钥:XXX””发卡行私钥:XXX”,表示完全看不懂,什么意思,公钥不是包括模和指数么,私钥也是模和指数啊,而且有“发卡行公钥指数”,那么刚才那个“发卡行公钥”又算是什么。一头雾水,就不再吐槽了,整理了一下,应该是这个意思:
发卡行公钥 =》发卡行公共模数
发卡行私钥=》私钥的指数
发卡行公钥余数,也就是发卡行公钥余项,反正规范喜欢两个随意用。NND!
原文:http://blog.csdn.net/freud_lv/article/details/38270519