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.