Luhn算法不适用于13位Visa卡

时间:2017-02-22 11:00:06

标签: c# algorithm luhn

我正在使用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 =&gt; 50%10 = 0)

我到底错在了什么?

0 个答案:

没有答案