65.9K
CodeProject 正在变化。 阅读更多。
Home

如何验证信用卡号

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.39/5 (12投票s)

2005年6月18日

4分钟阅读

viewsIcon

80535

downloadIcon

114

初学者。

引言
本文将介绍如何验证“信用卡号”。本文不保证信用卡号实际存在,但会说明它是否是有效数字。

信息
               信用卡号(大多数情况下)是 13 到 16 位的数字,通过一种特殊的数字校验(称为 Luhn 校验)进行保护。
Luhn 算法或 Luhn 公式,也称为“模 10”或“mod 10”算法,于 1960 年代开发,作为验证身份号码的方法。它是一种简单的校验和公式,用于验证各种账号,例如信用卡号和加拿大社会保险号。它的知名度很大程度上来自于信用卡公司在 1960 年代后期由 IBM 科学家汉斯·彼得·卢恩(Hans Peter Luhn,1896-1964)创建后不久就采用了它。
该算法属于公共领域,如今广泛使用。它无意成为加密安全的哈希函数;它能抵御随机错误,而不是恶意攻击。大多数信用卡和许多政府识别号码都使用该算法作为区分有效号码和随机数字集合的简单方法。


目录 


1 非正式解释

 

2 算法

 

3 示例

 

4 代码

 

非正式解释

            该公式生成一个校验位,通常附加到部分账号以生成完整的账号。该账号必须通过以下算法(并且校验位必须选择并放置,以便完整的账号能够通过)

从倒数第二个数字开始,向左移动,将所有交替数字的值加倍。对于任何因此变为 10 或更大的数字,将其数字相加。例如,1111 变为 2121,而 8763 变为 7733(来自 (1+6)7(1+2)3)。

将所有这些数字相加。例如,1111 变为 2121,然后 2+1+2+1 是 6;而 8763 变为 7733,然后 7+7+3+3 是 20。

如果总和以 0 结尾(换句话说,如果总和模 10 为 0),那么根据 Luhn 公式,该数字是有效的,否则无效。因此,1111 是无效的(如上所示,结果是 6),而 8763 是有效的(如上所示,结果是 20)。

在上面两个例子中,如果要在这些数字前面添加校验位,那么可能会在 1111 前面添加 4 变成 41111,而在 8763 前面添加 0 变成 08763。通常情况下,校验位会添加到末尾,尽管这需要对算法进行简单的修改,以根据账号的其余部分确定末尾的校验位。

算法
             该算法分三步进行。首先,从右数第二位开始,向左移动,每隔一位的数字加倍。如果结果大于九,则将其数字相加(这相当于对于 10 到 18 之间的任何数字,减去 9)。因此,2 变为 4,7 变为 5。其次,将所有数字相加。最后,将结果除以 10。如果余数为零,则原始数字有效。

以下是维基代码,一个用于多篇文章的建议伪代码。

 

函数 checkLuhn(string purportedCC) {

int sum := 0

int nDigits := length(purportedCC)

int parity := nDigits 模 2

for i 从 0 到 nDigits - 1 {

int digit := integer(purportedCC[i])

 

if i 模 2 = parity

            digit := digit × 2

if digit > 9

digit := digit - 9

sum := sum + digit

     }

return (sum 模 10) = 0

 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

示例
考虑示例识别码 456-565-654。第一步是将从倒数第二个数字开始向左移动,每隔一位的数字加倍,然后将结果中的数字相加。下表显示了此步骤(高亮行表示加倍的数字)
数字 加倍后 数字之和


 4 4 4  

 5 10 1

 6 6 6

 5 10 1

 6 6 6

 5 10 1

 6 6 6

 5 10 1

 4 4 4

总和:30

 

总和 30 除以 10;余数为 0,因此该数字有效。


代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim sum As Int32 = 0

Dim cdigit As Char

Dim i, digit As Int32

Dim nDigit As Int32

Dim parity As Int32

nDigit = TextBox1.TextLength

parity = nDigit Mod 2

For i = 0 To nDigit - 1

cdigit = TextBox1.Text.Chars(i)

digit = cdigit.GetNumericValue(cdigit)

If i Mod 2 = parity Then

digit = digit * 2

End If

If digit > 9 Then

digit = digit - 9

End If

sum = sum + digit

下一篇

If sum Mod 10 = 0 Then

MsgBox("Approved")

Else

MsgBox("Not Approved")

End If

End Sub

 

结论

   我认为这对那些正在学习并想尝试不同事物的人非常有帮助。

© . All rights reserved.