作者 Michael Gilleland, Merriam Park Software
翻译: 王建平
介绍
这不是一篇关于信用卡本身的文章
信用卡的编号方式规范已经由International
本文的数字编号是从左到右的,"
主行业标识符
信用卡的前6个数字组成发行者标
下面列出了一些知名发行者的标识
发行者 标识符 卡号长度
Diner's Club/Carte Blanche 300xxx-305xxx,
36xxxx, 38xxxx 14
American Express 34xxxx, 37xxxx 15
VISA 4xxxxx 13, 16
MasterCard 51xxxx-55xxxx 16
Discover 6011xx 16
ISO 3166规定发行者标识符中,如
帐号Account
信用卡的第7到(n - 1)数字为你个人的帐号标识符。
在有大量用户,发行者采取高利率的
校验位CVV
你信用卡号的最后一位数字为校验
美国信息科学与技术界网站上的生
Susan K. Soy编写的Notes,"H.
感谢Aleksandar Janicijevic给我提供
我从黑客杂志phrack 47-8上找到了关于Luhn算
奇偶这一点有点乱。关键在于我们
例子
这个例子是取自我2001年八月
4408 0412 3456 7890
第一个信用卡提供者展示的卡图片
MII是4 (银行和金融业),发行者标识符
我们用Luhn算法检查一下44
第一行为原号码
第二行,交替将数字乘以2。注意
第三行将所有的结果限制到10以
最后一行是将要加起来的所有结果
4 4 0 8 0 4 1 2 3 4 5 6 7 8 9 0
4x2=8 4 0x2=0 8 0x2=0 4 1x2=2 2 3x2=6 4 5x2=10 6 7x2=14 8 9x2=18 0
8 4 0 8 0 4 2 2 6 4 10-9=1 6 14-9=5 8 18-9=9 0
8 4 0 8 0 4 2 2 6 4 1 6 5 8 9 0
将最后一行的数字加起来得到的结
如果将校验位由0变成3则号码变
4417 1234 5678 9112
第二个信用卡提供者展示的卡图片
MII是4 (银行和金融业),发行者标识符
我们来应用一下Luhn算法检验
4 4 1 7 1 2 3 4 5 6 7 8 9 1 1 2
4x2=8 4 1x2=2 7 1x2=2 2 3x2=6 4 5x2=10 6 7x2=14 8 9x2=18 1 1x2=2 2
8 4 2 7 2 2 6 4 10-9=1 6 14-9=5 8 18-9=9 1 2 2
8 4 2 7 2 2 6 4 1 6 5 8 9 1 2 2
将最后一行的数字相加得到的结果
如果将校验为由2变成3,卡号变
警告
这两个包含信用卡卡号图片的推销
Java源码
下面的java类可以随意使用,
- //---------------------------------------------------------
- // Checks for valid credit card number using Luhn algorithm
- //---------------------------------------------------------
- public abstract class LuhnCheck {
- //--------------------------------
- // Filter out non-digit characters
- //--------------------------------
- private static String getDigitsOnly (String s) {
- StringBuffer digitsOnly = new StringBuffer ();
- char c;
- for (int i = 0; i < s.length (); i++) {
- c = s.charAt (i);
- if (Character.isDigit (c)) {
- digitsOnly.append (c);
- }
- }
- return digitsOnly.toString ();
- }
- //-------------------
- // Perform Luhn check
- //-------------------
- public static boolean isValid (String cardNumber) {
- String digitsOnly = getDigitsOnly (cardNumber);
- int sum = 0;
- int digit = 0;
- int addend = 0;
- boolean timesTwo = false;
- for (int i = digitsOnly.length () - 1; i >= 0; i--) {
- digit = Integer.parseInt (digitsOnly.substring (i, i + 1));
- if (timesTwo) {
- addend = digit * 2;
- if (addend > 9) {
- addend -= 9;
- }
- }
- else {
- addend = digit;
- }
- sum += addend;
- timesTwo = !timesTwo;
- }
- int modulus = sum % 10;
- return modulus == 0;
- }
- //-----
- // Test
- //-----
- public static void main (String[] args) {
- String cardNumber = "4408 0412 3456 7890";
- boolean valid = LuhnCheck.isValid (cardNumber);
- System.out.println (cardNumber + ": " + valid);
- cardNumber = "4408 0412 3456 7893";
- valid = LuhnCheck.isValid (cardNumber);
- System.out.println (cardNumber + ": " + valid);
- cardNumber = "4417 1234 5678 9112";
- valid = LuhnCheck.isValid (cardNumber);
- System.out.println (cardNumber + ": " + valid);
- cardNumber = "4417 1234 5678 9113";
- valid = LuhnCheck.isValid (cardNumber);
- System.out.println (cardNumber + ": " + valid);
- }
- }