#身份證編號 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))
python 小應用 隱藏身份證號碼猜解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.