代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
带星号隐藏的身份证号码的破解
作者:
梁金堂
/ 发布于
2014/8/6
/
4083
可以在任意位带星号,但星号不能多于9位.因为考虑到计算机的性能. 事实证明,火车票那4位用星号隐藏根本无济于事! 事实上,就那几十个号码,随便找个要身份证号码认证的地方认证一下就破解了.比如手机服务密码重置需要身份证号码,某些网站账号找回用的身份证号码...或者可以去QQ空间偷窥一下生日大概信息,破解的概率就很大了.
import java.util.Calendar; public class Crack { int[] weightNum = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; int[] index; int[] nums = new int[18]; boolean isFull = false; int year; int month; int day; public Crack() { Calendar c = Calendar.getInstance();// 可以对每个时间域单独修改 year = c.get(Calendar.YEAR); month = c.get(Calendar.MONTH); day = c.get(Calendar.DATE); ; } /** * * @param s * 长度必须是18位,星号不能多于9位 */ public void setNums(String s) { char[] cs = s.toCharArray(); int cout = 0; for (int i = 0; i < cs.length; i++) { if (cs[i] == '*') cout++; } if (cout == 0) { isFull = true; } else { index = new int[cout]; } for (int i = 0, j = 0; i < cs.length - 1; i++) { if (cs[i] != '*') nums[i] = cs[i] - '0'; else { index[j++] = i; nums[i] = 0; } } switch (cs[17]) { case '*': index[index.length - 1] = 17; nums[17] = 0; break; case '1': nums[17] = 0; break; case '0': nums[17] = 1; break; case 'x': case 'X': nums[17] = 2; break; case '9': nums[17] = 3; break; case '8': nums[17] = 4; break; case '7': nums[17] = 5; break; case '6': nums[17] = 6; break; case '5': nums[17] = 7; break; case '4': nums[17] = 8; break; case '3': nums[17] = 9; break; case '2': nums[17] = 10; break; default: break; } } int[] monthDays = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; private boolean isUsual() { boolean b = true; int year = nums[6] * 1000 + nums[7] * 100 + nums[8] * 10 + nums[9]; int month = nums[10] * 10 + nums[11]; int day = nums[12] * 10 + nums[13]; b = year >= 1900 && year <= this.year; b = b && month <= 12 && month >= 1; if (!b) return false; if (month == 2) { if (year % 400 == 0 || (year % 400 != 0 && year % 4 == 0)) { b = b && day >= 1 && day <= 29; } else { b = b && day >= 1 && day <= 28; } } else { b = b && day >= 1 && day <= monthDays[month - 1]; } return b; } private boolean istrue() { int x = 0; for (int i = 0; i < nums.length - 1; i++) { x += weightNum[i] * nums[i]; } if (x % 11 == nums[17]) return true; return false; } private boolean testArea() { int x = 0; for (int i = 0; i < 6; i++) { x = x * 10 + nums[i]; } return XingZhengDaiMa.test(x); } private String getArea() { int x = 0; for (int i = 0; i < 6; i++) { x = x * 10 + nums[i]; } return XingZhengDaiMa.getAreaByCode(x); } private int calEnd() { int x = 0; for (int i = 0; i < nums.length - 1; i++) { x += weightNum[i] * nums[i]; } return x % 11; } char[] ends = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; public String idToString() { return String.format("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%c", nums[0], nums[1], nums[2], nums[3], nums[4], nums[5], nums[6], nums[7], nums[8], nums[9], nums[10], nums[11], nums[12], nums[13], nums[14], nums[15], nums[16], ends[nums[17]]); } public void cal(CarckListener carckListener, boolean callbackArea) { int count = 0; if (isFull) { if (istrue()) { if (!callbackArea) { carckListener.callBack(0, idToString(), null); } else { carckListener.callBack(0, idToString(), getArea()); } } return; } if (index[index.length - 1] != 17) { int k = 1; for (int i = 0; i < index.length; i++) { k *= 10; } for (int i = 0, j = 0; i <= k; i++) { j = i; for (int j2 = 0; j2 < index.length; j2++) { nums[index[j2]] = j % 10; j /= 10; } if (istrue() && isUsual() && testArea()) { if (!callbackArea) { carckListener.callBack(0, idToString(), null); } else { carckListener .callBack(count++, idToString(), getArea()); } } } } else { int k = 1; for (int i = 0; i < index.length - 1; i++) { k *= 10; } for (int i = 0, j = 0; i <= k; i++) { j = i; for (int j2 = 0; j2 < index.length - 1; j2++) { nums[index[j2]] = j % 10; j /= 10; } if (isUsual() && testArea()) { nums[17] = calEnd(); if (!callbackArea) { carckListener.callBack(0, idToString(), null); } else { carckListener .callBack(count++, idToString(), getArea()); } } } } } public boolean verifyNums(String s) { if (s.length() != 18) { return false; } char[] cs = s.toCharArray(); boolean b = true; for (int i = 0; i < cs.length - 1 && b; i++) { b = (cs[i] >= '0' && cs[i] <= '9') || cs[i] == '*'; } b = b && ((cs[17] >= '0' && cs[17] <= '9') || cs[17] == 'X' || cs[17] == 'x'); return b; } /** * 提供一个接口,输出可能的身份证号 接口 */ public interface CarckListener { /** * * @param i * 第几个,从0开始 * @param s * 身份证号码 * @return 保留,可忽略 */ int callBack(int i, String s, String area); /** * 异常处理 * * @param msg */ void error(String msg); } public static void main(String[] args) { Crack crack = new Crack(); crack.setNums("*40203198002**252*"); crack.cal(new CarckListener() { @Override public int callBack(int i, String s, String area) { System.out.print(String.format("%10d ", i)); System.out.print(s); System.out.println(" " + area); return 0; } @Override public void error(String msg) { System.err.println(msg); System.exit(1); } }, true); } }
试试其它关键字
身份证号码
星号
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
梁金堂
贡献的其它代码
(
3
)
.
SM2用到KDF函数
.
一键卫星定位地图开发
.
带星号隐藏的身份证号码的破解
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3