[.NET][C#]Parse ISO8583筆記(五)Natural PIN產生

在Parse ISO8583(三)中,我們曾Parse DE(52)的Element 的PIN Block欄位,為了更了解PIN背後的運作原理及歷史,我們走一遍wiki再用程式語言C# 跑一遍Natural  PIN的產生。 

 

如果只打算驗證Natural PIN的產生,可以到eftlab網站下載工具,幾乎所有支付卡片的驗證機制都支援,最新的HCE都有。 

 

 

今天的主角,PIN本人,是不是有種似曾相識。

 

PIN是Personal Identification Number的縮寫而來,中文為個人識別碼,金融業卡片交易應用在ATM或POS外接PIN Pad輸入的個人密碼。 

第一次使用PIN的歷史要追溯到1967年,位在英國倫敦的巴克萊銀行,當時他們使用PIN來驗證支票的有效性;到了1972年,遍佈英格蘭及威爾斯的Lloyds 駿懋銀行發行了第一張要驗證PIN的磁條卡片。 

2006年英女王伊麗莎白二世80歲的生日宴會上,PIN和ATM的發明人James Googfellow獲頒了象徵大英帝國榮耀的OBE勳章。 

  • OBE 官佐勳章: 2003 Beckham (足球)、2010 Ross brawn(F1)、2011 Adrian Newey(F1)。 
  • MBE 員佐勳章: 2009 Hamilton(F1)、2010 Button(F1)。 

 

產生Natural PIN 

從Wiki發現主要有三種PIN的驗證方式,今天先理解第一種: IBM3624 

  • IBM 3624:通常只使用在產生Natural PIN,非常不適合使用在PIN驗證。
  • IBM 3624 + PIN-Offset (PIN Change時)
  • Visa PVV

 

簡單的解釋IBM 3624,以PAN去做2TDEA運算得出來的前幾位值再除以10之後的前幾位餘數,我們來試試看是否這麼簡單!!

 

1.準備2TDEA呼叫方法: 

輸入兩把PVK(基碼)及卡號(PAN)明文 

public static byte[] Encryption(byte[] Deskey, byte[] plainText) 
{ 
    SymmetricAlgorithm desAlg = new DESCryptoServiceProvider(); 
    //設定基碼 
    desAlg.Key = Deskey; 
    //加密工作模式:CBC 
    desAlg.Mode = CipherMode.CBC; 
    //補充字元方式:0 
    desAlg.Padding = PaddingMode.Zeros; 
    //初始向量IV = 0 
    desAlg.IV = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 
    ICryptoTransform ict = desAlg.CreateEncryptor(desAlg.Key, desAlg.IV); 
    MemoryStream mStream = new MemoryStream(); 
    CryptoStream cStream = new CryptoStream(mStream, ict, CryptoStreamMode.Write); 
    cStream.Write(plainText, 0, plainText.Length); 
    cStream.FlushFinalBlock(); 
    cStream.Close(); 
    return mStream.ToArray(); 
} 

2.準備2進位資料轉換16進位字串程式碼 

public static string BToHex(this byte[] Bdata) 
{ 
       return BitConverter.ToString(Bdata).Replace("-", ""); 
} 

3.準備測試程式和輸入資料

 PVKA,B0123456789ABCDEFFEDCBA9876543210 

 PAN = 1234567890123456 

[TestMethod]
public void TestNatural()
{
    //IBM 3624
    string Deskey = "0123456789ABCDEFFEDCBA9876543210";
    string plainText = "1234567890123456";

    //取得加密演算結果
    byte[] b = Encryption(Deskey.HexToByte(), plainText.HexToByte());

    //依序取出除以10之後的餘數
    for (int i = 0; i < b.BToHex().Length; i++)
    {
        int p = Convert.ToInt32(b.BToHex().Substring(i, 1),16);
        Console.WriteLine("PIN Value: {0} and % 10 = {1}", p, p % 10);
    }
}

 

測試結果的前4個數字為0925

*依據ISO9564-1,PIN的長度可以從4位到12位,這邊先與常見的4位數字密碼。

4.eftlab工具驗證。

在PIN offset驗證功能中,選PIN功能Tabl,依序輸入相同的PVK、PAN,然後按下鎖頭的按鈕。

得出演算結果也是0925

小結:

  •  磁條卡片容易有被側錄的風險,儲存在磁條裡的通常不會是PIN,而是下下次介紹的PVV。
  •  由於3DES(2TDEA安全性還更低一些)演算法已經被破解,PIN的風險很高,因此銀行發出初始密碼的作法通常會增加一些隨機的亂數。
  •  不過,收到銀行寄出的密碼函(Pin mailler),還是快去換密碼最安全,下次我們來介紹更換密碼後的驗證(Wiki中第二種PIN驗證方式)。

 

 

參考: 
 
Personal identification number 
 
IBM 3624 PIN Generation Algorithm   

TripleDESCryptoServiceProvider 類別

CNS國家標準

 
 
有一份$2500美金的工作,只要用C寫出下一篇Pin-Offset演算法。 
 
https://www.freelancer.com/projects/Generate-IBM-PIN-Offset-base/