[.NET][C#]Parse ISO8583筆記(九)晶片卡交易AC(ARPC)運算

發卡主機處理完授權交易請求後,接著開始產生回應訊息給刷卡機及晶片程式,類似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 UpdateProprietary AuthenticationData的組成。
這邊我們一起筆記Method1+ Method12兩組演算法的運作過程及差異。

 

  • Method 1 以 ARQC ⊕ ARC轉Ascii Hex作為運算輸入資料,以2TDEA演算法運算結果輸出為 8 bytes
  • Method 2 以 ARQC || CSU || Proprietary Authentication Data 作為運算輸入資料,以MAC演算法運算輸出為4 bytes 。

 

取得Card Key(UDK)

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

 

ARPC Method 1

 

步驟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

這邊可以參考ARQC內的步驟

 

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

 

ARPC Method 2

步驟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

這邊可以參考ARQC內的步驟

 

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就曬太陽,明天要更早出門去。