發卡主機處理完授權交易請求後,接著開始產生回應訊息給刷卡機及晶片程式,類似ARQC的驗證值,發卡主機也產生ARPC讓晶片內的程式確認交易回應端的合法性以及交易內容的完整性,上一篇筆記晶片程式到驗證主機,這一篇筆記驗證主機到晶片程式。
晶片卡交易安全(2:ARPC)
ARPC是Authorisation ResPonse Cryptogram的縮寫,可以確保晶片交易結果未被竄改,通常產生ARPC的過程會將晶片卡授權結果值(ARC)加入明文的組成,ARC(Authorization Response Code)放在是EMV Tag 8A中。
常見的幾種ARC(Response code):
2007年EMV4.1版本後,ARPC多了一組Method2的產生方法,產生明文加入Card Status Update及Proprietary AuthenticationData的組成。
這邊我們一起筆記Method1+ Method12兩組演算法的運作過程及差異。
- Method 1 以 ARQC ⊕ ARC轉Ascii Hex作為運算輸入資料,以2TDEA演算法運算結果輸出為 8 bytes
- Method 2 以 ARQC || CSU || Proprietary Authentication Data 作為運算輸入資料,以MAC演算法運算輸出為4 bytes 。
Method1及Method2都需要取得Card Key ,Card Key也稱為UDK(Unique Derived Key)或ICC Master Key,為了確保每張卡片的唯一性,產生Card key的過程會將PAN(卡號)及發卡序號(通常為00)作為明文並以MDK基碼作2TDEA運算。
這邊可以參考ARQC內的步驟1,輸入MDK + PAN + PAN SEQ 執行2TDEA運算產生。
上一篇UDK的結果是9249345E0220CEBA0D20D6A2453BF407
步驟1:ARC轉Ascii code然後填補字元
填充字元:如果位數非16位數倍數時,自動在明文右方填補字元,比方說回應碼01(Ascii=3031),組合後變成"3031000000000000"字串
X= (ARC || '00' || '00' || '00' || '00' || '00' || '00' )
步驟2:ARQC ⊕ ARC轉Ascii Hex作為運算資料
Y:=ARQC ⊕ X
步驟3:步驟2異或⊕結果以2TDEA運算出ARPC
ARPC := DES3(UDK)[Y]
1.準備明文
UDK = Session key | 9249345E0220CEBA0D20D6A2453BF407 |
ARQC | 6BC76F457CC4FB24 |
ARC | 00 |
2.準備相關函式TEncryption、XOR
3.直接寫一段測試方法:
[TestMethod]
public void TestARPCMethod1()
{
//產生Card Key(或稱UDK、ICC Master Key)
string UDK = "9249345E0220CEBA0D20D6A2453BF407";
//EMV Tag 9F26 ARQC
string ARQC = "6BC76F457CC4FB24";
//EMV Tag 8A Authorization Response Code 00: Successful
string ARC = Encoding.ASCII.GetBytes("00").BToHex().PadRight(16, '0');
byte[] b = XOR(ARQC.HexToByte(), ARC.HexToByte());
byte[] Hi1 = TEncryption(UDK.HexToByte(), b);
Console.WriteLine("ARPC :{0}", Hi1.BToHex());
Console.WriteLine("ARPC :{0}(BP Tool Method1)", "177759B03C9E89E2");
Assert.AreEqual("177759B03C9E89E2", Hi1.BToHex());
}
測試結果: 與BP-Toos相符,ARPC為177759B03C9E89E2
步驟1: 組合 Y: = ARQC || CSU || Proprietary Authentication Data作為明文資料
填充字元:如果位數非16位數倍數時,自動在明文右方填補字元(padding ISO9797 Method2)
MSG:= (MSG || '80' || '00' || '00' ||...
步驟2: 將明文以MAC演算法運算。
ARPC: = MAC: = MAC algorithm (SKAC)[Y]
MAC運算結果以Session key(Right)為基碼進行Single DES解密運算,再以Session key(Left)進行為基碼再進行DES加密運算。
這邊使用到MAC是ISO/IEC 9797-1 Algorithm 3,最終運算輸出為前4 bytes
步驟3:將ARPC結果與CSU + Proprietary Authentication Data放到EMV Tag 91:Issuer Authentication Data中
Issuer Authentication Data: = ARPC || CSU ||Proprietary Authentication Data
1.準備明文
Session Key = UDK | 9249345E0220CEBA0D20D6A2453BF407 |
ARQC | 6BC76F457CC4FB24 |
CSU | 00820000 |
PAC | 1234 |
2.準備需要用的函式: MAC、Single DES Decryption、Single DES Encryption
3.寫一段測試方法
[TestMethod]
public void TestARPCMethod2()
{
//Card Key(或稱UDK、ICC Master Key) = Session key
string SL = "9249345E0220CEBA";
string SR = "0D20D6A2453BF407";
string SK = SL + SR;
//EMV Tag 9F26 ARQC
string ARQC = "6BC76F457CC4FB24";
//CSU(Card Status Update)
string CSU = "00820000";
//Proprietary Authentication Data
string PAC = "1234";
//padding ISO9797 Method2
string plainText = string.Format("{0}{1}{2}8000", ARQC, CSU, PAC);
string Hi = MAC(SL, plainText);
//Hi = XOR(Hi.HexToByte(), plainText.Right(16).HexToByte()).BToHex();
//ISO/IEC 9797-1 Algorithm 3:
//Hk+1 := ALG(KSL)[ALG-1(KSR)[Hk]]
byte[] Hi1 = Decryption(SR.HexToByte(), Hi.HexToByte());
Hi1 = Encryption(SL.HexToByte(), Hi1);
//calculateARPC
Console.WriteLine("明文 :{0},長度:{1}", plainText, plainText.Length);
Console.WriteLine("ARPC :{0}(MAC)", Hi);
Console.WriteLine("");
Console.WriteLine("ARPC :{0}(Final Enc)", Hi1.BToHex());
Console.WriteLine("ARPC :{0}(BP Tool Method2)", "BEAFE96C0E068D2E");
}
測試結果
小結:
- 使用Method 1的居多。
參考
- EMV 4.1/4.2 Book2 (8.2.1 ARPC Method 1 / 8.2.2 ARPC Method 2 )
早上帶女兒去運動,才06:00就曬太陽,明天要更早出門去。