1. 概述html
DDA的目的是確認存放在IC卡中和由IC卡生成的關鍵數據以及從終端收到的數據的合法性。DDA除了執行同SDA相似的靜態數據認證過程,確保IC卡中的髮卡行數據在我的化之後沒有被非法篡改,還能防止任何對這樣的卡片進行僞造的可能性。算法
支持動態數據認證的IC卡必須包含下列數據元:url
1.1. 認證中心公鑰索引:該單字節數據元包含一個二進制數字,指明終端應使用其保存的相應的認證中心公鑰spa
中的哪個來驗證IC卡;htm
1.2. 髮卡行公鑰證書:該變長數據元由相應的認證中心提供給髮卡行;對象
1.3. IC卡公鑰證書;blog
1.4. 髮卡行公鑰的餘項;索引
1.5. 髮卡行公鑰指數;ci
1.6. IC卡公鑰的餘項;get
1.7. IC卡公鑰指數;
1.8. IC卡私鑰。
支持動態數據認證的IC卡必須生成下列數據元:
---簽名的動態應用數據:一個由IC卡使用同IC卡公鑰證書所認證的IC卡公鑰相對應的IC卡私鑰生成的變長數據
元。它是一個數字簽名。
---爲了支持動態數據認證,每一臺終端必須可以爲每一個註冊的應用提供商標識存儲5個認證中心公鑰,並且必須
使同密鑰相關的密鑰信息可以同每個密鑰相關聯(以使終端能在未來支持多種算法,容許從一個算法過渡
到另外一個)。在給定RID和IC卡提供的認證中心公鑰索引的狀況下,終端必須可以定位這樣的公鑰以及和公鑰
相關的信息。
動態數據認證過程當中的主要步驟以下:
由終端恢復認證中心公鑰;
由終端恢復髮卡行公鑰;
由終端恢復IC卡公鑰。
DDA證書和公鑰體系結構如圖1所示:
1. 認證中心和髮卡行各自產生本身的公私鑰對;
2. 髮卡行將本身的公鑰傳給認證中心;
3. 認證中心用本身的私鑰對髮卡行的公鑰進行簽名;
4. 髮卡行在將卡片分發給持卡人時,由卡片產生本身的公私鑰對,而且卡片將本身的公鑰傳給髮卡行
5. 髮卡行用本身的私鑰對卡片的公鑰進行簽名;
6. 髮卡行將認證中心簽名的髮卡行公鑰證書,以及用髮卡行私鑰簽名的卡片公鑰證書一塊兒些人IC卡內
7. 發生交易時,終端經過READ RECORD命令獲取認證中心公鑰索引,髮卡行公鑰證書,IC卡公鑰證書
8. 終端根據該認證中心公鑰索引檢索存儲在終端的認證中心公鑰,
9. 終端將認證中心公鑰和RSA算法應用於髮卡行公鑰證書,恢復出發卡行公鑰
10. 終端將髮卡行公鑰和RSA算法應用於IC卡公鑰證書,恢復出IC卡公鑰
11. 終端發送內部認證命令給卡片,內部認證命令的數據位4字節長度的不可預知數
12. 卡片返回簽名的動態應用數據,其標籤值爲9F4B
13. 終端使用IC卡公鑰對該數據進行恢復;
14. 終端使用SHA1算法驗證動態簽名的正確性
2. 密鑰和證書
爲了支持動態數據認證,一張IC卡必須擁有它本身的惟一的公私鑰對,公私鑰對由一個私有的簽名密鑰和相對應的公開的驗證密鑰組成。IC卡公鑰必須存放在IC卡上的公鑰證書中。
動態數據認證採用了一個三層的公鑰證書方案。每個IC卡公鑰由它的髮卡行認證,而認證中心認證髮卡行公鑰。這代表爲了驗證IC卡的簽名,終端須要先經過驗證兩個證書來恢復和驗證IC卡公鑰,而後用這個公鑰來驗證IC卡的動態簽名。分別將認證中心私鑰SCA應用到表6中指定的數據以及將髮卡行私鑰SI應用到表7中指定的數據,以分別得到髮卡行公鑰證書和IC卡公鑰證書。
認證中心的公鑰有一個NCA個字節的公鑰模。認證中心公鑰指數必須等於3或216+1。
髮卡行的公鑰有一個爲NI個字節(NI≤NCA)的髮卡行公鑰模。若是NI>(NCA-36),那麼髮卡行公鑰模被
分紅兩部分,即一部分包含模中最高的NCA-36個字節(髮卡行公鑰中最左邊的數字);另外一部分包含剩下的模
中最低的NI-(NCA-36)個字節(髮卡行公鑰餘項)。髮卡行公鑰指數必須等於3或216+1。
IC卡的公鑰有一個爲NIC個字節(NIC≤NI≤NCA)的IC卡公鑰模。若是NIC>(NI-42),那麼IC卡公鑰模被分紅兩部分,即一部分包含模中最高的NI-42個字節(IC卡公鑰中最左邊的數字);另外一部分包含剩下的模中最低的NIC-(NI-42)個字節(IC卡公鑰餘項)。IC卡公鑰指數必須等於3或216+1。
若是卡片上的靜態應用數據不是惟一的(好比卡片針對國際和國內交易使用不一樣的CVM),卡片必須支持多IC卡公鑰證書,若是被簽名的靜態應用數據在卡片發出後可能會被修改,卡片必須支持IC卡公鑰證書的更新。
爲了完成動態數據認證,終端必須首先恢復和驗證IC卡公鑰(這一步叫作IC卡公鑰認證)。IC卡公鑰認證須要的全部信息在表8中詳細說明,並存放在IC卡中。除了RID能夠從AID中得到外,其它信息能夠經過讀取記錄(READ RECORD)命令獲得。若是缺乏這些數據中的任意一項,那麼動態數據認證失敗。
表1 由認證中心簽名的髮卡行公鑰數據(即哈希算法的輸入)
字段名 |
長度 |
描述 |
格式 |
證書格式 |
1 |
十六進制,值爲‘02’ |
b |
髮卡行識別號 |
4 |
主帳號最左面的3-8個數字。(在右邊補上十六進制數‘F’) |
cn8 |
證書失效日期 |
2 |
MMYY,在此日期後,這張證書無效 |
n4 |
證書序列號 |
3 |
由認證中心分配給這張證書的惟一的二進制數 |
b |
哈希算法標識 |
1 |
標識用於在數字簽名方案中產生哈希結果的哈希算法 |
b |
髮卡行公鑰算法標識 |
1 |
標識使用髮卡行公鑰的數字簽名算法 |
b |
髮卡行公鑰長度 |
1 |
標識髮卡行公鑰模的字節長度 |
b |
髮卡行公鑰指數長度 |
1 |
標識髮卡行公鑰指數的字節長度 |
b |
髮卡行公鑰或髮卡行公鑰的最左邊字節 |
NCA–36 |
若是NI≤NCA–36,這個字段包含了在右邊補上了NCA–36–NI個值爲‘BB’的字節的整個髮卡行公鑰。 若是NI>NCA-36,這個字段包含了髮卡行公鑰最高位的NCA–36個字節 |
b |
髮卡行公鑰的餘項 |
0或 NI–NCA+36 |
這個字段只有在NI>NCA–36時纔出現。它包含了髮卡行公鑰最低位的NI–NCA+36個字節 |
b |
髮卡行公鑰指數 |
1或3 |
髮卡行公鑰指數等於3或216+1 |
b |
表2 由髮卡行簽名的IC卡公鑰數據(即哈希算法的輸入)
字段名 |
長度 |
描述 |
格式 |
證書格式 |
1 |
十六進制,值爲‘04’ |
b |
應用主帳號 |
10 |
主帳號(在右邊補上十六進制數‘F’) |
cn20 |
證書失效日期 |
2 |
MMYY,在此日期後,這張證書無效 |
n4 |
證書序列號 |
3 |
由髮卡行分配給這張證書的惟一的二進制數 |
b |
哈希算法標識 |
1 |
標識用於在數字簽名方案中產生哈希結果的哈希算法 |
b |
IC卡公鑰算法標識 |
1 |
標識使用在IC卡公鑰上的數字簽名算法 |
b |
IC卡公鑰長度 |
1 |
標識IC卡公鑰的模的字節長度 |
b |
IC卡公鑰指數長度 |
1 |
標識IC卡公鑰指數的字節長度 |
b |
IC卡公鑰或IC卡公鑰的最左邊字節 |
NI–42 |
若是NIC≤NI–42,這個字段包含了在右邊補上了NI–42–NIC個值爲‘BB’的字節的整個IC卡公鑰。 若是NIC>NI–42,這個字段包含了IC卡公鑰最高位的NI–42個字節 |
b |
IC卡公鑰的餘項 |
0或 NIC–NI+42 |
這個字段只有在NIC>NI–42時纔出現。它包含了IC卡公鑰最低位的NIC–NI+42個字節 |
b |
IC卡公鑰指數 |
1或3 |
IC卡公鑰指數等於3或216+1 |
b |
需認證的靜態數據 |
變長 |
在JR/T 0025.5的9.3.1條詳細說明了需認證的靜態數據 |
b |
認證過程的輸入由被AFL標識的記錄組成,其後跟有AIP[若是AIP被可選的靜態數據認證標籤列表(標籤「9F4A」)標識。若是靜態數據認證標籤列表存在,它必須僅包含標識AIP用的標籤「82」。
表3 動態認證中的公鑰認證所需的數據對象
標籤 |
長度 |
值 |
格式 |
- |
5 |
註冊的應用提供商標識 |
b |
‘8F’ |
1 |
認證中心公鑰索引 |
b |
‘90’ |
NCA |
髮卡行公鑰證書 |
b |
‘92’ |
NI–NCA+36 |
髮卡行公鑰的餘項(若是存在) |
b |
‘9F32’ |
1或3 |
髮卡行公鑰指數 |
b |
‘9F46’ |
NI |
IC卡公鑰證書 |
b |
‘9F48’ |
NIC–NI+42 |
IC卡公鑰的餘項(若是存在) |
b |
‘9F47’ |
1或3 |
IC卡公鑰指數 |
b |
- |
變長 |
在JR/T 0025.5的9.3.1條詳細說明了需認證的靜態數據 |
- |
2.1. 認證中心公鑰的獲取
終端讀取認證中心公鑰索引。使用這個索引和RID,終端可以確認並取得存放在終端的認證中心公鑰的模,指數和與密鑰相關的信息,以及將使用的相應算法。若是終端沒有存儲與這個索引及RID相關聯的密鑰,那麼動態數據認證失敗。
2.2. 髮卡行公鑰的獲取
2.2.1. 若是髮卡行公鑰證書的長度不一樣於在前面的章條中得到的認證中心公鑰模長度,那麼動態數據認證失敗。
2.2.2. 爲了得到在表9中指明的恢復數據,使用認證中心公鑰和相應的算法恢復髮卡行公鑰證書。若是恢復數據的
結尾不等於「BC」,那麼動態數據認證失敗。
表4 從髮卡行公鑰證書恢復數據的格式
字段名 |
長度 |
描述 |
格式 |
恢復數據頭 |
1 |
十六進制,值爲‘6A’ |
b |
證書格式 |
1 |
十六進制,值爲‘02’ |
b |
髮卡行標識 |
4 |
主帳號最左面的3-8個數字(在右邊補上十六進制數‘F’) |
cn8 |
證書失效日期 |
2 |
MMYY,在此日期後,這張證書無效 |
n4 |
證書序列號 |
3 |
由認證中心分配給這張證書的惟一的二進制數 |
b |
哈希算法標識 |
1 |
標識用於在數字簽名方案中產生哈希結果的哈希算法 |
b |
髮卡行公鑰算法標識 |
1 |
標識使用在髮卡行公鑰上的數字簽名算法 |
b |
髮卡行公鑰長度 |
1 |
標識髮卡行公鑰的模的字節長度 |
b |
髮卡行公鑰指數長度 |
1 |
標識髮卡行公鑰指數的字節長度 |
b |
髮卡行公鑰或髮卡行公鑰的最左邊字節 |
NCA-36 |
若是NI≤NCA–36,這個字段包含了在右邊補上了NCA–36–NI個值爲‘BB’的字節的整個髮卡行公鑰。 若是NI>NCA-36,這個字段包含了髮卡行公鑰最高位的NCA–36個字節 |
b |
哈希結果 |
20 |
髮卡行公鑰以及相關信息的哈希值 |
b |
恢復數據結尾 |
1 |
十六進制,值爲‘BC’ |
b |
2.2.3. 檢查恢復數據頭。若是它不是「6A」,那麼動態數據認證失敗。
2.2.4. 檢查證書格式。若是它不是「02」,那麼動態數據認證失敗。
2.2.5. 將表9中的第2個到第10個數據元(即從證書格式直到髮卡行公鑰或髮卡行公鑰的最左邊字節)從左到右連
接,再把髮卡行公鑰的餘項加在後面(若是有),最後是髮卡行公鑰指數。
2.2.6. 使用指定的哈希算法(從哈希算法標識獲得)對上一步的鏈接結果計算獲得哈希結果。
2.2.7. 把上一步計算獲得的哈希結果和恢復出的哈希結果相比較。若是它們不同,那麼動態數據認證失敗。
2.2.8. 檢驗髮卡行識別號是否匹配主帳號最左面的3-8個數字(容許髮卡行識別號可能在其後填充的「F」)。如
果不匹配,那麼動態數據認證失敗。
2.2.9. 確認證書失效日期中指定月的最後日期等於或遲於今天的日期。若是證書失效日期在今天的日期以前,那
麼證書已過時,動態數據認證失敗。
2.2.10. 檢驗鏈接起來的RID、認證中心公鑰索引、證書序列號是否有效。若是無效,那麼動態數據認證失敗。
2.2.11. 若是髮卡行公鑰算法標識沒法識別,那麼動態數據認證失敗。
2.2.12. 若是以上全部的檢驗都經過,鏈接髮卡行公鑰的最左邊字節和髮卡行公鑰的餘項(若是有)以獲得髮卡行
公鑰模,從而繼續下一步取得IC卡公鑰。
2.3. IC卡公鑰的獲取
2.3.1. 若是IC卡公鑰證書的長度不一樣於在前面的章條中得到的髮卡行公鑰模長度,那麼動態數據認證失敗。
2.3.2. 爲了得到在表12中指明的恢復數據,使用髮卡行公鑰和相應的算法應用到IC卡公鑰證書上。若是恢復數據
的結尾不等於「BC」,那麼動態數據認證失敗。
表5 從IC卡公鑰證書恢復數據的格式
字段名 |
長度 |
描述 |
格式 |
恢復數據頭 |
1 |
十六進制,值爲‘6A’ |
b |
證書格式 |
1 |
十六進制,值爲‘04’ |
b |
應用主帳號 |
10 |
主帳號(在右邊補上十六進制數‘F’) |
cn20 |
證書失效日期 |
2 |
MMYY,在此日期後,這張證書無效 |
n4 |
證書序列號 |
3 |
由髮卡行分配給這張證書的惟一的二進制數 |
b |
哈希算法標識 |
1 |
標識用於在數字簽名方案中產生哈希結果的哈希算法 |
b |
IC卡公鑰算法標識 |
1 |
標識使用在IC卡公鑰上的數字簽名算法 |
b |
IC卡公鑰長度 |
1 |
標識IC卡公鑰的模的字節長度 |
b |
IC卡公鑰指數長度 |
1 |
標識IC卡公鑰指數的字節長度 |
b |
IC卡公鑰或IC卡公鑰的最左邊字節 |
NI-42 |
若是NIC≤NI–42,這個字段包含了在右邊補上了NI–42–NIC個值爲‘BB’的字節的整個IC卡公鑰。 若是NIC>NI-42,這個字段包含了IC卡公鑰最高位的NI–42個字節 |
b |
哈希結果 |
20 |
IC卡公鑰以及相關信息的哈希值 |
b |
恢復數據結尾 |
1 |
十六進制,值爲‘BC’ |
b |
2.3.3. 檢查恢復數據頭。若是它不是「6A」,那麼動態數據認證失敗。
2.3.4. 檢查證書格式。若是它不是「04」,那麼動態數據認證失敗。
2.3.5. 將表10中的第2個到第10個數據元(即從證書格式直到IC卡公鑰或IC卡公鑰的最左邊字節)從左到右連
接, 再把IC卡公鑰的餘項(若是有)和IC卡公鑰指數加在後面,最後是JR/T 0025.5的9.3.1條指明的需認
證的靜態數據。若是靜態數據認證標籤列表存在,而且其包含非「82」的標籤,那麼動態數據認證失敗。
2.3.6. 把指定的哈希算法(從哈希算法標識獲得)應用到上一步的鏈接結果從而獲得哈希結果。
2.3.7. 把上一步計算獲得的哈希結果和恢復出的哈希結果相比較。若是它們不同,那麼動態數據認證失敗。
2.3.8. 比較恢復獲得的主帳號和從IC卡讀出的應用主帳號是否相同。若是不一樣,那麼動態數據認證失敗。
2.3.9. 檢驗證書失效日期中指定月的最後日期是否等於或遲於今天的日期。若是不是,那麼動態數據認證失敗。
2.3.10. 若是IC卡公鑰算法標識沒法識別,那麼動態數據認證失敗。
2.3.11. 若是以上全部的檢驗都經過,鏈接IC卡公鑰的最左邊字節和IC卡公鑰的餘項(若是有)以獲得髮卡行公鑰
模,繼續按下面章條的描述執行實際的動態數據認證。
2.5. 動態簽名的生成
假定終端已成功地按上面講述的過程取得了IC卡公鑰。
動態簽名的生成按如下的步驟進行:
2.5.1.終端發出內部認證(INTERNAL AUTHENTICATE)命令,命令中包含由DDOL指定的數據元
IC卡可能包含DDOL,但終端應有一個缺省的,由支付系統指定的DDOL,以防在IC卡沒有提供DDOL的狀況下使用。
DDOL必須包含由終端生成的不可預知數(標籤「9F37」,4個字節的二進制數)。
若是下面的任一狀況發生,動態數據認證失敗。
——IC卡和終端都不含有DDOL;
——IC卡上的DDOL不包含不可預知數;
——IC卡上沒有DDOL而且終端上缺省的DDOL不包含不可預知數。
2.5.2.IC卡使用IC卡私鑰和相應的算法生成數字簽名。這個結果叫作簽名的動態應用數據。
表6 需簽名的動態應用數據(即哈希算法的輸入)
字段名 |
長度 |
描述 |
格式 |
簽名的數據格式 |
1 |
十六進制,值爲‘05’ |
b |
哈希算法標識 |
1 |
標識用於產生哈希結果的哈希算法 |
b |
IC卡動態數據長度 |
1 |
標識IC卡動態數據的字節長度LDD |
b |
IC卡動態數據 |
LDD |
由IC卡生成和/或存儲在IC卡上的動態數據 |
- |
填充字節 |
NIC–LDD–25 |
(NIC-LDD–25)個值爲‘BB’的填充字節 |
b |
終端動態數據 |
變長 |
由DDOL指定的數據元鏈接而成 |
- |
IC卡動態數據的字節長度LDD知足0≤LDD≤NIC-25。IC卡動態數據的最左邊的3-9個字節應該由一個字節長的IC卡動態數字長度後面跟隨的2-8個IC卡動態數字的值(標籤「9F4C」,2-8個二進制字節)組成。IC卡動態數字是由一個由IC卡生成的,隨時間而變的參數,(例如它能夠是不可預知數或者IC卡每收到一個內部認證(INTERNAL AUTHENTICATE)命令就加一的計數器)。JR/T 0025建議使用ATC做爲IC卡動態數字。
除了表8中指明的數據,動態數據認證所需的數據對象在表12中詳細說明。
表7 生成和檢驗動態簽名所須要的其它數據對象
標籤 |
長度 |
值 |
格式 |
‘9F4B’ |
NIC |
簽名的動態應用數據 |
b |
‘9F49’ |
變長 |
DDOL |
b |
2.6. 動態簽名的驗證
1.若是簽名的動態應用數據的長度不一樣於IC卡公鑰模的長度,那麼動態數據認證失敗。
2.爲了得到在表13中指明的恢復數據,使用IC卡公鑰和相應的算法應用到簽名的動態應用數據上。若是恢復數據的結尾不等於「BC」,那麼動態數據認證失敗。
表8 從簽名的動態應用數據恢復的數據格式
字段名 |
長度 |
描述 |
格式 |
恢復數據頭 |
1 |
十六進制,值爲‘6A’ |
b |
簽名數據格式 |
1 |
十六進制,值爲‘05’ |
b |
哈希算法標識 |
1 |
標識用於在數字簽名方案中產生哈希結果的哈希算法1 |
b |
IC卡動態數據長度 |
1 |
標識IC卡動態數據的字節長度 |
b |
IC卡動態數據 |
LDD |
由IC卡生成和/或存儲在IC卡上的動態數據 |
- |
填充字節 |
NIC- LDD–25 |
(NIC-LDD–25)個值爲‘BB’的填充字節 |
b |
哈希結果 |
20 |
動態應用數據以及相關信息的哈希值 |
b |
恢復數據結尾 |
1 |
十六進制,值爲‘BC’ |
b |
3.檢查恢復數據頭。若是它不是「6A」,那麼動態數據認證失敗。
4.檢查簽名數據格式。若是它不是「05」,那麼動態數據認證失敗。
5.將表15中的第2個到第6個數據元(即從簽名數據格式直到填充字節)從左到右鏈接,再把DDOL中指定的數據元加在後面。
6.把指定的哈希算法(從哈希算法標識獲得)應用到上一步的鏈接結果從而獲得哈希結果。
7.把上一步計算獲得的哈希結果和恢復出的哈希結果相比較。若是它們不同,那麼動態數據認證失敗。
若是以上全部的步驟都成功,那麼動態數據認證成功。在表13中恢復獲得的IC卡動態數據中所包含的IC卡動態數字應被存放在標籤「9F4C」中。