转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/7429296
作者:小马
前一篇文章讲了SDA,DDA的步骤可以这样理解:先执行SDA,再执行DDA特有的步骤. 所以这篇文章主要讲这个特有的步骤.正是这个特有的步骤,使得DDA不仅具有SDA的功能(保证卡片上的数据在个人化后不会被修改),还可以防止卡片被复制伪造.
第一步,取IC公钥
在SDA阶段取得的发卡行公钥,在DDA时还有一个用途,就是恢复IC卡公钥. 可以用下面的公式表示:
发卡行公钥+IC卡公钥证书+RSA算法=IC卡公钥
IC卡公钥证书是终端在读数据阶段从卡里读出来的, 是一串密文数据,类似如下:
* Tag 9F46 ICC Public Key Certificate * - Len 50 * - Value 79 DE 85 4F 1F 84 9E 8B 42 9D 72 6A 8B 93 F0 E9 * 83 06 B7 7F A8 78 67 26 B4 F6 25 6B ED 87 9F 2C * 24 52 24 DD 93 1C A8 0D 44 D8 C6 A5 5E 6D A9 BB * E5 F3 E2 7F 65 98 28 E4 2D 27 A1 7C 33 49 88 83 * 34 D7 46 3C 0C 6E C7 BA 93 D6 27 65 44 FB BF C5
第二步,取签名的动态数据
终端首先发起内部认证命令给卡片, 命令的数据域是DDOL中指明的数据, DDOL是卡片在读数据阶段返回给终端的,告诉终端自己需要哪些终端数据来生成签名的动态数据. 举例如下:
* Tag 9F49 Dynamic Data Authentication Data (DDOL) * - Len 15 * - Value 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 * 9C 01 9F 37 04
要注意9F37(终端不可预知数)是DDOL的必备项.
卡片用终端送来的DDOL中的数据,加上自己产生的动态数据(比如ATC),用IC卡私钥(注意这个, 这个私钥放在安全存贮区域,是不可复制的)生成一个密文数据,这个数据叫做签名的动态应用数据. 然后卡片把这个数据通过内部认证返回给终端.
第三步,验证哈希值
用公式可表示如下:
IC卡公钥+动态签名的应用数据+RSA=数据A
数据A也包括两部分,一部分我把它叫A1,另一部分叫哈希结果A
终端用A1加上DDOL指定的数据,用指定的哈希算法计算一个哈希结果B.
A和B比较,如果相等,则DDA成功,否则失败.
前面一开始说到,DDA可以防止复制卡片, 从上面一系列的流程可以看出, 即使你复制一张卡,SDA可以通过(因为静态的数据都是一样的),但是由于IC卡私钥的安全性,动态签名的验证是肯定失败的.