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();
}
}
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.