메뉴 건너뛰기

app

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

박영식2007.05.26 15:17조회 수 1822댓글 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찾기(2) (by 박영식) [RSA] PHP와 JS활용한 ZB41암호화 전송 및 PW찾기(4) (by 박영식)

댓글 달기

박영식
2007.04.04 조회 5455
suritam9
2021.12.15 조회 120
suritam9
2013.06.28 조회 2166
이전 1 ... 5 6 7 8 9 10 11 12 13 14다음
첨부 (0)
위로