메뉴 건너뛰기

app

[RSA] PHP와 JS활용한 ZB41암호화 전송 및 PW찾기(3)

박영식2007.05.26 15:17조회 수 1981댓글 0

    • 글자 크기

1. find_pw.php

<form name=find_pw action=decrypt.php method=post>
<table border=0 width=250>
<tr>
  <td colspan=2 align=center>패스워드 찾기</td>
</tr>
<tr>
 <td colspan=2></td>
</tr>
<tr>
  <td colspan=2 height=10></td>
</tr>
<tr>
  <td align=right>ID </td>
  <td><input type=text name=user_id size=20 maxlength=20 class=input></td>
</tr>
<tr>
  <td align=right>email </td>
  <td><input type=text name=email size=20 maxlength=30 class=input></td>
</tr>
<tr height=30>
  <td align=center align=center colspan=2 >
      <br>
     <input type=submit value="Ok~!"> 
     <input type=button value="reset" onclick=reset() class=kissofgod-submit>
  </td>
</tr>
<tr>
 <td colspan=2 class=kissofgod-base-line></td>
</tr>
</table>

2. decrypt.php
이 파일은 lib이나 따로 스크립트를 include하지 않고 자체 처리한다. config.php만 db정보를 얻기 위해 사용한다.
id와 email로 pw를 복호화 한다.

<?


 function dbconn() {


  global $connect, $config_dir, $autologin, $HTTP_COOKIE_VARS, $_dbconn_is_included;


  if($_dbconn_is_included) return;
  $_dbconn_is_included = true;


  $f=@file($config_dir."config.php") or mysql_error();


  for($i=1;$i<=4;$i++) $f[$i]=trim(str_replace("n","",$f[$i]));


  if(!$connect) $connect = @mysql_connect($f[1],$f[2],$f[3]) or mysql_error();


  @mysql_select_db($f[4], $connect) or mysql_error();
 
  return $connect;
 }
 
 $connect=dbConn();
 $result=mysql_select_db($dbname, $connect);
 $encrr = mysql_fetch_array(mysql_query("select password from zetyx_member_table where user_id='$user_id' and email='$email'")) or mysql_error();
 // echo $encrr[0]; 암호 확인
 ?>
<body onload="decrypt('<?=$encrr[0]?>')">
<script>
function decrypt(password)
{
 //alert(decriptText);
// ========= RSA 복호화 방법 ========= //
<!-- =========== 걸린 시간 측정하기 ====================== -->
var today = new Date()     // 현재시간 얻기
var startTime = today.getTime(); // 밀리초 from 1/1/70
<!-- =================================================== -->
 var clearText = password;
 var prime1 = parseFloat(991); // 입력 숫자문자p를 숫자로 바꿈
 var prime2 = parseFloat(919); // 입력 숫자문자q를 숫자로 바꿈
 var epublic = parseFloat(46421);// 입력 숫자문자d(비밀키)를 숫자로 바꿈
 var block = parseFloat(5); // 입력 숫자문자(블럭당 문자수)를 숫자로 바꿈        
var clearTextBang= clearText.split(" ");   // 암호문을 분리함.


var lengTextBang = clearTextBang.length; // 암호문의 갯수


var pp0 =prime1; // p값
var qq0 =prime2; // q값
var ee0 =epublic; // e값


var pq = prime1*prime2
var pipq = (prime1-1)*(prime2-1)


<!-- ======= 공약수, 역원 구하기========-->
var gcded=pipq;
var p2=epublic;
var x1=1; var y1=0  // 유클리트 알고리즘
var x2=0; var y2=1  // 유클리트 알고리즘


var ii=0;


while(p2!=0)
   {var r1 = (gcded%p2);  // (p-1)(q-1)과 e의 공약수 구하기
    var quot1 = Math.floor(gcded/p2); // 몫
     <!-- =======  유클리트 알고리즘으로 역원 구하기========-->
     if(ii%2 ==0)
        {//x1-=(x2*quot1);    // pipq와 곱하는 값
         y1-=(y2*quot1); }    // epublic와 곱하는 값
      else{//x2-=(x1*quot1);  // pipq와 곱하는 값
           y2-=(y1*quot1);};  // epublic와 곱하는 값
      ii++;
    gcded=p2;                 // 최종 gcded이 공약수
    p2=r1;          
   };


var gcdPhipqe=gcded;               // (e, pipq)=공약수
if(gcded ==1){det1 = "입니다."    // 서로소 판정
}else{det1 = "가 아님! 다른 수를!"
};


if(ii%2 ==0){// xx=x1;
     dd=y1
}else{// xx=x2;
       dd=y2
};                 // 비밀키 dd=epublic의 역원(mod pipq) 최종 결과


if(dd<0){dd+=pipq};  //양수로 만들기


   <!-- ================================================ -->
   <!-- ======== 평문을 RSA암호문으로 바꾸기 =========== -->
   <!-- ======== 문자를 Ascii codes(숫자)로 바꾸기 ===== -->
   <!-- ================================================ -->


<!-- ======== 지수 계산 =========== -->
var edigits= Math.floor(Math.log(epublic)/Math.log(2)); // 2^e  의 자리수
//var ddigits= Math.floor(Math.log(dd)/Math.log(2));    // 2^dd 의 자리수
var ee1 = new Array(edigits+1);   // 복호화 준비
//var dd1 = new Array(ddigits+1);   // 복호화 준비


var ee2=epublic;
for (jj=edigits; jj>-1; jj--)    // 복호화 준비learTextBang[i]^dd(mod pq) 계산시 사용
    {ee1[jj]=Math.floor(ee2/Math.pow(2,jj));
    ee2-=Math.pow(2,jj)*ee1[jj];   }   //이민섭 암호학 p.320 참조


<!-- ===================================== -->
<!-- ============ 복호화 계산 ============== -->
<!-- ===================================== -->
var cipher ="";  // 복호문 숫자 선언
var cipherOut ="";  // 출력용 복호문 숫자 선언
var cipher2 = new Array(lengTextBang);    // 암호화 방
var decript = "";      // 숫자 복호화 방
var decriptText = "";  // 문자 복호화 방


for (i=0; i<lengTextBang; i++){ // 복호 숫자 구하기
 clearTextBang[i] -= 0;             // 정수 문자열을 숫자열로 바꿈
    cipher2[i]=1;
   
 for (jj=edigits; jj>-1; jj--){    // 암호화 clearTextBang[i]^d(mod pq)
//      cipher2[i] =(Math.pow(cipher2[i],2)*Math.pow(clearTextBang[i],ee1[jj]))%pq; // 암호숫자를 복호숫자로
  cipher2[i] =Number( MathRemainder(Multiple(MathPow(String(cipher2[i]),"2"),
                  MathPow(String(clearTextBang[i]),String(ee1[jj])) ) ,String(pq) )); // 암호숫자를 복호숫자로
    };
 
 xleng = String(cipher2[i]).length;
  
 if(xleng < block){       // 자리수 block보다 작으면 block와 같게 하기
  for (var j=0; j<(block-xleng); j++){
   cipher2[i] = "0"+cipher2[i];
  }
 };
    cipherOut+= cipher2[i] + " ";  // 복호 숫자 출력
 cipher += cipher2[i];
};


 for (j=0;j<cipher.length+1;j+=2){
  decript+= cipher.substring(j,j+2)+" ";// 2자리씩 잘라 숫자를 잇기
  decriptText+= String.fromCharCode(parseInt(cipher.substring(j,j+2))+32);// 2자리씩 잘라 숫자를 아스키 문자로 대응
 }


<!-- =========== 걸린 시간 측정하기 ====================== -->
var today0 = new Date()
var lastTime0 = today0.getTime(); // 밀리초 from 1/1/70
time = (lastTime0 - startTime)/1000; // 연산하는데 걸린 시간.
<!-- =================================================== -->
decriptText = trim(decriptText);
if(decriptText)
{
 alert("당신의 패스워드는 [" + decriptText + "] 입니다.");
 self.close();
}
else
{
 alert("정보가 없습니다"); 
 history.go(-1);
}
return;
}
function trim(s) {
  s += ''; // 숫자라도 문자열로 변환
  return s.replace(/^s*|s*$/g, '');
}
<!--


//=======================================================//
// 양측의 필요없는 문자 없애기 프로그램
//=======================================================//
 function Trim(st,xx){  // 문자열(st)에서 좌우측 필요 없는 문자(xx) 없애기
  while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기
  while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
  return st
 }


//=======================================================//
// 좌측의 필요없는 문자 없애기 프로그램
//=======================================================//
 function TrimLeft(st,xx){  // 문자열(st)에서 좌측 필요 없는 문자(xx) 없애기
  while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기(0이 있으면 8진법으로 계산됨)
  return st
 };


//=======================================================//
// 우측의 필요없는 문자 없애기 프로그램
//=======================================================//
 function TrimRight(st,xx){  // 문자열(st)에서 좌측 필요 없는 문자(xx) 없애기
  while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
  return st
 };


//=======================================================//
// 양수끼리 더하기 프로그램
//=======================================================//
function AdditionPlus(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var abMaxlength = Math.max(a.length, b.length);
 var quotA = Math.floor(a.length/15)+1;  // 15자리씩 나눔 2^51 이하의 수로 계산
 var quotB = Math.floor(b.length/15)+1;  // 15자리씩 나눔 2^51 이하의 수로 계산
 var aRemainder = a.length%15; // 15로 나눈 나머지
 var bRemainder = b.length%15; // 15로 나눈 나머지


    var quot = Math.max(quotA, quotB);


 var aa = new Array(quot);
 var bb = new Array(quot);


// ===== 방 배치 시작 ===========================================
 for (var i=0;i<quotA-1;i++){
  aa[i] = TrimLeft(a.substr(15*(quotA-i-2)+aRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
  if (aa[i] == ""){
   aa[i] = 0;
  }else{
   aa[i] = parseInt(aa[i]);
  };
 };  // a의 방배치


 if (aRemainder == 0){ // 자리수가 15의 배수인 경우
  aa[quotA-1] = 0
 }else{
  aa[quotA-1] = parseInt(a.substr(0,aRemainder))
 };


 for (var i=0;i<quotB-1;i++){
  bb[i] = TrimLeft(b.substr(15*(quotB-i-2)+bRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
   if (bb[i] == ""){
    bb[i] = 0;
   }else{
    bb[i] = parseInt(bb[i]);
   };
 };  // b의 방배치


 if (bRemainder == 0){ // 자리수가 15의 배수인 경우
  bb[quotB-1] = 0
 }else{
  bb[quotB-1] = parseInt(b.substr(0,bRemainder))
 };


// ===== 방 배치 완료 ===========================================


 var aADDb = new Array(quot+1); // 더하는 방 번호


 for (i=0;i<=quot;i++){  // 초기화
  aADDb[i]="";
  if (aa[i] == null){aa[i]=0};
  if (bb[i] == null){bb[i]=0};
 };


 for (i=0;i<quot-1;i++){
  if ( (aa[i] + bb[i] +aADDb[i]) <1000000000000000){
   aADDb[i] +=aa[i] + bb[i] ;
  }else{   // 1000000000보다 크면 다음 자리에 1 더하기
   aADDb[i]= (aa[i] + bb[i] + aADDb[i])-1000000000000000;
   aADDb[i+1]= 1 ;
  };
  if (String(aADDb[i]).length <15){ // 15자리가 안되면 0으로 채우기
   var k = 15-String(aADDb[i]).length; // 모자란 자리수
   for(j=0;j<k;j++){
    aADDb[i] = "0"+aADDb[i] ; 
   };
  }
 };
 aADDb[quot-1]= aa[quot-1] + bb[quot-1] + aADDb[quot-1]; // 마지막 블럭 연산


//document.write("a + b = "+(parseInt(a)+ parseInt(b))+"<p>"); // 컴퓨터 계산
//document.write("최종합 = "+aADDb.reverse().join("")+"<p>"); //최종합 결과
return aADDb.reverse().join(""); //최종합 결과
}
//-->


 


//=======================================================//
// 양수끼리 빼기 프로그램
//=======================================================//


function SubtractPlus(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


///========== 큰 수를 a로 놓기 =================
 var a0 = a; // 큰 수 고르기
 var b0 = b; // 큰 수 고르기
 var sign="";// 음수 처리 준비


 if ( a.length == b.length ){ // a,b의 길이가 같은 경우
  var j=0;
  do{
   if (Number(a.substr(j,1)) < Number(b.substr(j,1))){       // b가 큰 경우
    a0 = b; //  큰 수 고르기
    b0 = a; //  큰 수 고르기
    sign="-";
    break
   }else if (Number(a.substr(j,1)) > Number(b.substr(j,1))){ // a가 큰 경우
    break
   }else {                                                   // a, b가 같은 경우
    j+=1
   }
  }while( a.substr(j-1,1) == b.substr(j-1,1) && j < b.length);
 }else if ( a.length < b.length ){ // b가 길은 경우
  a0 = b; //  큰 수 고르기
  b0 = a; //  큰 수 고르기
  sign="-";
 }
///========== 큰 수를 a로 놓기 =================


a = a0;
b = b0;


 var abMaxlength = Math.max(a.length, b.length);
 var quotA = Math.floor(a.length/15)+1;  // 15자리씩 나눔 2^51 이하의 수로 계산
 var quotB = Math.floor(b.length/15)+1;  // 15자리씩 나눔 2^51 이하의 수로 계산
 var aRemainder = a.length%15; // 15로 나눈 나머지
 var bRemainder = b.length%15; // 15로 나눈 나머지


    var quot = Math.max(quotA, quotB);


 var aa = new Array(quot); // 15자리로 나눈 후 a의 방배치
 var bb = new Array(quot); // 15자리로 나눈 후 b의 방배치


// ===== 방 배치 시작 ===========================================
 for (var i=0;i<quotA-1;i++){
  aa[i] = TrimLeft(a.substr(15*(quotA-i-2)+aRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
  if (aa[i] == ""){
   aa[i] = 0;
  }else{
   aa[i] = parseInt(aa[i]);
  };
 };  // a의 방배치


 if (aRemainder == 0){ // 자리수가 15의 배수인 경우
  aa[quotA-1] = 0
 }else{
  aa[quotA-1] = parseInt(a.substr(0,aRemainder))
 };


 for (var i=0;i<quotB-1;i++){
  bb[i] = TrimLeft(b.substr(15*(quotB-i-2)+bRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
   if (bb[i] == ""){
    bb[i] = 0;
   }else{
    bb[i] = parseInt(bb[i]);
   };
 };  // b의 방배치


 if (bRemainder == 0){ // 자리수가 15의 배수인 경우
  bb[quotB-1] = 0
 }else{
  bb[quotB-1] = parseInt(b.substr(0,bRemainder))
 };
// ===== 방 배치 완료 ===========================================


 var aADDb = new Array(quot+1); // 빼는 방 번호


 for (i=0;i<=quot;i++){  // 초기화
  aADDb[i]="";
  if (aa[i] == null){aa[i]=0};
  if (bb[i] == null){bb[i]=0};
 }


 for (var i=0;i<quot-1;i++){
  if ( (aa[i] - bb[i] -aADDb[i]) <0){  // 음수 처리
   aADDb[i] = aa[i] - bb[i] -aADDb[i] +1000000000000000;
   aa[i+1] -= 1 ;
        }else{   // 0보다 작으면 앞 자리에서 1 가져오기
   aADDb[i]= (aa[i] - bb[i] - aADDb[i]);
  };
  if (String(aADDb[i]).length <15){ // 15자리가 안되면 0으로 채우기
   var k = 15-String(aADDb[i]).length; // 모자란 자리수
   for(j=0;j<k;j++){
    aADDb[i] = "0"+aADDb[i] ; 
   };
  }
 }
   aADDb[quot-1]= aa[quot-1] - bb[quot-1] - aADDb[quot-1];


 var lastResult = sign+TrimLeft(aADDb.reverse().join(""),"0"); // 마지막 빼기 결과 좌측 0 제거
 
return lastResult; //최종빼기 결과(부호 붙임)
}



<!--


//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 더하기 프로그램 ////////
///////////////////////////////////////////////
//=======================================================//


function Addition(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var last = ""; // 최종 결과


 if (a.substr(0,1) == "-" && b.substr(0,1) != "-" ){ // a가 음수, b가 양수인 경우
  last = SubtractPlus(b, a.substring(1))
 }else if(a.substr(0,1) != "-" && b.substr(0,1) == "-" ){// a가 양수, b가 음수인 경우
  last = SubtractPlus(a, b.substring(1))
 }else if(a.substr(0,1) == "-" && b.substr(0,1) == "-" ){// a가 음수, b가 음수인 경우
  last = "-"+AdditionPlus(a.substring(1), b.substring(1))
 }else{                                         // a가 양수, b가 양수인 경우
  last = AdditionPlus(a, b)
 }


return last; //최종합 결과
}
//-->


<!--
//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 빼기 프로그램 /////////
///////////////////////////////////////////////
//=======================================================//


function Subtract(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var last = "";
 if (b.substr(0,1) == "-"){ // b가 음수인 경우
  last = Addition(a, b.substring(1))
 }else{                     // b가 양수인 경우
  last = Addition(a, "-"+b)
 }


 return last;          //최종합 결과
}
//-->



//=======================================================//
//////// 양수 곱하기 프로그램 /////////
//=======================================================//


function MultiplePlus(a,b){  // ==== 곱하기 연산 ===


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var abMaxlength = Math.max(a.length, b.length);
 var quotA = Math.floor(a.length/15)+1;  // 15자리씩 나눔 2^51 이하의 수로 계산
 var aRemainder = a.length%15; // 15로 나눈 나머지


    var quot = Math.max(quotA, b.length);


 var aa = new Array(quotA+1);
 var bb = new Array(b.length);



// ===== 방 배치 시작 ===========================================
 for (var i=0;i<quotA-1;i++){
  aa[i] = TrimLeft(a.substr(15*(quotA-i-2)+aRemainder,15),"0"); // 좌측 0 제거(0이 있으면 8진법으로 계산됨)
  if (aa[i] == ""){
   aa[i] = 0;
  }else{
   aa[i] = parseInt(aa[i]);
  };
 };  // a의 방배치


 if (aRemainder == 0){ // 자리수가 15의 배수인 경우
  aa[quotA-1] = 0
 }else{
  aa[quotA-1] = parseInt(a.substr(0,aRemainder))
 };


 for (var i=0;i<b.length;i++){
  bb[i] =  parseInt(b.substr(i,1));
 };  // b의 방배치


 bb = bb.reverse();// 순서 반대로 함


// ===== 방 배치 완료 ===========================================


 


 var aADDb = new Array(b.length); // 곱하는 방 번호
 var aMULTb = new Array(b.length); // 곱하는 방 번호


<!-- ========================================================== -->
<!-- ========= 2중 배열(aADDb[i][j]) 만들기 ===================== -->
<!-- ========================================================== -->
 for (i=0;i<(b.length+1);i++){  // 2중 배열(aADDb[b.length][j]) 만들기 준비
  aADDb[i]="";           // 초기화
  aMULTb[i]="";         // 초기화 ==> 2중 배열 만들때는 필요 없음.


  for (j=0;j<(quotA+1);j++){
   aADDb[i]+=" ";     // 2중 배열 만들기 준비.
  };
  aADDb[i]=aADDb[i].split(' '); // 2중 배열(aADDb[b.length][a.length]) 만들기
 }
<!-- ========================================================== -->
<!-- ========= 2중 배열(aADDb[i][j]) 만들기 끝 ================== -->
<!-- ========================================================== -->



 var digit=""; // 10^n 자리수 맞추기
 for (i=0;i<b.length;i++){
  for (j=0;j<quotA-1;j++){
   if ( (bb[i]*aa[j] + aADDb[i][j]) < 1000000000000000){
    aADDb[i][j] += bb[i]*aa[j];
   }else{   // 1000000000보다 크면 다음 자리에 1000000000자리수 더하기
    aADDb[i][j+1]= Math.floor((bb[i]*aa[j] + aADDb[i][j])/1000000000000000) ; // 10^16자리수
    aADDb[i][j] = (bb[i]*aa[j] + aADDb[i][j]) - aADDb[i][j+1]*1000000000000000;// 1자리수
   };


   if (String(aADDb[i][j]).length <15){ // 15자리가 안되면 0으로 채우기
    var k = 15-String(aADDb[i][j]).length; // 모자란 자리수
    for(var jj=0;jj<k;jj++){
     aADDb[i][j] = "0"+aADDb[i][j] ; 
    };
   };
  aMULTb[i] = aADDb[i][j]+aMULTb[i]; // 한 자리수 곱하기 결과 (분할한 것 합치기)
  };
  aADDb[i][quotA-1] = bb[i]*aa[quotA-1] + aADDb[i][quotA-1]; // 마지막 단계 따로 계산
  aMULTb[i] = aADDb[i][quotA-1]+aMULTb[i]; // 한 자리수 곱하기 결과 (분할한 것 합치기)


  aMULTb[i] += digit; // 자리수 맞추기
  digit +="0";
 }



 var abmultiple="0"; //최종 곱 구하기: 덧셈연산에 대입하기
 for (var i=0;i<b.length;i++){
  abmultiple = AdditionPlus(abmultiple,aMULTb[i]); // 문자숫자로 더하기
 }


 var last = TrimLeft(abmultiple,"0"); ////최종곱 결과
return last;          //최종곱 결과
}


//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 곱하기 프로그램 /////////
///////////////////////////////////////////////
//=======================================================//


function Multiple(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var last = ""; // 최종 결과


 if (a.substr(0,1) == "-" && b.substr(0,1) != "-" ){ // a가 음수, b가 양수인 경우
  last = "-"+MultiplePlus(a.substring(1), b)
 }else if(a.substr(0,1) != "-" && b.substr(0,1) == "-" ){// a가 양수, b가 음수인 경우
  last = "-"+MultiplePlus(a, b.substring(1))
 }else if(a.substr(0,1) == "-" && b.substr(0,1) == "-" ){// a가 음수, b가 음수인 경우
  last = MultiplePlus(a.substring(1), b.substring(1))
 }else{                                         // a가 양수, b가 양수인 경우
  last = MultiplePlus(a, b)
 }


return last; //최종합 결과
}



//=======================================================//
//////// 양수 나누기 프로그램 /////////
//=======================================================//


function DivisionPlus(a,b){  // ==== 나누기 연산 ===


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var digit = 5;  // 소수점 5 이하 자리수(숫자로 바꿈)
// var digit0 = digit; // 출력용


 if (digit == ""){ ; //입력이 없으면 소수점이하 10자리로 계산
  if (a.length-b.length <1){
   digit = 11;
  }else{
   digit = (a.length-b.length+11)
  }
 }else{
  if (a.length-b.length <1){
   digit += 1;
  }else{
   digit += (a.length-b.length+1)
  }
 }



 var quotient = new Array();
 var remainder = new Array();
 remainder[0] = a.substr(0,b.length); // b의 길이 만큼씩 잘라 나누기 해야함.
 quotient[0] = 0 ;  //초기화
 lastQuotient = "0"; // 최종 몫


 for (var j = 0 ; j<digit ; j++){ // 소수점 이하 digit자리까지 계산하는 알고리즘
  remainder[j] = TrimLeft(remainder[j],"0"); // 왼쪽의 0 제거(8진법으로 인식 방지)
  if(remainder[j] == ""){remainder[j] = "0"}; // 자리수 나누기에서 오류 보정


  while (remainder[j].substr(0, 1) != "-" ){  // 각 단계별 몫 구하기
   remainder[j] = TrimLeft(SubtractPlus(remainder[j], b),"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
   quotient[j] += 1 ;


   if(remainder[j] == ""){
    remainder[j] = "0";
    quotient[j] += 1 ;
    break;
   }; // 자리수 나누기에서 오류 보정
  }


  quotient[j+1] = 0 ;


  if (j > a.length-b.length-1){ // a의 길이 만큼 나누기를 한 경우 몫을 0으로 채우기
   var jj = "0";
  }else{
   jj= a.substr(j+b.length,1) // 피젯수가 b의 길이보다 큰 경우 a에서 하나씩 가져옴
  };
  
  if (remainder[j] == "0"){
   remainder[j+1] = TrimLeft(remainder[j]+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
  }else{
   remainder[j+1] = TrimLeft(Addition(remainder[j], b)+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
  };


  if (a.length-b.length <-1 && j==0){  // 완성된 것임
   lastQuotient += "."; // 소수점 인식하기
  }else if(a.length-b.length <-1 && j>0){
   lastQuotient += (quotient[j]-1); // 소수점 인식하기
  }else if(a.length-b.length == -1 && j == 0){
   lastQuotient +="."; // 소수점 인식하기
  }else if(a.length-b.length == -1 && j > 0){
   lastQuotient += (quotient[j]-1); // 소수점 인식하기
  }else if(j == a.length-b.length+1){
   lastQuotient +="."+ (quotient[j]-1); // 소수점 인식하기
  }else{
   lastQuotient +=quotient[j]-1; // 최종 몫
  };
 }



 lastQuotient = Trim(lastQuotient,"0");  // 좌우측의 필요없는 0 없애기
 if(lastQuotient.substr(0,1) ==".") lastQuotient = "0"+lastQuotient; // 맨 앞이 "."이면 앞에 0 추가하기
 if(lastQuotient.substr(lastQuotient.length-1,1)=="."){
  lastQuotient = lastQuotient.substring(0,lastQuotient.length-1); // 마지막이 "."이면 "." 없애기
 }


 var last = lastQuotient; ////최종곱 결과
return last;          //최종곱 결과
}



//=======================================================//
///////////////////////////////////////////////
//////// 양수, 음수가 있는 나누기 프로그램 /////////
///////////////////////////////////////////////
//=======================================================//


function Division(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var last = ""; // 최종 결과


 if (a.substr(0,1) == "-" && b.substr(0,1) != "-" ){ // a가 음수, b가 양수인 경우
  last = "-"+DivisionPlus(a.substring(1), b)
 }else if(a.substr(0,1) != "-" && b.substr(0,1) == "-" ){// a가 양수, b가 음수인 경우
  last = "-"+DivisionPlus(a, b.substring(1))
 }else if(a.substr(0,1) == "-" && b.substr(0,1) == "-" ){// a가 음수, b가 음수인 경우
  last = DivisionPlus(a.substring(1), b.substring(1))
 }else{                                         // a가 양수, b가 양수인 경우
  last = DivisionPlus(a, b)
 }


return last; //최종합 결과
}
//=======================================================//
// 원하는 문자 앞까지 추출하기 함수
//=======================================================//
 function FindChar(st,xx){  // 문자열(st)에서 문자(xx) 찾기
  st=st.substring(0,st.indexOf(xx));  // 좌측에서 xx 앞까지 추출하기
  return st;
 }


//=======================================================//
// 몫 구하기 함수
//=======================================================//
function MathFloor(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var digit = 1;  // 소수점 1 이하 자리수(숫자로 바꿈)


 if (digit == ""){ ; //입력이 없으면 소수점이하 10자리로 계산
  if (a.length-b.length <1){
   digit = 11;
  }else{
   digit = (a.length-b.length+11)
  }
 }else{
  if (a.length-b.length <1){
   digit += 1;
  }else{
   digit += (a.length-b.length+1)
  }
 }


 var quotient = new Array();
 var remainder = new Array();
 remainder[0] = a.substr(0,b.length); // b의 길이 만큼씩 잘라 나누기 해야함.
 quotient[0] = 0 ;  //초기화
 lastQuotient = "0"; // 최종 몫


 for (var j = 0 ; j<digit ; j++){ // 소수점 이하 digit자리까지 계산하는 알고리즘
  remainder[j] = TrimLeft(remainder[j],"0"); // 왼쪽의 0 제거(8진법으로 인식 방지)
  if(remainder[j] == ""){remainder[j] = "0"}; // 자리수 나누기에서 오류 보정


  while (remainder[j].substr(0, 1) != "-" ){  // 각 단계별 몫 구하기
   remainder[j] = TrimLeft(SubtractPlus(remainder[j], b),"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
   quotient[j] += 1 ;


   if(remainder[j] == ""){
    remainder[j] = "0";
    quotient[j] += 1 ;
    break;
   }; // 자리수 나누기에서 오류 보정
  }


//  document.write( "Remainder0= "+ remainder[j] +"<p>") ;
  quotient[j+1] = 0 ;


  if (j > a.length-b.length-1){ // a의 길이 만큼 나누기를 한 경우 몫을 0으로 채우기
   var jj = "0";
  }else{
   jj= a.substr(j+b.length,1) // 피젯수가 b의 길이보다 큰 경우 a에서 하나씩 가져옴
  };
  
  if (remainder[j] == "0"){
   remainder[j+1] = TrimLeft(remainder[j]+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
  }else{
   remainder[j+1] = TrimLeft(Addition(remainder[j], b)+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
  };


  if (a.length-b.length <-1 && j==0){  // 완성된 것임
   lastQuotient += "."; // 소수점 인식하기
  }else if(a.length-b.length <-1 && j>0){
   lastQuotient += (quotient[j]-1); // 소수점 인식하기
  }else if(a.length-b.length == -1 && j == 0){
   lastQuotient +="."; // 소수점 인식하기
  }else if(a.length-b.length == -1 && j > 0){
   lastQuotient += (quotient[j]-1); // 소수점 인식하기
  }else if(j == a.length-b.length+1){
   lastQuotient +="."+ (quotient[j]-1); // 소수점 인식하기
  }else{
   lastQuotient +=quotient[j]-1; // 최종 몫
  };
 }



 function Trim(st,xx){  // 문자열(st)에서 좌우측 필요 없는 문자(xx) 없애기
  while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기
  while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
  return st
 }


 lastQuotient = Trim(lastQuotient,"0");  // 좌우측의 필요없는 0 없애기
 if(lastQuotient.substr(0,1) ==".") lastQuotient = "0"+lastQuotient; // 맨 앞이 "."이면 앞에 0 추가하기
 if(lastQuotient.substr(lastQuotient.length-1,1)=="."){
  lastQuotient = lastQuotient.substring(0,lastQuotient.length-1); // 마지막이 "."이면 "." 없애기
 }


 lastQuotient2 = FindChar(lastQuotient,"."); //// 몫 추출하기
 if (lastQuotient2 == ""){lastQuotient2 = lastQuotient};


 var lastRemainder = Subtract(a,Multiple(lastQuotient2,b)); //// 나머지 추출하기


return lastQuotient2;          //몫 결과
}


//=======================================================//
// 지수 거듭 제곱 함수
//=======================================================//
function MathPow(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var result = "1";
 if (a == "0"){
  result = "0";
 }else if (b == "0"){
  result = "1";
 }else{
  for (var j = 0 ; j<b ; j++){ // 거듭제곱
   result = Multiple(result,a); //
  };
 }
return result;          //몫 결과
}


//=======================================================//
// 나머지 구하기 함수
//=======================================================//
function MathRemainder(a,b){


 a = TrimLeft(a,"0");
 if ( a == ""){a = "0"};
 b = TrimLeft(b,"0");
 if ( b == ""){b = "0"};


 var digit = 1;  // 소수점 1 이하 자리수(숫자로 바꿈)


 if (digit == ""){ ; //입력이 없으면 소수점이하 10자리로 계산
  if (a.length-b.length <1){
   digit = 11;
  }else{
   digit = (a.length-b.length+11)
  }
 }else{
  if (a.length-b.length <1){
   digit += 1;
  }else{
   digit += (a.length-b.length+1)
  }
 }


 var quotient = new Array();
 var remainder = new Array();
 remainder[0] = a.substr(0,b.length); // b의 길이 만큼씩 잘라 나누기 해야함.
 quotient[0] = 0 ;  //초기화
 lastQuotient = "0"; // 최종 몫


 for (var j = 0 ; j<digit ; j++){ // 소수점 이하 digit자리까지 계산하는 알고리즘
  remainder[j] = TrimLeft(remainder[j],"0"); // 왼쪽의 0 제거(8진법으로 인식 방지)
  if(remainder[j] == ""){remainder[j] = "0"}; // 자리수 나누기에서 오류 보정


  while (remainder[j].substr(0, 1) != "-" ){  // 각 단계별 몫 구하기
   remainder[j] = TrimLeft(SubtractPlus(remainder[j], b),"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
   quotient[j] += 1 ;


   if(remainder[j] == ""){
    remainder[j] = "0";
    quotient[j] += 1 ;
    break;
   }; // 자리수 나누기에서 오류 보정
  }


//  document.write( "Remainder0= "+ remainder[j] +"<p>") ;
  quotient[j+1] = 0 ;


  if (j > a.length-b.length-1){ // a의 길이 만큼 나누기를 한 경우 몫을 0으로 채우기
   var jj = "0";
  }else{
   jj= a.substr(j+b.length,1) // 피젯수가 b의 길이보다 큰 경우 a에서 하나씩 가져옴
  };
  
  if (remainder[j] == "0"){
   remainder[j+1] = TrimLeft(remainder[j]+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
  }else{
   remainder[j+1] = TrimLeft(Addition(remainder[j], b)+jj,"0");// 왼쪽의 0 제거(8진법으로 인식 방지)
  };


  if (a.length-b.length <-1 && j==0){  // 완성된 것임
   lastQuotient += "."; // 소수점 인식하기
  }else if(a.length-b.length <-1 && j>0){
   lastQuotient += (quotient[j]-1); // 소수점 인식하기
  }else if(a.length-b.length == -1 && j == 0){
   lastQuotient +="."; // 소수점 인식하기
  }else if(a.length-b.length == -1 && j > 0){
   lastQuotient += (quotient[j]-1); // 소수점 인식하기
  }else if(j == a.length-b.length+1){
   lastQuotient +="."+ (quotient[j]-1); // 소수점 인식하기
  }else{
   lastQuotient +=quotient[j]-1; // 최종 몫
  };
 }



 function Trim(st,xx){  // 문자열(st)에서 좌우측 필요 없는 문자(xx) 없애기
  while(st.indexOf(xx)==0) st=st.substring(1);// 좌측의 필요없는 0 없애기
  while(st.lastIndexOf(xx)==st.length-1) st=st.substring(0,st.length-1);// 우측의 필요없는 0 없애기
  return st
 }


 lastQuotient = Trim(lastQuotient,"0");  // 좌우측의 필요없는 0 없애기
 if(lastQuotient.substr(0,1) ==".") lastQuotient = "0"+lastQuotient; // 맨 앞이 "."이면 앞에 0 추가하기
 if(lastQuotient.substr(lastQuotient.length-1,1)=="."){
  lastQuotient = lastQuotient.substring(0,lastQuotient.length-1); // 마지막이 "."이면 "." 없애기
 }


 lastQuotient2 = FindChar(lastQuotient,"."); //// 몫 추출하기
 if (lastQuotient2 == ""){lastQuotient2 = lastQuotient};


 var lastRemainder = Subtract(a,Multiple(lastQuotient2,b)); //// 나머지 추출하기
 if (lastRemainder == ""){lastRemainder = 0};


return lastRemainder;          //나머지 결과
}


//=======================================================//
// a를 b진법으로 나타내기 함수
//=======================================================//
function MathJinbup(a,b){
 var jinbup = ""; // 진법(mod b)의 결과


 while(a != 0){
  if (Number(MathRemainder(a,b))>9){ // 숫자가 10보다 크면 ab... 문자로 나타내기
   var rem = String.fromCharCode(Number(MathRemainder(a,b))+ 87)
  }else{
   var rem = MathRemainder(a,b)
  };
     jinbup = rem+jinbup;
  a = MathFloor(a,b);
 }
return jinbup;
}
</script>

박영식 (비회원)
    • 글자 크기
[RSA] PHP와 JS활용한 ZB41암호화 전송 및 PW찾기(4) (by 박영식) [RSA] PHP와 JS활용한 ZB41암호화 전송 및 PW찾기(2) (by 박영식)

댓글 달기

박영식
2007.07.08 조회 2358
박영식
2007.06.14 조회 2633
박영식
2007.04.04 조회 5643
박영식
2007.02.16 조회 2443
박영식
2007.02.15 조회 2638
박영식
2006.09.19 조회 1927
박영식
2006.09.14 조회 1973
박영식
2006.09.09 조회 1903
박영식
2006.09.05 조회 1963
박영식
2006.09.01 조회 1575
첨부 (0)
위로