2012년 4월 15일 일요일

sec) 주민등록 번호 알고리즘

민번은 13자리 숫자다.

12자리 숫자에서 마지막 자리 숫자를 계산하는게 그 방법이다.

주민번호는 일정한 공식에 따라만들어진다. 예를들어서 700120-1012345
이라는 주민번호는 다음과 같은 공식을 만족한다.

제일 마지막 자리수를 제외한 각자리수에 정수를 곱한다. 위의 예를 보면 곱하는 수는 자리수마다 다르다.

   7 0   0  1 2   0  1  0  1  2 3   4 5  주민번호자리수 
 2 3   4  5  6  7  8  9  2  3  4  5  제외  곱할수

그리고 특정수가 곱해진 각자릿수를 더한다.(마지막 자리는 계산에서 일단 제외한다)
이 값을 11로 남은 나머지를 다시 10로 나누어서 그 값이 주민번호 마지막 자리와 비교한다.

즉 위에서는 14 + 0 + 0 + 5 + 12 + 7 + 8 + 0 + 2 + 6 + 12 + 20 = 86
86/11  = 나머지 9
예를 11에서 뺀다. 11-9 = 2
가끔 11이나 10도 나오는 수가 있으므로 10으로 나눈 나머지를 구한다.
2 % 10 = 2

근데  이 값이 마지막숫자 5와 다르다. 그러므로 위의 주민번호는 형식에 맞지 않다. 막 만든거니까.



그런데 왜 이런 포스팅을 하는걸까?

우리나라 유명한 포털 사이트인 네이버, 다음,  등등은 한국신용평가원 따위의 기관에 연결하여 우리의 정보를 다시 한번 확인한다. 큰 기업이니까.

 그러나 개인이 운영하는 사이트에서 무단으로 민번을 수집해서 중국에 건당 50원에 판다.

그래서 아이핀이 나왔다.

 불법 공유 사이트 같은데서는 신용정보를 제공하는 사이트와 연계를 못한다.

그런데 가입할 때 허위 주민등록 번호를 이용하자. 그럼 중국에 팔 때 데이터 신뢰도를 떨어 뜨린

다. 위의 정보를 이용해서 프로그래밍 해 보았다. 자바다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
 /**
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  int checkNumber[] = { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5};
  int temp1, sum = 0;
  InputStreamReader sr = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(sr);
  String inputNumber = (br.readLine());
  inputNumber.trim();
  int i = 0;
  for(; i < inputNumber.length()-1 ; i++ ) {
   temp1 = (int)inputNumber.charAt(i)-48;
   System.out.print(temp1);
   System.out.print(" "+ checkNumber[i]);
   sum += temp1 * checkNumber[i];
   System.out.println(" " + sum);
  }
  System.out.println("sum = " + sum);
  temp1 = sum % 11;
  System.out.println("sum % 11 = " + temp1);
  temp1 = (11-temp1) % 10;
  System.out.println("LastNumber" + temp1 );
  System.out.println("i" + i + " " + (int)inputNumber.charAt(i));
  if(temp1 == ((int)inputNumber.charAt(i)-48)) System.out.println("true");
  else System.out.println("false");
 }
}

메인이라는 클레스를 만들고 걍 붙여넣으면 콘솔에서 실행이 된다. 이런 방식이다.

-----------------------------------------------------------------
요건 인터넷에서 펀건데 생성기다.
주민등록 번호 생성기 라고 보면 되는데
탄생 년도가 많이 넘어가는게 있으니 수정해서 쓰면 더 좋겠다. 먹히는 사이트에서는 걍 써도 되고.

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class MakingNumber extends Frame implements ActionListener
{
 private static final long serialVersionUID = 1L;
  Button cmdMade=new Button("Making");
        Button cmdClear=new Button("Deleting");
        TextArea textare=new TextArea(20,80);
        Panel pn1=new Panel();
        Panel pn2=new Panel();
        public MakingNumber()
        {
                super("MakingNumber");
                pn1.setLayout(new BorderLayout());
                add("Center",pn1);
                pn1.add("North",pn2);
                pn1.add("Center",textare);
                pn2.add(cmdMade);
                pn2.add(cmdClear);
                setBounds(100,100,240,350);
                setVisible(true);
                cmdMade.addActionListener(this);
                cmdClear.addActionListener(this);
                addWindowListener(new WindowAdapter()
                {
                        public void windowClosing(WindowEvent we)
                        {
                                System.exit(0);
                        }
                });
        }
        public void displayPart()
        {
                int j=1;
                textare.append("\n");
                for(j=1;j<11;j++)
                {
                        String string="";
                        for(int i=0;i<2;i++)
                        {
                                int sangI=(int)(Math.random()*10);
                                String sInteger=Integer.toString(sangI);
                                string+=sInteger;
                        }
                        int i1=(int)Math.random();
                        string+=i1;
                        int i2=(int)(Math.random()*10+1);
                        string+=i2;
                        int i3=(int)(Math.random()*4);
                        string+=i3;
                        int i4;
                        if(i3==2)
                        {
                                i4=(int)Math.random();
                        }
                        else
                        {
                                i4=(int)(Math.random()*10);
                        }
                        string+=i4;
                        string+="-";
                        int sGender=(int)(Math.random()*3);
                        string+=sGender;
                        for(int i=0;i<5;i++)
                        {
                                int sangI=(int)(Math.random()*10);
                                String sangS=Integer.toString(sangI);
                                string+=sangS;
                        }
                        int w[]={2,3,4,5,6,7,0,8,9,2,3,4,5};
                        int sum=0;
                        for (int i=0;i<13;i++)
                        {
                                sum+=(string.charAt(i)-48)*w[i];
                        }
                        int na = sum % 11;
                        int result = 11 - na;
                        result %=10;
                        string += result;
                        textare.append("\t"+j+" : "+string+"\n");
                        textare.append("\n");
                }
        }
        public void actionPerformed(ActionEvent ae)
        {
                if(ae.getSource()==cmdMade)
                {
                        displayPart();
                }
                else if(ae.getSource()==cmdClear)
                {
                        textare.setText("");
                }
        }
        public static void main(String[]args)
        {
                new MakingNumber();
        }
}

------------------------------
중국에 팔아 넘기는 중소 인터넷 사이트에서 수집하는 데이터 신뢰도 무결성을 떨어뜨리자!
더 이상 꾸린 사이트 가입할 때 다른 사람의 주민등록 번호를 도용하지 말고
무작위로 만들어 버리자!













[팁]주민번호를 만들어내는 규칙에 대해서 설명과 소스(turbo-c) 올려드립니다.
주민등록번호 형식



주민등록번호은 규칙이있습니다 주민등록번호는 총 13자리입니다
예를들어 주민번호 5 1 0 6 0 3 - 1 0 0 1 3 2 2는 데시를 기준으로
앞에는 6자리 다음은 7자리입니다 여기서 뒤의 7자리중
제일끝에 있는 수가 중요한 수 입니다 Check Dight 수라고합니다
이 앞의 12자리수는 Check Dight수와 어떤 규칙이 있습니다
규칙은 아래와 같습니다
우선 배열 2 3 4 5 6 7 8 9 2 3 4 5 의 12자리가 있습니다
여기에 주민등록번호 총13자리중 제일 마지막수를 빼고
순서대도 대응되는 숫자끼리 곱한수를 전부 더한 후 11로 나누어
나머지를 구한후 11에서 뺀 나머지의 1의자리를 Check Dight 수라고
합니다 위의 예를들어서
2*5 + 3*1 + 4*0 + 5*6 + 6*0 + 7*3 + 8*1 + 9*0 + 2*0 + 3*1 + 4*3 + 5*2
=97

97 / 11 = 8(목) ----- 9(나머지)

11 - 9(나머지) = 2

510603-100132x 에서 x=2라는 것은
어떤 공식이 성립이 된다고 생각하시면 됩니다

다음은 제가 turbo_c로 만든 소스입니다(참고하세요)


#include

main()
{

int c[12]={2,3,4,5,6,7,8,9,2,3,4,5},i,a,s=0,x,y,z=27;
clrscr();
gotoxy(1,3);
printf("Input your jumin number : - ");

for(i=0;i<12;i++,z++) {
gotoxy(z,3);
a = getche() - 48;
if ( a == -21 ) exit(-1);

if ( a < 0 || a > 9 ) {
printf("\nExtent out.. If you exit press Esc key..");
printf("\nContinue is press any key except Esc key..");
( getch() == 27 ) ? exit(-1) : main();
}


s = ( s + ( a * c[i] ) );
if ( z == 32 ) z++;
}
a = ( getche() - 48 );

x = s % 11;
y = 11 - x;

if ( y > 9 ) y -= 10;

if ( y == a ) {
printf("\nYour jumin number is Normal..");
printf("\nIf exit press Esc key.\nElse press any key except.");
( getch() == 27 ) ? exit(-1) : main();
}

else {
printf("\nCheck dight number error..");
printf("\nYour check dight number is not %d but %d.",a,y);
printf("\nIf exit press Esc key.\nElse press any key except.");
( getch() == 27 ) ? exit(-1) : main();

}
}

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...