个人专长: 胡扯,瞎掰,软件测试稍微靠谱
(空间无原创东西,全部来源网络,如有侵权请联系本人)
实现的15位和18位身份证格式验证算法
上一篇 /
下一篇 2008-05-19 16:11:33
/ 个人分类:小知识册
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>
<metacontent="Microsoft Visual Studio .NET 7.1"name="GENERATOR">
<metacontent="Visual Basic .NET 7.1"name="CODE_LANGUAGE">
<metacontent="Javascrīpt"name="vs_defaultClientscrīpt">
<metacontent="http://schemas.microsoft.com/intellisense/ie5"name="vs_targetSchema">
</HEAD>
<bodyMS_POSITIONING="GridLayout">
<formid="Form1"method="post"runat="server">
<asp:labelid="Label1"runat="server">身份证验证:</asp:label>
<asp:textboxid="txtID"runat="server"Width="192px"></asp:textbox>
<asp:buttonid="CmdVerify"runat="server"Text="验证"></asp:button>
<asp:labelid="LblErr"runat="server"ForeColor="Red"></asp:label>
</form>
</body>
</HTML>
VerifyIDCard.aspx.vb的代码:
PrivateSub Page_Load()SubPage_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
'在此处放置初始化页的用户代码
End Sub
PrivateSub CmdVerify_Click()SubCmdVerify_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesCmdVerify.Click
SelectCaseIDCheck(txtID.Text)
Case0
LblErr.ForeColor=System.Drawing.Color.Green
LblErr.Text="验证通过!"
Case1
LblErr.ForeColor=System.Drawing.Color.Red
LblErr.Text="身份证号必须是15位数或18位数!"
Case2
LblErr.ForeColor=System.Drawing.Color.Red
LblErr.Text="身份证除最后一位外,必须为数字!"
Case3
LblErr.ForeColor=System.Drawing.Color.Red
LblErr.Text="身份证输入错误(日期输入错误)!"
Case4
LblErr.ForeColor=System.Drawing.Color.Red
LblErr.Text="身份证号码输入错误(身份证包含有非法字符)!"
EndSelect
End Sub
'15位和18位身份证验证
'返回参数(
'0:验证通过!
'1:身份证号必须是15位数或18位数!
'2:身份证除最后一位外,必须为数字!
'3:身份证输入错误(日期输入错误)!
'4:身份证号码输入错误(身份证包含有非法字符)!
')
'作者:踢西
'日期:2005-09-09
Function IDCheck()FunctionIDCheck(ByVale)AsInteger
DimarrVerifyCode
DimWi
DimChecker
DimBirthDay
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",",")
IfLen(e)<15OrLen(e)=16OrLen(e)=17OrLen(e)>18Then
'IDCheck= "身份证号必须是15位数或18位数!"
IDCheck=1
Exit Function
EndIf
DimAiAsString
IfLen(e)=18Then
Ai=Mid(e,1,17)
ElseIfLen(e)=15Then
Ai=CStr(e)
Ai=Left(Ai,6)&"19"&Mid(Ai,7,9)
EndIf
IfNotIsNumeric(Ai)Then
'IDCheck= "身份证除最后一位外,必须为数字!"
IDCheck=2
Exit Function
EndIf
DimstrYearAsInteger
DimstrMonthAsInteger
DimstrDayAsInteger
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)
IfIsDate(BirthDay)Then
IfDateDiff("yyyy", Now(),CDate(BirthDay))<-140OrCDate(BirthDay)>Today()Then
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck=3
Exit Function
EndIf
IfstrMonth>12OrstrDay>31Then
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck=3
Exit Function
EndIf
Else
'IDCheck= "身份证输入错误(日期输入错误)!"
IDCheck=3
Exit Function
EndIf
DimiAsInteger
DimTotalmulAiWiAsInteger
Fori=0To16
TotalmulAiWi=TotalmulAiWi+CInt(Mid(Ai, i+1,1))*CInt(Wi(i))
Next
DimmodValueAsInteger
modValue=TotalmulAiWiMod11
DimstrVerifyCode'As Object
strVerifyCode=arrVerifyCode(modValue)
Ai=Ai&strVerifyCode
IfLen(e)=18AndCStr(e)<>AiThen
'IDCheck= "身份证号码输入错误(身份证包含有非法字符)!"
IDCheck=4
Exit Function
EndIf
End Function
下面我们进行对身份进行验证,看是否能够正确常:
验证错误,无法通过验证,因18位数的身份证最后一位数是由前十七位数字本体码加权求和公式算出来的,换成其它数字或字母都是错误的呵,不信你试试,哈哈!
相关阅读:
- 欺骗的艺术:社会工程学 (shen1936, 2008-5-08)
- 欺骗的艺术(社会工程学攻击实例) (shen1936, 2008-5-08)
- 剖析社会工程学 (shen1936, 2008-5-08)
- 社会工程学的防御 (shen1936, 2008-5-08)
- 社会工程学基础:黑客战术 (shen1936, 2008-5-08)
- 士兵作战手册(来自WOW竞技场) (shen1936, 2008-5-13)
- C++和JAVA的区别 (shen1936, 2008-5-14)
- 5.12地震 (shen1936, 2008-5-14)
- 性能测试中各种文件的命名规范 (shen1936, 2008-5-16)
- 磁盘矩阵 (shen1936, 2008-5-19)
收藏
举报
TAG:
小知识册