American Express 美國運通卡卡號規則淺析 — 為什麼我的 AmEx 卡都是以100X結尾的?

Photo credit: www.financetwitter.com/2014/08/cracking-sixteen-digits-credit-card-numbers-what-do-they-mean.html

American Express (Amex) 美國運通卡大家都相當熟悉,經常上我們博客的人一般手裡都有1張甚至幾張Amex信用卡。由於他家經常搞各種優惠offer (點擊這裡:Amex Offer),而且在過去的多年內,副卡也可以參加offer,相信不少童鞋都為自己的Amex卡加了一張幾張甚至幾十張副卡。卡太多容易混亂,容易主副不分,這裡我們就說說Amex卡號的編號規則,這個規則的一個比較顯見的用途是區分主副卡。

另外,這個冷知識還可以幫大家解決這樣一個疑惑:為什麼我的 AmEx 卡都是以100X結尾的?

本文只針對Amex銀行自己發行的Amex卡,對於別的銀行和Amex協議發行的Amex卡,比如CitiBank的Macys Amex卡,AA Amex卡,Dividend Amex卡,不在本文範圍之內。而且這些卡一般主副卡卡號都一樣,所以其實也不需要區分主副卡。

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 算法的具體步驟是這樣的:

  1. 把信用卡號除了最後一位的列出來,比如 (X是最後一位數字)3798 788715 7100X
  2. 奇數位數字不變,偶數位數字乘以2。
  3. 如果乘以2以後的數字大於等於10,兩位相加。
  4. 所有奇數位(原樣不變)和偶數位(上面步驟2)和3)處理過的)相加。
  5. 看這個總和的最後一位(個位),如果是0,那麼卡號的最後一位就是0,如果不是0,卡號的最後一位就是10減去這個個位數。

這個表格列出了這個算法給出的上面這個信用卡號的最後一位數,應該而且只能是8。

1)原卡號37987887157100X
2)乘以2141616141020
3)兩位相加5775120
4)總和3597778511720062
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()就可以算出最後一位。


若喜歡本文,別忘了給個五星好評哦!

[Total: 24   Average: 4.3/5]
Disclaimer: The responses below are not provided or commissioned by the bank advertiser. Responses have not been reviewed, approved, or otherwise endorsed by the bank advertiser. It is not the bank advertiser's responsibility to ensure all posts and/or questions are answered.