31 lines
1.0 KiB
Awk
31 lines
1.0 KiB
Awk
# Valid banking card number generator script
|
|||
|
|
#
|
||
|
|
# Usage: awk -f cardgen.awk [BIN]
|
||
|
|
# you can pass any amount of digits, if less than 16 then the rest
|
||
|
|
# is randomized and the checksum is calculated accordingly
|
||
|
|
# if more, then it's truncated to 15 and the checksum is calculated
|
||
|
|
# if no BIN is passed, a fully random valid card number is generated
|
||
|
|
#
|
||
|
|
# Created by Luxferre in 2024, released into public domain
|
||
|
|
|
||
|
|
# Luhn checksum (picoLuhn variation for 15 digits)
|
||
|
|
function luhn(ccstr, acc, i, l, d) {
|
||
|
|
acc = 0
|
||
|
|
l = length(ccstr) # must be odd in this variation
|
||
|
|
for(i=0;i<l;i++) {
|
||
|
|
d = int(substr(ccstr, i+1, 1)) # get current digit
|
||
|
|
acc = (acc + int(d * ((i%2) == 0 ? 2.2 : 1))) % 10 # accumulate
|
||
|
|
}
|
||
|
|
return (10 - acc) % 10 # finalize the check digit
|
||
|
|
}
|
||
|
|
|
||
|
|
BEGIN {
|
||
|
|
srand() # init PRNG
|
||
|
|
cc = ARGV[1]
|
||
|
|
gsub(/[^0-9]/, "", cc) # remove all non-digits
|
||
|
|
for(i=0;i<15;i++) # append 15 random digits
|
||
|
|
cc = cc int(rand()*10)
|
||
|
|
cc = substr(cc, 1, 15) # truncate to first 15 digits
|
||
|
|
print(cc luhn(cc)) # output complete number with checksum
|
||
|
|
}
|