在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)。
從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,B = 0123456789ABCDEFFEDCBA9876543210
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 類別
有一份$2500美金的工作,只要用C寫出下一篇Pin-Offset演算法。
https://www.freelancer.com/projects/Generate-IBM-PIN-Offset-base/