1. 程式人生 > 實用技巧 >Python|探究隱藏在身份證號碼中的奧祕

Python|探究隱藏在身份證號碼中的奧祕

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理

以下文章來源於騰訊雲,作者:演算法與程式設計之美。

問題描述

作為一個公民,每個人都有一張獨一無二的身份證,有獨一無二的身份證號碼。在這裡面幾乎儲存了我們所有的行蹤與資訊,所以有很多不法分子能夠僅通過身份證號碼進行一些犯罪活動。然而在生活中其實很容易洩露這些資訊,比如車票等等,雖然遮住了4位數字,但這真的安全嗎?

解決方案

通過簡單的查詢,我們不難知道,其實身份證號碼雖然獨一無二,但其生成的規律確是固定的,僅僅通過公式便能確定一個身份證號碼是否正確,反之也可以通過一個確定正確但不完整的身份證號碼來反推完整資訊。

身份證的組成部分相信大家都明白,其最重要的是最後一位校驗碼,而校驗碼的計算其實非常簡單:

前17位數字每一個對應了一個係數,分別是7. 9 .10 .5. 8. 4. 2. 1. 6. 3. 7. 9. 10. 5. 8. 4. 2,將每一位數字與係數相乘得到的數加在一起除以11的餘數一定在0-10以內。然後0 、1、 2、 3、 4、 5、 6、 7、 8、 9、 10這11個數字。其分別對應的最後一位身份證的號碼為1 .0. X. 9. 8. 7. 6. 5. 4. 3. 2.,這樣就得到自己的校驗碼,讀者當然可以自己試試自己的身份證號碼。

雖然我們知道,就算硬算,也不過366種嘗試就能得到結果,但學習語言就是為了簡化,所以筆者自己寫了一段判斷身份證是否正確和大致推算身份證號碼的程式碼,讀者可以自己試試是否有效。

Python程式碼:判斷身份證號是否真實

def ID_Card_judgment(ID_num):   

     list1 = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]

     sums = 0

     for i in range(len(list1)):

         new_num = int(ID_num[i]) * list1[i]

         sums += new_num

 

     check_code = [1,0,"X",9,8,7,6,5,4,3,2]

     num = sums % 11

     if
str(check_code[num]) == ID_num[-1]: return "True" else: return "False"

大致推斷完整身份證號碼:

def ID_Card_calculation(ID_num):

     if ID_num[-1] == "X":

         new_ID_num = ID_num[:-1]+"10"

     else:

         new_ID_num = ID_num

     a = new_ID_num.split("*")

     new_ID_card = "".join(a)

 

 

     front_code = [7,9,10,5,8,4,2,1,6,3,8,4,2] #除生日四位數其他數的引數

 

 

     sums = 0

     for i in range(len(front_code)):    #len(new_ID_card) = 18-4-1 =13

         nums = int(new_ID_card[i]) * front_code[i]

         sums += nums

 

     # print(sums)   除了生日四位數,其他數與對應引數乘積之和

 

     #7,9,10,5   生日四位數的引數

     duiying = [1,0,10,9,8,7,6,5,4,3,2]

 

     times = 0

     for a in range(0,2):

         for b in range(0,10):

            for c in range(0,4):

                for d in range(0,10):

                    if (sums + (a*7 + b*9 +  c*10 + d*5)) % 11  ==  duiying[int(new_ID_num[17:])]:

                        string =  str(a)+str(b)+str(c)+str(d)

                        if  0 < int(string[0:2]) <= 12 and 0 <  int(string[2:4]) <= 31:

                            times += 1

 

                            ID_Card_num = ID_num[0:10] + string +  ID_num[14:18]

 

                             print(ID_Card_num)

 

     print("共有%d種情況。"%times)

 

這個程式碼要求輸入的是生日為****的一串數字,也符合常見的隱藏身份證號碼的規則。雖然不能精確的推斷,但是所得的結果僅有二三十種,再通過現有的網路上一些平臺,加上姓名和星座等等其他一些資訊,輕鬆便能得到你的資訊。

結語

身份證上儲存了太多的私人資訊,大家一定要妥善保管。還有廢棄的車票等其他看似隱藏了能夠保護我們資訊的數字,但都有可能是最後的“罪魁禍首“。雖然其他可能不是隱藏的這四位數字,但通過規律,也是能夠得到的。所以筆者提醒大家,在網路上一定要將自己身份證號打上馬賽克,不給不法分子有可乘之機。

END