这篇文章有较集中--探索解剖学你信用卡号码,并提供源代码,以确定如果某个信用卡号码可能有效.
规格信用卡号码已经制定的国际标准组织(ISO/IEC7812-1:1993)、美国国家标准学会(ANSIx4.13). 这些出色的组织垃圾使其出版物自由地获得联机,所以资料如下的格式计算信用卡号码大部分来源于一个因特网工兵工作队
主要工业标识
< 第一位数 您的信用卡号码识别的主要产业(城市),这是一类实体,您的信用卡发行. 以下是各城市签证数类:
数字城市价值 签证类别
0 ISO/TC68、其他行业转让
1 航空公司
2 航空工业和其他任务
3 旅游、娱乐
4 银行和金融
5 银行和金融
6 商品和银行
7 石油
8 电信业和其他任务
9 国家任务
例如美国运通、Diner俱乐部,是柔赴港旅游、娱乐类、签证、万事达卡,发现是在银行和金融类、石油及埃克森孙是在石油类.
发行标识
< 前6位 您的信用卡号码(包括城市初步数字)形式发行标识. 这意味着可能发行总数是100万(1910年上升到第六届电力、100万).
部分发行宣传识别资料表列如下:
发行 标识 证号码长度
Diner's Club/Carte Blanche 300xxx-305xxx, 36xxxx,38xxxx 14
美国运通 34xxxx,37xxxx 15
VISA 4xxxxx 13, 16
MasterCard 51XXXX-55XXXX 16
Discover 6011xx 16
如果数字城市是9,那么下一个三位数的代码发行的3位数国家代码定义ISO3166,剩下的最后两位数字的发行标识可以按国家标准组织的规定,国家的一切方式希望.
帐号
7位(N-1) 你有你的信用卡号码等个人帐户标识. 最大长度的19位信用卡号码. 从最初的6位数字是信用卡发行标识,最后的数字是检查数字,这意味着最长的帐号是外地19-7、12位. 因此,每个发行有万亿(1012提出的权力,或1,000,000,000,000)可能账号.
如果我们把大量的潜在客户,放高利贷的发行利率,显然有很多钱,可在信用卡业. 年龄在更加文明,人们认为是高利贷等严重违法或违反道德的罪恶本质,不接受业务(亚里斯多德政治1.10. 圣托马斯Aquinas,1340De马洛; Dante,11.94-111地狱. 等等).
检查位数
< 最后数字 您的信用卡号码核对数字,类似于核实. 使用的算法得出正确数字是检查称为Luhn算法,在IBM科学家HansPeterLuhn(1896年至1964年),他被授予美国专利2950048("计算机核查号码")
最succintLuhn算法的描述我发现骇客来自出版 (Phrack冶炼厂) ??(书的名字??):"
有一卡双数数字,每增加一倍多,扣除9位数字编号,如果产品大于9. 全部加起来的数字以及连一倍多数,其后果必然是一个多元、10不是有效证. 如果有卡位的奇数, 即使从事相同的人数增加一倍,而不是数字"
多一点的,甚至有点混乱. 主要问题是你不想双位数字的检查,这当然是轻而易举的数字,从检查,倒退,再隔位数. 见 源代码 详情如下.
实例
这些例子都来自我收到的垃圾邮件2001年8月发行的信用卡. 这个垃圾邮件中的一些画面光滑信用卡号码和样品直接来自两个画面.
4408 0412 3456 7890
一信用卡提供的照片显示的是一张卡4408041234567890多.
主要工业标识(城市)4(银行与金融),发行代码是440804(签证伙伴),帐号是123456789,数字检查是0.
让我们用4408041234567890Luhn检查. 以下表
**连续是最原始的数字.
**排在第二,我们增加了2位候补. 不以二位数字增加了检查.
**排在第三,我们将迫使所有数字小于10,再减去9必要.
**底部连续数载加在一起.
4 , 4 ,0 ,8 ,0 ,4 ,1 , 2 ,3 ,4 ,5 , 6 , 7 , 8 , 9 ,0
X=248, 4 , X=002 , 8, X=002 , 4 , X=122 ,2 , X=623 ,4 ,X=2510, 6 , X=1427 ,8, X=9218 , 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
http://www.merriampark.com/anatomycc.htm如果加上所有的最低位排在一起,我们得到67,而不是10多个,因此,我们的结论是,一些4408041234567890,是无效的信用卡号码.
改变检查数字0至3时,我们到达人数4408041234567893,并通过检查Luhn,由于这笔数字的底部将连续70个,其中10个是由设. 4408041234567893,从表面上来看,一个有效的信用卡号码.
4417 1234 5678 9112
第二信用卡提供的照片显示的是一张卡1234567891124417多.
主要工业标识(城市)4(银行与金融),发行代码是441712(签证伙伴),帐号是345678911,二是核对数字.
让我们用检查Luhn4417123456789112象以往的例子.
4 4 1 7 1 2 3 4 5 6 7 8 9 1 1 2
X=248 4 X=122 7 X=122 2 X=623 4 X=2510 6 X=1427 8 X=9218 1 X=122 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
如果加上所有的最低位排在一起,我们得到69,而不是10多个,因此,我们的结论是,一些4417123456789112,是无效的信用卡号码.
通过改变数字检查2至3时,我们到达人数4417123456789113,并通过检查Luhn,由于这笔数字的底部将连续70个,其中10个是由设. 4417123456789113,从表面上来看,一个有效的信用卡号码.
警告
这两个画面中,提供信用卡号码,Luhn检验证明是无效的. 他们改变了他们表面上有效遏制数字. 但如果我是你,我什么都不要试图与他们负责.
爪哇源码
以下是简单级爪哇免费使用,如果你愿意让你不受任何限制或保证.
//---------------------------------------------------------
// 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);
}
}
信用卡是16位的
先按1,3,5,7,9,11,13,15位的数字乘2,如果大于9就减去9,如:第1位是5,5*2=10,10-9=1,
那么就是1,然后把这些数字加起来
再看2,4,6,8,10,12,14,16偶数位的数字,直接加起来。
把奇数位之和与偶数位之和相加除于5
如果余数是0,那么恭喜您,此信用卡号正确,反之错误!