基於Luhn算法的銀行卡校驗規則
案例:
當你輸入信用卡號碼的時候,有沒有擔心輸錯瞭而造成損失呢?其實可以不必這麼擔心,因為並不是一個隨便的信用卡號碼都是合法的,它必須通過Luhn算法來驗證通過。
該校驗的過程:
1、從卡號最後一位數字開始,逆向將奇數位(1、3、5等等)相加。
2、從卡號最後一位數字開始,逆向將偶數位數字,先乘以2(如果乘積為兩位數,則將其減去9),再求和。
3、將奇數位總和加上偶數位總和,結果應該可以被10整除。
例如,卡號是:5432123456788881
則奇數、偶數位(用紅色標出)分佈:5432123456788881
奇數位和=35
偶數位乘以2(有些要減去9)的結果:16 2 6 1 5 7 7,求和=35。
最後35+35=70可以被10整除,認定校驗通過。
import java.util.Scanner; //信用卡號校驗算法 public class Luhn { public static void main(String[] args) { System.out.println("Please input your credit card number:"); Scanner input = new Scanner(System.in); int sumOdd = 0; int sumEven = 0; String number = input.next(); int length = number.length(); int[] wei = new int[length]; for (int i = 0; i < number.length(); i++) { wei[i] = Integer.parseInt(number.substring(length - i - 1, length - i));// 從最末一位開始提取,每一位上的數值 System.out.println("第" + i + "位數字是:" + wei[i]); } for (int i = 0; i < length / 2; i++) { sumOdd += wei[2 * i]; if ((wei[2 * i + 1] * 2) > 9) wei[2 * i + 1] = wei[2 * i + 1] * 2 - 9; else wei[2 * i + 1] *= 2; sumEven += wei[2 * i + 1]; } System.out.println("奇數位的和是:" + sumOdd); System.out.println("偶數位的和是:" + sumEven); if ((sumOdd + sumEven) % 10 == 0) System.out.println("Recept."); else System.out.println("Can not recept."); } }
運行結果:
Please input your credit card number:
5432123456788881
第0位數字是:1
第1位數字是:8
第2位數字是:8
第3位數字是:8
第4位數字是:8
第5位數字是:7
第6位數字是:6
第7位數字是:5
第8位數字是:4
第9位數字是:3
第10位數字是:2
第11位數字是:1
第12位數字是:2
第13位數字是:3
第14位數字是:4
第15位數字是:5
奇數位的和是:35
偶數位的和是:35
Recept.
銀行卡校驗規則(Luhn算法)
Luhn檢驗數字算法(Luhn Check Digit Algorithm),也叫做模數10公式,是一種簡單的算法,用於驗證銀行卡、信用卡號碼的有效性的算法。對所有大型信用卡公司發行的信用卡都起作用,這些公司包括美國Express、護照、萬事達卡、Discover和用餐者俱樂部等。這種算法最初是在20世紀60年代由一組數學傢制定,現在Luhn檢驗數字算法屬於大眾,任何人都可以使用它。
算法:將每個奇數加倍和使它變為單個的數字,如果必要的話通過減去9和在每個偶數上加上這些值。如果此卡要有效,那麼,結果必須是10的倍數。
比如上圖的卡號為3759 8765 4321 001 (15位),從最高位開始所有的奇數位相加,偶數為乘以2相加(偶數乘以2後如果大於10則兩位數相加),把這些奇數和偶數都加在一起得到57.
(57+3)%10 ==0 如果此卡滿足被10整除,則有效位必定為3。
針對目前提現成功(clear_success)的記錄裡面,統計卡號的位數和數量關系如下:
卡號位數數量
<13 3038+
14 538
15 476
16 10884
17 68
18 4395
19 38070
>20 504+
說明:
位數少於14的卡號基本是外資銀行,或小銀行。
位數少於14的卡號基本是外資銀行,或小銀行。
***496748*** ** HSBC HSBCHKHHHKH
***430259*** ** HSBC HSBCHKHHHKH
***51878018*** ** Bank of East Asia Limited BEASHKHHXXX
位數多於23的卡號大多是卡號包含字母或空格。
62270014 **** 0045 *** CHINA CONSTRUCTION BANK **
601382700 **** 9077 ** BANK OF CHINA FOSHAN BRANCH **
如果是國內的主流銀行(中、農、工、建、招、交等)基本都是基於16位或者19位的卡號。
來看看提現成功(clear_success)裡面的卡有多少滿足Luhn規則
針對16位美元個人用戶 準確率:99.84%
正確的卡號數量:3105 不正確的卡號數量 :14
卡號45806509689007** is NOT valid
卡號48620375555016** is NOT valid
卡號54202100231152** is NOT valid
卡號58890201075786** is NOT valid
卡號62106200000456** is NOT valid
卡號62129986037235** is NOT valid
卡號62252017026526** is NOT valid
針對19位美元個人用戶 準確率:99.96%
正確的卡號數量:10574 不正確的卡號數量 :13 其中3筆發生退票
卡號60138214000567721** is NOT valid
卡號60138217000662109** is NOT valid
卡號60138220005824282** is NOT valid
卡號60138220006014219** is NOT valid
卡號60220001386050410** is NOT valid
卡號62161132000004484** is NOT valid
卡號62220212082154900** is NOT valid
卡號62220836020035821** is NOT valid
卡號63214140980000000** is NOT valid
以上都是提現成功的卡號,可以看到基本都嚴格滿足Luhn算法。
卡號位數數量
15 1
16 149
17 4
18 64
19 502
20 3
正確的卡號數量:622
不正確的卡號數量:29 + 1 +4+64+3
14%卡填寫違法瞭Luhn算法,也就是這部分卡號都是可以提前通過Luhn校驗發現的。
結論是我們可以在填寫收款賬戶的時候,添加一種Luth算法的JS腳本檢查用戶填寫的卡號存在問題。當然即時用戶填寫的卡號違法瞭該規則,我們仍然運行用戶填寫,但給出相應的警示內容(可能填錯)。
目前在收銀臺頁面(Checkout.vm)針對信用卡的交易,校驗的JS :isValidCardfunction函數就包含瞭Luth校驗規則,必須嚴格按照該規則的卡才能提交表單。
以上就是基於Luhn算法的銀行卡校驗規則的詳細內容,更多關於Luhn銀行卡校驗的資料請關註WalkonNet其它相關文章!