American Express (Amex) 美國運通卡大家都相當熟悉,經常上我們博客的人一般手裡都有1張甚至幾張Amex信用卡。由於他家經常搞各種優惠offer (點擊這裡:Amex Offer),而且在過去的多年內,副卡也可以參加offer,相信不少童鞋都為自己的Amex卡加了一張幾張甚至幾十張副卡。卡太多容易混亂,容易主副不分,這裡我們就說說Amex卡號的編號規則,這個規則的一個比較顯見的用途是區分主副卡。
另外,這個冷知識還可以幫大家解決這樣一個疑惑:為什麼我的 AmEx 卡都是以100X結尾的?
本文只針對Amex銀行自己發行的Amex卡,對於別的銀行和Amex協議發行的Amex卡,比如CitiBank的Macys Amex卡,AA Amex卡,Dividend Amex卡,不在本文範圍之內。而且這些卡一般主副卡卡號都一樣,所以其實也不需要區分主副卡。
Contents
Amex卡號規則
Amex卡號總共15位,比Visa,MasterCard,Discover Card少一位。Amex卡號一定是37開頭,後面的13位分6組,有不同的用途和意義。這裡,我們用ABCDEF代表這6組。一個Amex卡號就可以寫成這樣:
37AA-BBCCCC-CDEEF
- A: 2位,代表國家或者貨幣,在歐洲這一規律比較整齊,比如43代表英國,49代表法國,50代表德國,當然也有例外,比如同一國家不同貨幣卡這兩位也可能不同;但是在美國,這兩位有很多不同數字,也許因為在美國Amex發卡量比較大,所以需要更多的數組吧。
- B: 2位,代表卡的類型。比如白金卡一般就是90-99,之類的。當然現在Amex也不太遵守這個規律了。
- C: 5位,是這張卡對應的真正信用卡賬號。
- D: 1位,卡編號,新發行的卡這位都是1,如果卡掛失或者別的一些原因需要換號,就加1(下一個是2),以此類推。
- E: 2位,00代表主卡,01-99是副卡。這兩位可以看出兩件事:
- 如果卡的最後3位是00X,就是主卡,如果最後3位的前兩個數字不是00,就是副卡;
- 大家經常聽Amex客服或者別的什麼人說最多加99張副卡,原因就在這裡了,Amex預留的副卡序列號只有99個,只能裝下99張副卡。99就是最大副卡數目的理論值。當然,誰敢加這麼多副卡,Amex FR (financial review)估計跑不了。
- F: 1位,使用 LUHN-10 演算法驗證這個信用卡號是否有效。
這位數字實際上是體現一點點計算演算法的。LUHN-10演算法實際上在維基百科上有說明:這裡。
這個LUHN-10 演算法的具體步驟是這樣的:
- 把信用卡號除了最後一位的列出來,比如 (X是最後一位數字)3798 788715 7100X
- 奇數位數字不變,偶數位數字乘以2。
- 如果乘以2以後的數字大於等於10,兩位相加。
- 所有奇數位(原樣不變)和偶數位(上面步驟2)和3)處理過的)相加。
- 看這個總和的最後一位(個位),如果是0,那麼卡號的最後一位就是0,如果不是0,卡號的最後一位就是10減去這個個位數。
這個表格列出了這個演算法給出的上面這個信用卡號的最後一位數,應該而且只能是8。
1)原卡號 | 3 | 7 | 9 | 8 | 7 | 8 | 8 | 7 | 1 | 5 | 7 | 1 | 0 | 0 | X |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2)乘以2 | 14 | 16 | 16 | 14 | 10 | 2 | 0 | ||||||||
3)兩位相加 | 5 | 7 | 7 | 5 | 1 | 2 | 0 | ||||||||
4)總和 | 3 | 5 | 9 | 7 | 7 | 7 | 8 | 5 | 1 | 1 | 7 | 2 | 0 | 0 | 62 |
5)最後一位 | X=8 |
為了方便大家,筆者用統計語言R(這個是開源免費軟體,而且安裝快捷方便)寫了一段小代碼。大家可以把自己的Amex卡號輸入,最後一位是可以用這段小代碼算出來的。筆者試了不少,都對。當然,筆者寫程序水平一般,這個程序可能不夠優化,不過作為娛樂應該夠了。
這也看出,只要前面14位固定,Amex卡號的最後一位是唯一確定的,這也解釋了為什麼E的2位主副卡序列固定,對應的卡號只有一個(所以,只能有99張副卡)。
總結
最後,提醒大家一下:上面的規則看出,Amex卡號最後4位完全是廢的,如果前面的11位被人知道了(其實前2位37也是廢的),最後4位就基本是唯一確定的;如果前面4位和中間6位被人知道,最後5位其實只有10種可能(倒數第五位從0-9,最後4位基本就是唯一確定的)。卡被盜的幾率巨大!
附錄:計算Amex卡最後一位的R程序
統計軟體R下載安裝地址:https://cran.r-project.org/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | LastDigit = function(x=37987887157100){ y_vec = rep(0,14) for(i in 1:14) y_vec[i] = floor(x/10^(14-i)) - floor(x/10^(15-i))*10 Total = 0 for(i in 1:7){ Total = Total + y_vec[2*i-1] Total_Even = 2 * y_vec[2*i] if(Total_Even > 9) Total = Total + Total_Even - 9 else Total = Total + Total_Even } Total_LastDigit = Total - floor(Total/10)*10 if(Total_LastDigit < 10) LastDigit = 10 - Total_LastDigit if(Total_LastDigit == 10) LastDigit = 0 return(LastDigit) } LastDigit(37987887157100) |
註:在運行過前面的宏函數之後,只需要修改和運行最後一行LastDigit()就可以算出最後一位。