实现的15位和18位身份证格式验证算法

时间:2005/9/9 12:26:53      阅读:10543     附件: 15位和18位身份证格式验证算.rar (经验值:5)     下载:14
首先看一下《公民身份号码》中做了明确的规定:

     18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
一、范围
     该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
     公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码
    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码
    表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码
     表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)计算模
Y = mod(S, 11)

(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014

再看一下身份证的含义:

    '15位身份证号码含义:
    '----------------------------------------
    '113343    450321        432(身份证号:只作假设,可能此号并不存在,请勿对号入座)
    '前6位     中间6位       后三位
    '地区代码  生日:年月日  奇为男,偶为女
    '----------------------------------------
    '其中:
    '各省市地区国家代码前两位代码是:
    '----------------------------------
    '北京 11 吉林 22  福建 35 广东 44 云南 53 天津 12 黑龙江 23  江西 36 广西 45  西藏 54 河北 13  上海 31 
    '山东 37  海南 46  陕西 61  山西 14  江苏 32  河南 41  重庆 50  甘肃 62 内蒙古 15  浙江 33  湖北 42 
    '四川 51  青海 63   辽宁 21  安徽 34  湖南 43  贵州 52  宁夏 64  新疆 65  台湾 71  香港 81  澳门 82  国外 91

    '18位身份证号:
    '---------------------------------------------------
    '113343    1945  03    21    432             9(身份证号:只作假设,可能此号并不存在,请勿对号入座)
    '前6位     四位  两位  两位  三位            一位
    '地区代码  年份  月份  生日  奇为男,偶为女  检验位
    '---------------------------------------------------
    '其他不详。

下面开始进行验证页面和代码的编写(因时间问题就不想进行地区判断等代码了,大家有兴趣可以修改代码进行功能更强的验证功能)

VerifyIDCard.aspx的代码:

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="test.default_1"%>

<%@ Register TagPrefix="lion" Namespace="Lion.Web.WebHtmlEditor" Assembly="Lion.Web.WebHtmlEditor" %>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="VerifyIDcard.aspx.vb" Inherits="test.VerifyIDcard"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>身份证验证</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="Visual Basic .NET 7.1" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:label id="Label1" runat="server">身份证验证:</asp:label>
<asp:textbox id="txtID" runat="server" Width="192px"></asp:textbox>
<asp:button id="CmdVerify" runat="server" Text="验证"></asp:button>
<asp:label id="LblErr" runat="server" ForeColor="Red"></asp:label>
</form>
</body>
</HTML>


VerifyIDCard.aspx.vb的代码:

 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
End Sub


Private Sub CmdVerify_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdVerify.Click
Select Case IDCheck(txtID.Text)
Case 0
LblErr.ForeColor
= System.Drawing.Color.Green
LblErr.Text
= "验证通过!"
Case 1
LblErr.ForeColor
= System.Drawing.Color.Red
LblErr.Text
= "身份证号必须是15位数或18位数!"
Case 2
LblErr.ForeColor
= System.Drawing.Color.Red
LblErr.Text
= "身份证除最后一位外,必须为数字!"
Case 3
LblErr.ForeColor
= System.Drawing.Color.Red
LblErr.Text
= "身份证输入错误(日期输入错误)!"
Case 4
LblErr.ForeColor
= System.Drawing.Color.Red
LblErr.Text
= "身份证号码输入错误(身份证包含有非法字符)!"
End Select
End Sub



'15位和18位身份证验证
'返回参数(
'0:验证通过!
'1:身份证号必须是15位数或18位数!
'2:身份证除最后一位外,必须为数字!
'3:身份证输入错误(日期输入错误)!
'4:身份证号码输入错误(身份证包含有非法字符)!
'
'
作者:踢西
'
日期:2005-09-09
Function IDCheck(ByVal e) As Integer
Dim arrVerifyCode
Dim Wi
Dim Checker
Dim BirthDay
IDCheck
= 0 '验证通过时返回
arrVerifyCode = Split("1,0,x,9,8,7,6,5,4,3,2", ",")
Wi
= Split("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2", ",")
Checker
= Split("1,9,8,7,6,5,4,3,2,1,1", ",")
If Len(e) < 15 Or Len(e) = 16 Or Len(e) = 17 Or Len(e) > 18 Then
'IDCheck= "身份证号必须是15位数或18位数!"
IDCheck = 1
Exit Function
End If
Dim Ai As String
If Len(e) = 18 Then
Ai
= Mid(e, 1, 17)
ElseIf Len(e) = 15 Then
Ai
= CStr(e)
Ai
= Left(Ai, 6) & "19" & Mid(Ai, 7, 9)
End If
If Not IsNumeric(Ai) Then
'IDCheck= "身份证除最后一位外,必须为数字!"
IDCheck = 2
Exit Function
End If
Dim strYear As Integer
Dim strMonth As Integer
Dim strDay As Integer
strYear
= CInt(Mid(Ai, 7, 4))
strMonth
= CInt(Mid(Ai, 11, 2))
strDay
= CInt(Mid(Ai, 13, 2))
BirthDay
= Trim(strYear) + "-" + Trim(strMonth) + "-" + Trim(strDay)
If IsDate(BirthDay) Then
If DateDiff("yyyy", Now(), CDate(BirthDay)) < -140 Or CDate(BirthDay) > Today() Then
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck = 3
Exit Function
End If
If strMonth > 12 Or strDay > 31 Then
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck = 3
Exit Function
End If
Else
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck = 3
Exit Function
End If
Dim i As Integer
Dim TotalmulAiWi As Integer
For i = 0 To 16
TotalmulAiWi
= TotalmulAiWi + CInt(Mid(Ai, i + 1, 1)) * CInt(Wi(i))
Next
Dim modValue As Integer
modValue
= TotalmulAiWi Mod 11
Dim strVerifyCode ' As Object
strVerifyCode = arrVerifyCode(modValue)
Ai
= Ai & strVerifyCode
If Len(e) = 18 And CStr(e) <> Ai Then
'IDCheck= "身份证号码输入错误(身份证包含有非法字符)!"
IDCheck = 4
Exit Function
End If
End Function

 

下面我们进行对身份进行验证,看是否能够正确常:

OK,验证通过,现在再看我们修改其中的一个数字或最后一位验证码看是否能通过:

修改出生年龄1880改为1881

修改最后一位验证码:

验证错误,无法通过验证,因18位数的身份证最后一位数是由前十七位数字本体码加权求和公式算出来的,换成其它数字或字母都是错误的呵,不信你试试,哈哈!

 

评论
  • Re:实现的15位和18位身份证格式验证算法  (2006/8/5 19:57:22) by 飘萍 
    这个方法只能验证身份证号码是不是符合规范,不能判定真假吧?
  • Re:实现的15位和18位身份证格式验证算法  (2009/3/18 15:01:55) by ylp1588 
    身份证验证方法都只能验证是否符合规范,要判断真假,只有公安局才可以。
  • Re:实现的15位和18位身份证格式验证算法  (2012/9/2 21:38:23) by 王亚丽 

标 题:
 
姓 名:
 
主 页:

验证码:

评论:
 

Because of the cache,you may see your comments several minutes later.