forked from grahamking/darkcoding-credit-card
-
Notifications
You must be signed in to change notification settings - Fork 0
/
RandomCreditCardNumberGenerator.java
190 lines (151 loc) · 5.42 KB
/
RandomCreditCardNumberGenerator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
import java.util.List;
import java.util.Stack;
import java.util.Vector;
/**
* See the license below. Obviously, this is not a Javascript credit card number
* generator. However, The following class is a port of a Javascript credit card
* number generator.
*
* @author robweber
*
*/
public class RandomCreditCardNumberGenerator {
/*
* Javascript credit card number generator Copyright (C) 2006-2012 Graham King
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* www.darkcoding.net
*/
public static final String[] VISA_PREFIX_LIST = new String[] { "4539",
"4556", "4916", "4532", "4929", "40240071", "4485", "4716", "4" };
public static final String[] MASTERCARD_PREFIX_LIST = new String[] { "51",
"52", "53", "54", "55" };
public static final String[] AMEX_PREFIX_LIST = new String[] { "34", "37" };
public static final String[] DISCOVER_PREFIX_LIST = new String[] { "6011" };
public static final String[] DINERS_PREFIX_LIST = new String[] { "300",
"301", "302", "303", "36", "38" };
public static final String[] ENROUTE_PREFIX_LIST = new String[] { "2014",
"2149" };
public static final String[] JCB_PREFIX_LIST = new String[] { "35" };
public static final String[] VOYAGER_PREFIX_LIST = new String[] { "8699" };
static String strrev(String str) {
if (str == null)
return "";
String revstr = "";
for (int i = str.length() - 1; i >= 0; i--) {
revstr += str.charAt(i);
}
return revstr;
}
/*
* 'prefix' is the start of the CC number as a string, any number of digits.
* 'length' is the length of the CC number to generate. Typically 13 or 16
*/
static String completed_number(String prefix, int length) {
String ccnumber = prefix;
// generate digits
while (ccnumber.length() < (length - 1)) {
ccnumber += new Double(Math.floor(Math.random() * 10)).intValue();
}
// reverse number and convert to int
String reversedCCnumberString = strrev(ccnumber);
List<Integer> reversedCCnumberList = new Vector<Integer>();
for (int i = 0; i < reversedCCnumberString.length(); i++) {
reversedCCnumberList.add(new Integer(String
.valueOf(reversedCCnumberString.charAt(i))));
}
// calculate sum
int sum = 0;
int pos = 0;
Integer[] reversedCCnumber = reversedCCnumberList
.toArray(new Integer[reversedCCnumberList.size()]);
while (pos < length - 1) {
int odd = reversedCCnumber[pos] * 2;
if (odd > 9) {
odd -= 9;
}
sum += odd;
if (pos != (length - 2)) {
sum += reversedCCnumber[pos + 1];
}
pos += 2;
}
// calculate check digit
int checkdigit = new Double(
((Math.floor(sum / 10) + 1) * 10 - sum) % 10).intValue();
ccnumber += checkdigit;
return ccnumber;
}
public static String[] credit_card_number(String[] prefixList, int length,
int howMany) {
Stack<String> result = new Stack<String>();
for (int i = 0; i < howMany; i++) {
int randomArrayIndex = (int) Math.floor(Math.random()
* prefixList.length);
String ccnumber = prefixList[randomArrayIndex];
result.push(completed_number(ccnumber, length));
}
return result.toArray(new String[result.size()]);
}
public static String[] generateMasterCardNumbers(int howMany) {
return credit_card_number(MASTERCARD_PREFIX_LIST, 16, howMany);
}
public static String generateMasterCardNumber() {
return credit_card_number(MASTERCARD_PREFIX_LIST, 16, 1)[0];
}
public static boolean isValidCreditCardNumber(String creditCardNumber) {
boolean isValid = false;
try {
String reversedNumber = new StringBuffer(creditCardNumber)
.reverse().toString();
int mod10Count = 0;
for (int i = 0; i < reversedNumber.length(); i++) {
int augend = Integer.parseInt(String.valueOf(reversedNumber
.charAt(i)));
if (((i + 1) % 2) == 0) {
String productString = String.valueOf(augend * 2);
augend = 0;
for (int j = 0; j < productString.length(); j++) {
augend += Integer.parseInt(String.valueOf(productString
.charAt(j)));
}
}
mod10Count += augend;
}
if ((mod10Count % 10) == 0) {
isValid = true;
}
} catch (NumberFormatException e) {
}
return isValid;
}
public static void main(String[] args) {
int howMany = 0;
try {
howMany = Integer.parseInt(args[0]);
} catch (Exception e) {
System.err
.println("Usage error. You need to supply a numeric argument (ex: 500000)");
}
String[] creditcardnumbers = generateMasterCardNumbers(howMany);
for (int i = 0; i < creditcardnumbers.length; i++) {
System.out.println(creditcardnumbers[i]
+ ":"
+ (isValidCreditCardNumber(creditcardnumbers[i]) ? "valid"
: "invalid"));
}
}
}