python 小应用 隐藏身份证号码猜解

#身份证编号  51010619******2453
# -*- coding: utf-8 -*-
import re
def checkIdcard(idcard):
    a = 0
    Errors=['验证通过!','身份证号码位数不对!','身份证号码出生日期超出范围或含有非法字符!','身份证号码校验错误!','身份证地区非法!']
    idcard=str(idcard)
    idcard=idcard.strip()
    idcard_list=list(idcard)
    if(len(idcard)==18):
        #出生日期的合法性检查
        #闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
        #平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
        if(int(idcard[6:10]) % 4 == 0 or (int(idcard[6:10]) % 100 == 0 and int(idcard[6:10])%4 == 0 )):
            ereg=re.compile('[1-9][0-9]{5}(19[0-9]{2}|20[0-9]{2})((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$')#//闰年出生日期的合法性正则表达式
        else:
            ereg=re.compile('[1-9][0-9]{5}(19[0-9]{2}|20[0-9]{2})((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$')#//平年出生日期的合法性正则表达式
        #//测试出生日期的合法性
        if(re.match(ereg,idcard)):
            #//计算校验位
            S = (int(idcard_list[0]) + int(idcard_list[10])) * 7 + (int(idcard_list[1]) + int(idcard_list[11])) * 9 + (int(idcard_list[2]) + int(idcard_list[12])) * 10 + (int(idcard_list[3]) + int(idcard_list[13])) * 5 + (int(idcard_list[4]) + int(idcard_list[14])) * 8 + (int(idcard_list[5]) + int(idcard_list[15])) * 4 + (int(idcard_list[6]) + int(idcard_list[16])) * 2 + int(idcard_list[7]) * 1 + int(idcard_list[8]) * 6 + int(idcard_list[9]) * 3
            Y = S % 11
            M = "F"
            JYM = "10X98765432"
            M = JYM[Y]#判断校验位
            if(M == idcard_list[17]):#检测ID的校验位
                print(idcard)
                print (Errors[0])
                a = 1
            else:
                print (Errors[3])
        else:
            print (Errors[2])
    else:
        print (Errors[1])
    return a
 
def brute_id():
    s1 = '51010619'#身份证前6位
    s2 = ['5','6','7','8']#身份证 年份 十位 在5-8区间
    s3 = ['0','1','2','3','4','5','6','7','8','9']#身份证 年份 个位 0-9
    s4 = ['01','02','03','04','05','06','07','08','09','10','11','12']#月份 01 -12
    s5 = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']#日期 01-31
    s6 =  '2453'#身份证后4位
    s=[]
    i = 0
    a = ''
    for i_s2 in s2:
        id = s1+i_s2
        id_1 = id
        for i_s3 in s3:
            id = id_1
            id = id + i_s3
            id_2 = id
            for i_s4 in s4:
                id = id_2
                id = id+i_s4
                id_3 = id
                for i_s5 in s5:
                    id = id_3
                    id = id + i_s5 +s6
                    s.append(id)
    return s
if __name__ == "__main__":
    s = brute_id()
    print(len(s))
    s1=[]
    for cdcard  in s:
        if checkIdcard(cdcard):
            s1.append(cdcard)
    print(s1)
    print (len(s1))

猜你喜欢

转载自blog.csdn.net/blackj_liuyun/article/details/80058720