随机 获取 大量 测试 身份证号

获取测试身份证号

参照的博客
很多游戏账号申请,或者某些网站注册时需要填身份证号,当输入错误的身份证号时会提示出错,感觉好像真能识别身份证信息一样,其实不然。

         实质上由于其没有权限接入公安系统,它只能根据最后一位校验位来判断该身份证号码是否有效,为了不泄露个人隐私,而又可以轻松的拿到账号,可以伪造身份证号,前17为自己随机伪造,只需要计算出最后一位校验位即可。



ISO 7064:1983.MOD11-2校验码计算法 : (身份证校验码-18)

假设某一17位数字是

17位数字       1     2     3     4     5     6     7     8     9     0     1     2     3     4     5     6     7

加权因子 7     9     10    5     8     4     2     1     6     3     7     9     10    5     8     4     2

计算17位数字各位数字与对应的加权因子的乘积的和S1×72×93×104×55×86×47×28×19×60×31×72×93×104×55×86×47×2368;

计算S÷11的余数T368 mod 11=5;

((  余数010对应校验码为[1, 0, X , 9, 8, 7, 6, 5, 4, 3, 2],算法如下 ))

计算(12-T)÷11的余数R,如果R10,校验码为字母“X”;如果R10,校验码为数字“R”:(12-5)mod 117。

该17位数字的校验码就是7,聚合在一为123456789012345677--------------------- 
作者:hank_fan5 
来源:CSDN 
原文:https://blog.csdn.net/n289950578/article/details/22287389 
版权声明:本文为博主原创文章,转载请附上博文链接!

基于上面逻辑,java代码的实现 (把main方法中代码直接拷贝,运行即可)

import java.util.*;
public class Main {
    public static void main(String[] args) {
        //获取n个身份证号,方便测试
        //现在的身份证号的第18位使用的是**ISO 7064:1983.MOD11-2**校验码计算法获取的
        // 返回一个0~(指定数-1)之间的随机值
        //校验值  好像不太对 没有使用
        //char[] verifyValue = new char[]{'1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'};
        //加权因子
        int[]   weightingFactor = new int[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        int j = 0;
        while (true){
            //测试用 身份证号{5,1,0,7,2,3,1,9,9,4,1,2,0,9,2,8,7} 18位为 4
            int[] cardId = new int[17];
            StringBuilder sb = new StringBuilder(18);
            for(int i=0;i<cardId.length;i++){
                Random random = new Random();
                int ran = random.nextInt(10);
                sb.append(ran);
                cardId[i] = ran;
            }
            //计算17位数字各位数字与对应的加权因子的乘积的和s
            int s  = 0;
            for(int h = 0 ;h<cardId.length;h++){
                s =  s+cardId[h]*weightingFactor[h];
            }
            //计算s÷11的余数t
            int t = s%11;
            //获取校验码
            //int wf = verifyValue[t]; 
            //计算(12-T)÷11的余数r
            int r = (12-t)%11;
            if (10 == r){
                sb.append('X');
            }else{
                sb.append(r);
            }
            //生成的 身份证件号:
            //System.out.println(cardId.length);
            System.out.println(sb.toString());
            //生成多少个
            j++;
            //生成10000个
            if (j==10000){
                break;
            }

        }

    }
}

你可能感兴趣的:(java,理论实现)