前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - 生成身份证后6位字典

Python - 生成身份证后6位字典

作者头像
Naraku
发布2021-07-28 10:56:35
2.5K0
发布2021-07-28 10:56:35
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

最近突发奇想,想写一个小脚本来生成一个身份证后6位的小字典。因为学校有时候会发布的一些统一的账号表,例如校园网的账号密码,通常账号名为学号,密码则为身份证后6位,所以有时候可能会派上用场

?

首先需要了解一下身份证号码结构:

  • 1~6,地址码,常住户口所在地的行政区划代码
  • 7~14,出生年月日
  • 15~17,顺序码,且第17位由性别决定。男性为奇数,女性为偶数
  • 18校验码,将前面17位代入公式计算,结果为0~10,若为10则用X表示

举例:440106 19990101 0010

  • 44广东省,01广州市,06天河区
  • 19990101,出生年月日
  • 001,第17位为1即男性
  • 0,最后一位为校验码

如果需要爆破后6位,即身份证的第13~18位,那么就有10*10*10*10*10*11(最后一位有0~X共11位)种可能

  • 后6位中的第1位,即出生日期的十位,只能为0~3,即4*10*10*10*10*11
  • 而如果是针对某人而写的字典,知道目标的性别,那么第5位就可以减掉一半。男性为1/3/5/7/9,女性为0/2/4/6/8,即4*10*10*10*5*11
  • 同时,如果知道目标的出生日期(学校发的很多信息表中都会包含出生年月日等信息),即第1~2位也可以确定了。那么需要爆破的只有15~18位,即10*10*5*11=5500,这个数量级已经对于电脑来说很轻松就可以完成。

说了这么一大堆,其实最后也就10多行代码:

代码语言:javascript
复制
import itertools

if __name__ == '__main__':
    date = input("出生日期: ")
    sex = '02468' if int(input("性别(男1女2): ")) % 2 == 0 else '13579'  # 性别位
    check = '0123456789X'  # 校验位
    other = '0123456789'   # 其它位
    nums = itertools.product(other, other, sex, check)
    cards = []
    for num in nums:
        card = date + "".join(num)
        cards.append(card)
    print(len(cards))
    print(cards)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020 年 02 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档