身份证中校验位计算方法
- 格式:xls
- 大小:22.50 KB
- 文档页数:2


身份证校验码计算公式校验码是识别一个身份证号码是否真实存在的重要的依据。
那我们要如何通过校验码来判断一个身份证号码是否真实的呢?校验码如何判断身份证号码真伪呢?我们来看看具体计划过程。
第一步:将身份证号码的第1位数字与7相乘;将身份证号码的第2位数字与9相乘;将身份证号码的第3位数字与10相乘;将身份证号码的第4位数字与5相乘;将身份证号码的第5位数字与8相乘;将身份证号码的第6位数字与4相乘;将身份证号码的第7位数字与2相乘;将身份证号码的第8位数字与1相乘;将身份证号码的第9位数字与6相乘;将身份证号码的第10位数字与3相乘;将身份证号码的第11位数字与7相乘;将身份证号码的第12位数字与9相乘;将身份证号码的第13位数字与10相乘;将身份证号码的第14位数字与5相乘;将身份证号码的第15位数字与8相乘;将身份证号码的第16位数字与4相乘;将身份证号码的第17位数字与2相乘。
第二步:将第一步身份证号码1~17位相乘的结果求和,全部加起来。
第三步:用第二步计算出来的结果除以11,这样就会出现余数为0,余数为1,余数为2,余数为3,余数为4,余数为5,余数为6,余数为7,余数为8,余数为9,余数为10共11种可能性。
第四步:如果余数为0,那对应的最后一位身份证的号码为1;如果余数为1,那对应的最后一位身份证的号码为0;如果余数为2,那对应的最后一位身份证的号码为X;如果余数为3,那对应的最后一位身份证的号码为9;如果余数为4,那对应的最后一位身份证的号码为8;如果余数为5,那对应的最后一位身份证的号码为7;如果余数为6,那对应的最后一位身份证的号码为6;如果余数为7,那对应的最后一位身份证的号码为5;如果余数为8,那对应的最后一位身份证的号码为4;如果余数为9,那对应的最后一位身份证的号码为3;如果余数为10,那对应的最后一位身份证的号码为2。
⾝份证最后⼀位按照ISO7064:1983.MOD11-2校验码,根据〖 GB 11643-1999〗中有关的规定,是特征组合码,由⼗七位数字本体码和⼀位数字校验码组成。
排列顺序从左⾄右依次为:六位数字地址码,⼋位数字出⽣⽇期码,三位数字顺序码和⼀位数字校验码。
即8位⾝份证号码的最后⼀位是数字校 校验码(⾝份证最后⼀位)是根据前⾯⼗七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。
计算⽅法: 1、将前⾯的⾝份证号码17位数分别乘以不同的系数。
从第⼀位到第⼗七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、⽤加出来和除以11,看余数是多少? 4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。
其分别对应的最后⼀位⾝份证的号码为1-0-X -9-8-7-6-5-4-3-2。
5、通过上⾯得知如果余数是3,就会在⾝份证的第18位数字上出现的是9。
如果对应的数字是2,⾝份证的最后⼀位号码就是x。
例如:某男性的⾝份证号码为【530102************】,我们看看这个⾝份证是不是合法的⾝份证。
⾸先我们得出前17位的乘积和【(5*7)+(3*9)+(0*10)+(1*5)+(0*8)+(2*4)+(1*2)+(9*1)+(2*6)+(0*3)+(0*7)+(5*9)+(0*10)+(8*5)+(0*8)+(1*4)+(1*2)】是189,然后⽤189除以11得出的结果是189/11=17----2,也就是说其余数是2。
最后通过对应规则就可以知java--18位⾝份证号最后⼀位(检验码)是怎么算出来的?⾝份证的最后⼀位是根据前17位数字计算出来的检验码。
计算⽅法是:将⾝份证号码前17位数分别乘以不同的系数。
从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 105 8 4 2;将乘积之和除以11,余数可能为0 1 2 3 4 56789 10。
身份证识别码的确定计算方法大陆的身份证为18位,老的身份证是15位。
眼下人们在换发的新身份证俗称为“二代身份证”或者叫“二代征”,老身份证叫“一代证”。
一代身份证是上世纪80年代中期开始的,是依据《中华人民共和国居民身份证条例》(1985年9月6日第六届全国人民代表大会常务委员会第十二次会议通过1985年9月6日中华人民共和国主席令第二十九号公布1985年9月6日起施行)制作颁发的,采用印刷和照相技术塑封而成,只能视读不能机读,易于伪造,而且无法迅捷有效地对公民进行人、证同一认定,不利于有效打击伪造、变造居民身份证以及利用伪造证件、他人证件进行金融犯罪、流窜作案等违法犯罪活动,严重制约了这一法定证件在证明和识别公民身份方面的作用的正常发挥。
“二代证”是依据《中华人民共和国居民身份证法》(2003年6月第十届全国人大常委会第三次会议通过了《居民身份证法》,于2004年1月1日起施行。
本法自2004年1月1日起施行,《中华人民共和国居民身份证条例》同时废止)制作颁发的。
“二代证”由多层聚酯材料复合而成的单页卡式证件,可以视读,内嵌非接触式IC卡芯片作为“机读”存储器,可以将变动信息(如住址变动)追加写入;芯片使用特定的逻辑加密算法,有利于证件制发、使用中的安全管理,增强防伪功能;芯片和电路线圈在证卡内封装,能够保证证件在各种环境下正常使用,寿命在十年以上;并且具有读写速度快,使用方便,易于保管,以及便于各用证部门使用计算机网络核查等优点。
二代证”主要采用数字防伪和印刷防伪技术。
数字防伪用于机读信息的防伪,是将持证人的照片图象和身份项目内容等数字化后存入芯片。
可以有效起到证件防伪的作用,防止伪造证件或篡改证件机读信息内容。
证件表面的视读防伪,主要是采用高新技术制作的防伪标识和印刷防伪技术,具有一定的防伪功效。
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。
/*** 【身份证号码的规则】1、15位身份证号码组成:ddddddyymmddxxs共15位,其中:* dddddd为6位的地方代码,根据这6位可以获得该身份证号所在地。
yy为2位的年份代码,是身份证持有人的出身年份。
* mm为2位的月份代码,是身份证持有人的出身月份。
dd为2位的日期代码,是身份证持有人的出身日。
这6位在一起组成了身份证持有人的出生日期。
* xx为2位的顺序码,这个是随机数。
s为1位的性别代码,奇数代表男性,偶数代表女性。
2、18位身份证号码组成:* ddddddyyyymmddxxsp共18位,其中:其他部分都和15位的相同。
年份代码由原来的2位升级到4位。
最后一位为校验位。
校验规则是:* (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 也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该身份证号码不正确。
*/package citi;import java.util.Scanner;/*** @author D.puntu**/public class MyIdCard {private static String Id = null;private static String myIndexStr, index = null;private static int i = 0;private static int m = 0, n = 0, myIndex;private static int areaId, year, mon, day, sex;private static int id = 0;// 从第一位到第十七位的数字的权值private static int myArrayIndex[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9,10, 5, 8, 4, 2 };public static void main(String[] args) {startIndex();}private static void startIndex() {Scanner in = new Scanner(System.in);System.out.println("请输入身份证号(18位数字):");Id = in.next();i = Id.length();while (i != 18) {if (i > 18) {System.out.println("身份证号码只有18位数字,但是您输入" + i + "位,请重新输入");Id = in.next();i = Id.length();} else if (i < 18) {System.out.println("身份证号码应该有18位数字,但是您输入" + i + "位,请重新输入");Id = in.next();i = Id.length();}}if (i == 18) {while (!getAreaId(Id, i) || !getYear(Id, i) || !getMon(Id, i)|| !getDay(Id, i)) {Id = in.next();i = Id.length();}}getIndex(Id, i, getSum(Id, i));}private static int getSum(String id, int i) {for (m = 0; m < myArrayIndex.length; m++) {n = n + Integer.parseInt(id.substring(m, m + 1)) * myArrayIndex[m]; // 前17位加权后的和}myIndex = n % 11;// 取模return myIndex;}private static void getIndex(String id, int i, int m) {myIndexStr = id.substring(i - 1, i);// 取得校验位// 算出校验位switch (m) {case 0:index = "1";break;case 1:index = "0";break;case 2:index = "X";break;case 3:index = "9";break;case 4:index = "8";break;case 5:index = "7";break;case 6:index = "6";break;case 7:index = "5";break;case 8:index = "4";break;case 9:index = "3";break;case 10:index = "2";break;}if (index.equalsIgnoreCase(myIndexStr)) {System.out.println("输入的身份证号码有效!!");} else {System.out.println("输入的身份证号码无效!!");}}/*** 前六位范围110000----659001*/public static boolean getAreaId(String str, int i) {boolean myAreaId = false;areaId = Integer.parseInt(str.substring(id, id + 6));if (areaId > 659001 || areaId < 110000) {System.out.println("输入的身份证号码地址位有错误!!");myAreaId = false;} else {myAreaId = true;}return myAreaId;}public static boolean getYear(String str, int i) {boolean myYear = false;year = Integer.parseInt(str.substring(id + 6, id + 10));if (year > 2015 || year < 1865) {System.out.println("输入的身份证号码年份有错误!!请重新输入身份证号码");myYear = false;} else {myYear = true;}return myYear;}public static boolean getMon(String str, int i) {boolean myMon = false;mon = Integer.parseInt(str.substring(id + 10, id + 12));if (mon <= 12 && mon >= 1) {myMon = true;} else {System.out.println("输入的身份证号码月份有错误!!请重新输入身份证号码");}return myMon;}public static boolean getDay(String str, int i) {boolean myDay = false;int dayToMon = Integer.parseInt(str.substring(id + 10, id + 12));day = Integer.parseInt(str.substring(id + 12, id + 14));if (day >= 1 && day <= getMonday(dayToMon)) {myDay = true;} else {System.out.println("输入的身份证号码天数与对应的月份不一致!!请重新输入身份证号码");}return myDay;}public static int getMonday(int i) {int jDay = 0;switch (i) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:jDay = 31;case 4:case 6:case 9:case 11:jDay = 30;break;case 2:jDay = 28;}return jDay;}}。