我正在使用 Visa 信用卡生成器,但没有看到以下问题:我的代码似乎适用于 16 位数的卡号,但是,它似乎不适用于 13 位数的卡,因为生成的卡在线测试人员和我的应用程序上的数字均无效。
代码:
var randomNum = new Random();
int [] lengths = new int[] { 13, 16 };
int length = lengths[randomNum.Next(lengths.Length)];
int [] str;
int [] reversed;
var lastDigit = 0;
var sum = 0;
if (length == 16)
{
str = new int[16];
reversed = new int[15];
}
else
{
str = new int[13];
reversed = new int[12];
}
Random rnd = new Random();
while (pos < length - 1)
{
str[pos++] = rnd.Next(0, 9);
}
for (int i = 0; i < str.Length - 1; i++)
{
reversed[i] = str[str.Length - i - 2];
}
for (pos = 0; pos < length - 1; pos++)
{
if (pos % 2 == 0 && length == 16)
{
reversed[pos] *= 2;
if (reversed[pos] > 9)
reversed[pos] = reversed[pos] - 9;
}
else if (pos % 2 == 1 && length == 13)
{
reversed[pos] *= 2;
if (reversed[pos] > 9)
reversed[pos] = reversed[pos] - 9;
}
sum += reversed[pos];
}
lastDigit = (10 - (sum % 10)) % 10;
str[length - 1] = lastDigit;
我为复制整个代码道歉,但我认为这会让事情更容易理解。
我从http://www.freeformatter.com/credit-card-number-generator-validator.html遵循的算法:
- 删除数字的最后一位数字。最后一位是我们要检查的
- 颠倒数字
- 将奇数位(1、3、5 等)的数字乘以 2,然后将所有大于 9 的结果减去 9
- 将所有数字加在一起
- 校验位(卡的最后一个数字)是您需要添加以获得 10 的倍数(模 10)的金额
我的代码生成的示例卡号:
- 16 位:4145422641287432 - 有效
- 13 位:4354735186403 - 无效(添加校验位之前的总和为 47,这意味着 3 将是校验位,导致总和为 50 => 50%10=0)
我在这里到底做错了什么?