하나의 폼안에서 2개이상의 액션이 필요할때

좋은 방법들이 많이 있군요. 🙂
자바스크립트를 이용한 방법은 일단 제쳐 두고, 하나의 폼 안에 여러개의 submit 버튼을 이용한 경우를 정리해 보겠습니다.

1. submit 버튼의 name을 동일하게 한 경우.





myscript.php:
switch ($_POST[‘action’]) {
case ‘주소록에 기록’:

break;
case ‘스팸목록에 기록’:

break;
case ‘삭제’:

break;
}

2. submit 버튼의 name을 동일하게 한 경우 두번째 예제.





myscript.php:
$keys = array_keys($action);
$action = $action[0];
$match = “/[a-zA-Z0-9]+/”;
if (preg_replace($match, ”, $action)) die (“액션 오류!!”);
if (!file_exists(“./$action.php”)) die (“파일을 찾을 수 없음”);
else include “./$action.php”;

3. 이미지 버튼을 이용할 경우.





myscript.php:
if ($_POST[‘add_address_x’] { … }
else if ($_POST[‘add_spam_x’] { … }
else if ($_POST[‘remove_x’] { … }
else { … }

참고: 이미지 버튼의 경우 $_POST 배열에 [이미지_x] => 20, [이미지_y] => 12 이런식으로 들어가기 때문에 ‘_x’를 이미지 이름 뒤에 붙였습니다.

마지막으로 PHP의 경우 submit 버튼의 name에 직접 key=value&key2=value2 식으로 하던 것을 2번째 예에서 처럼 배열로 넘기는 것이 더 간결하고 효율적일 것 같습니다.

참고로 Perl에서 구현하여 사용하고 있는 것은 다음과 같습니다. 넘어 온 submit 버튼의 name 쿼리를 파싱하여 $IN에 넣어 사용합니다.
$query가 CGI.pm의 개체라고 가정합니다.
my $IN;
for ($query->param) {
for (split /&/) {
/^([^=]+)=(.*)/ or next;
my ($key, $val) = ($query->unescape($1), $query->unescape($2));

$query->param($key => $val);
}
}

foreach ($query->param) {
$IN->{$_} = join “”, $query->param($_);
}

윈도우즈2003서버 설정

Windows Sever 2003 은 서버운영체제 이므로 많은 기능이 비활성화 되어 있어서 설치후에

대부분 불편을 느끼는데 이걸 해결하는 방법을 간단히 적어보니 참조 하세요.

여기에 이 팁은 2003 버전을 손쉽게 사용하도록 해주는 기본팁 입니다.

1.시스템 시작시 ctrl+alt+del 안누르기

실행 – gpedit.msc 입력하고 엔터 나오는창에서

컴퓨터구성- windows 설정 -보안설정 – 로컬정책 – 보안옵션 -대화형로그온 ctrl+alt+del 이걸

더블클릭하거나 속성에서 사용으로 하여주고 확인해준다.

2.로그온시 암호 안물어보기 .

실행 – control userpasswords2 이걸 입력하고 나오는창에서 사용자이름과 암호 사용해야 로그인

할수있음 이앞에 체크를 지우고 확인하면 창이 하나 나오는데 여기에 설치시 설정한 암호를 적고

확인하면 된다.

3. 시스템 종료시 이벤트 추적기 표시 안함.

시작 → 실행 → gpedit.msc → 컴퓨터 구성 → 관리 템플릿 → 시스템 를 선택하고, 우측창에서

시스템 종료 이벤트 추적표시 를 더블클릭하여 “사용 안함” 으로 변경하고 확인한다.

4. Audio 서비스 및 Theme 서비스 활성화하기

Windows Audio 및 Theme 서비스를 활성화 시키기위해서는 서비스관리자를 실행시킨다.시작-실행

→ services.msc 입력하고 엔터

메뉴중 theme 를 더블클릭이나 속성에서 자동으로 해주고 적용하면 시작 버튼이 활성화되니

그걸 클릭해서 실행시킨다. 그럼 Theme 가 활성화되서 사용가능하다.

다음에는사운드를 사용하기위해서 windows audio 를 속성에서 자동으로하고 적용하면 시작버튼이

활성화되니 그걸 클릭해서 적용시킨다.

5. 활성화시킨 Theme 및 Audio 사용하기

제어판-디스플레이-설정-고급-문제해결-하드웨어가속을 최대로한다.

제어판-사운드및오디오장치-볼륨-스프커설정-고급-성능-오디오재생 (최대로한다)

샘플전환속도 (최상으로한다)

그리고 오디오 각종 성능을 최적화한다. 볼륨등 각종 시작음 종료음등..

6. 다이렉트 x 활성화하기

시작-실행에 dxdiag 입력하고 엔터 나오는창에서 디스플레이 이항목에서 가속을 최대로하고

3 가지 3 D 항목이 사용안함으로 되어 있는걸 사용으로 하여준다.

Directdraw 사용으로변경

Direct3d 사용으로 변경

agp 질감가속 사용으로 변경

소리에서 DirectX 기능 에 하드웨어 소리가속을 최대로한다.

7. 시스템 설정

내컴퓨터-속성-고급-시작및복구-설정-디버깅정보쓰기를 작은메모리덤프(64KB)로한다.

내컴퓨터-속성-고급-성능-설정-고급-아래위 두곳에 시스템으로 설정된 프로세서와 메모리

사용계획을 두곳다 프로그램으로 하여준다.

8. 인터넷 옵션 설정

도구-인터넷옵션-보안에서 보안을 보통으로 하여준다. 방법은

제어판-프로그램 추가/제거-windows 구성요소 추가/제거-Internet Exporer 보안강화구성-

이걸클릭후에 체크해제하고 밑에 자세히를클릭해서 연다-그럼 안에 관리자구성 과 기타사용자그룹

이렇게 두개가 보이는데 여기에 체크해제를한다. 그런다음에 확인하고나서 밑에 다음을 클릭

하면 된다. 그러면 잠시 작업후에 비활성화되는데 인터넷옵션 보안에는 보통으로 된다.

9. 메뉴팝업속도를 빠르게 하기

메뉴창이 열리는 속도가 느린것을 감지할수 있는데 빠르게 하는 방법이다.

시작 -> 실행창에서 regedit를 입력하여 레지스트리 편집창을 뛰운후

HKEY_CURRENT_USERControlPaneldesktop에서 MenuShowDelay항목의 값이 기본 400으

로 셋팅되어있느데 이걸 1~8 사이로 하여준다.

10. xp 처럼 디스플레이 사용하기

xp 처럼 바탕화면 아이콘이나 모양을 사용하려면 내컴퓨터-속성-고급-성능-설정-시각효과

여기서 두번째 최적모양으로설정 이걸 선택하고 확인해준다.

11. 스케너나 디지탈 카메라를 사용하려면.

관리도구-서비스-Windows Image Acquisition(WIA) 여기에 속성에서 자동으로 하여준다.

그후에 드라이버를 설치하거나 usb 로 설치하면 된다.

12. 내문서나 미디어플레이어 사용후에 흔적 지우기.

이팁은 기본이 아니지만 서비스 차원에서 제공한다. 익스창이나 미플 이나

내문서등 윈도에서 사용된 각종 흔적을 지우는 법이다.

실행-gpedit.msc 입력하고 엔터 나오는창에서

사용자구성-관리템플릿-작업표시줄및시작매뉴-여기에서 우측창에 다음 두가지를

더블클릭이나 속성에서 사용으로 하여준다. 재부팅후에 작동한다.

종료시 최근에 사용한문서 기록지우기 하고

최근에 사용한 문서 기록을 보관안함. 이두개를 설정하면된다.

RSA 공개키 암호화 알고리즘 – PHP 구현

이형철
http://hc.pe.kr
http://hc.pe.kr/notefiles/8187/RSAKeyGen.exe

이번에 프로젝트 하다가 RSA 공개키 암호화 알고리즘이 필요해서 만들었습니다.
클라이언트 측으로 몰래 보내야할 자료(password 등)가 있을 때 사용하시기 바랍니다.

차례
1. RSA의 소개
2. RSA를 php에서 이용하기 위한 소스 코드(예제 포함)

링크 : RSA 키 pair 생성하는 프로그램(제가 만들었습니다.)
===================================================================
암호의 역사는 로마 시대로 까지 거슬러올라간다고 하지만 인터넷을 통해 수많은 금융 거래가 이루어지있는 요즘 처럼 암호화된 통신이 널리 사용되는 때도 아마 없을 것이다. 실제로 어떤 파일 혹은 문장을 인터넷상의 다른 사용자에게 비밀리에 전송하려고 할 때 어떤 방법을 사용할 수 있을까? 가장 먼저 생각할 수 있는 것은 우리가 흔히 zip 파일을 압축할 때 이용하는 대칭키 알고리즘(혹은 비밀키 알고리즘)이다. 이 방식에서는 암호화하는 측과 암호를 푸는 측이 같은 키를 이용한다. 그러나 인터넷 상의 정보는 언제든지 훔쳐보기가 가능하기 때문에 이 방법은 네트웍상의 통신에 적용하기에 적절하지 않다. 암호(비밀키)를 인터넷을 통해 주고 받는 것이 불가능하기 때문이다.

그리하여 나오게 된 것이 공개키 알고리즘인데 공개키 알고리즘은 암호화 할 때 사용하는 암호와 암호를 풀 때 사용하는 암호가 서로 다르다. 서로 다른 키를 사용함으로서 비밀리에 키를 교환할 필요 자체가 없어졌다. 제 3 자는 암호화키를 알고 있더라도 암호문을 풀 수 없으므로 암호화할 때 사용하는 키는 중간에 누가 가로채도 상관없다. 아니 오히려 사용하기 편하게 잘 보이는 곳에 놔두는 것이 좋을 것이다. 누구든지 이 공개키로 메시지를 암호화해서 보내면 그 메시지를 받는 사람은 숨겨둔 비밀키(혹은 개인키라고도 한다)를 이용하여 이를 풀어볼 수 있다. 얼핏 생각하면 믿기 힘든 이러한 일이 수학의 마술로 인해 가능해 졌다.

공개키 알고리즘의 대표적인 RSA는 1977년에 Ron Rivest, Adi Shamir와 Leonard Adleman에 의해 개발되었다. RSA는 큰 수의 소인수 분해가 매우 어렵다는 사실을 이용한다. 현재 슈퍼컴퓨터와 복잡한 수학적 기법들을 이용해 155자리 합성수가 인수분해 되었는데(1999년 8월) 155를 2진수로 표현하면 512 비트이기 때문에 흔히 RSA에서 사용하는 키는 이보다 길이가 2배 긴 1024비트를 이용한다.

RSA의 원리

집합 {1, 2, … , n-1} 의 원소들 중에서 n 과 서로소의 관계에 있는 원소들의 개수를 φ(n)으로 나타내고 이를 Euler의 φ-function이라고 한다. 특별히 소수 p에 대해서 φ(p) = p-1 이다. 큰 정수 n에 대해 φ(n)의 값을 알기 위해서는 n의 소인수 분해가 필수적이다. 즉, n이 두 소수 p와 q의 곱일 때 φ(n) = (p-1)(q-1)이다. 따라서 소인수 분해 없이 φ(n)을 구하기는 매우 어렵다. Euler의 정리란, 서로 소인 두 양의 정수 a, n에 대해 aφ(n) ≡ 1 (mod n) 이 성립한다는 것이다.

Step 1
두개의 큰 소수 p, q를 선정하여 자신의 비밀열쇠로 한다
Step 2
n = pq인 n을 공개하고 φ(n)과 서로 소인 임의의 정수 e를 선택하여 공개키로 한다.
Step 3
ed ≡ 1 (mod φ(n)) 이 되는 d를 Euclidean Algorithm등으로 계산하여 비밀 열쇠로 한다.
즉, p와 q 그리고 d는 비밀 열쇠로, n과 e는 공개키로 한다.

암호화 Step
평문 M을 공개키 e를 사용하여 Me를 계산한 다음 modular n으로 간단히 한다.
즉 암호문 C는 다음과 같다. C = Me (mod n)

복호화 Step.
암호문 C를 비밀열쇠 d를 이용하여 Cd한 다음 modular n으로 간단히 한다.
다시 평문이 나오게 되는 관계식은 다음과 같다.
Cd ≡ (Me)d = Mtφ(n)+1 = Mφ(n)t M ≡ M (mod n)
여기서 t는 ed ≡ 1 (mod φ(n))에서 유도되는 ed = tφ(n)+1 을 만족하는 정수이다.

실제 사용 예
예를 들어 설명하면 다음과 같다. RSA 암호화 기법에는 private key, public key, modulus가 필요하다.
암호화하는데에는 public key와 modulus, 복호화하는데에는 private key와 modulus가 이용된다.

암호화 : (암호화된문장) = (원래문장)^(public key) mod modulus
암호화 : (원래문장) = (암호화된문장)^(private key) mod modulus

단, 여기서 (원래 문장)의 비트수는 (modulus)의 비트수보다 작아야 한다. 따라서 실제의 메세지를 n보다 작거나 같은 길이로 잘라서 입력해야 한다. 좀 더 구체적인 예를 들기 위해서 이번에는 크기가 매우(!) 작은 수를 이용하여 위의 과정을 따라가 보자
public key = 5
private key = 77
modulus = 119
비밀키를 자신이 소유하고 공개키는 안전한 공개키 디렉토리에 등록한다.
그런 다음 아스키코드 한자리 “a”=65를 전송한다고 해 보자.(아스키코드는 7비트 이내에 있으므로 7비트 짜리 modulus로 전송할 수 있다.)

암호화 : 65^5 mod 119 = 46
복호화 : 46^77 mod 119 = 65

잘 작동한다는 것을 알 수 있다.

키를 생성하기

이러한 RSA 암호화 알고리즘을 이용하기 위해서는 자신만의 공개키, 비밀키, modulus의 쌍을 필요로 한다. 이러한 숫자 쌍을 생성하는 프로그램을 제작해 보았다.(첨부 파일에 있는 RSAKeyGen.exe 실행)

php 소스 코드

php에서 RSA 암호화 알고리즘을 이용할 수 있도록 함수 및 예제를 아래에 첨부하였다.
// PHP의 BCMath 기능을 필요로합니다. –enable-bcmath 옵션을 붙여 컴파일 해야합니다.
// 최신 버젼의 PHP에는 BCMath가 기본으로 들어가 있습니다.

// Calculate (p ^ q) mod r
function pow_mod($p, $q, $r)
{
// Extract powers of 2 from $q
$factors = array();
$div = $q;
$power_of_two = 0;

// BCCOMP_LARGER == 1
while(bccomp($div, “0”) == 1)
{
$rem = bcmod($div, 2);
$div = bcdiv($div, 2);

if($rem) array_push($factors, $power_of_two);
$power_of_two++;
}

// Calculate partial results for each factor, using each partial result as a
// starting point for the next. This depends of the factors of two being
// generated in increasing order.
$partial_results = array();
$part_res = $p;
$idx = 0;
foreach($factors as $factor)
{
while($idx < $factor)
{
$part_res = bcpow($part_res, “2”);
$part_res = bcmod($part_res, $r);

$idx++;
}

array_push($partial_results, $part_res);
}

// Calculate final result
$result = “1”;
foreach($partial_results as $part_res)
{
$result = bcmul($result, $part_res);
$result = bcmod($result, $r);
}

return $result;
}

// Function to add padding to a decrypted string
// We need to know if this is a private or a public key operation
function add_PKCS1_padding($data, $isPublicKey, $blocksize)
{
$pad_length = $blocksize – 3 – strlen($data);
if($isPublicKey)
{
$block_type = “x02”;
$padding = “”;
for($i = 0; $i < $pad_length; $i++)
{
$rnd = mt_rand(1, 255);
$padding .= chr($rnd);
}
}
else
{
$block_type = “x01”;
$padding = str_repeat(“xFF”, $pad_length);
}

return “x00” . $block_type . $padding . “x00” . $data;
}

// Remove padding from a decrypted string
function remove_PKCS1_padding($data, $blocksize)
{
assert(strlen($data) == $blocksize);
$data = substr($data, 1);

// We cannot deal with block type 0
if($data{0} == “”)
die(“Block type 0 not implemented.”);

// Then the block type must be 1 or 2
assert(($data{0} == “x01”) || ($data{0} == “x02”));

// Remove the padding
$offset = strpos($data, “”, 1);
return substr($data, $offset + 1);
}

function hex_to_number($data)
{
$len = strlen($data);
$result = “0”;
for($i = 0; $i < $len - 1; $i++)
{
$result = bcadd($result, hexdec($data{$i}));
$result = bcmul($result, 16);
}
$result = bcadd($result, hexdec($data{$len-1}));
return $result;
}

// Convert binary data to a decimal number
function binary_to_number($data)
{
$base = “256”;
$radix = “1”;
$result = “0”;
for($i = strlen($data) – 1; $i >= 0; $i–)
{
$digit = ord($data{$i});
$part_res = bcmul($digit, $radix);
$result = bcadd($result, $part_res);
$radix = bcmul($radix, $base);
}
return $result;
}

// Convert a number back into binary form
function number_to_binary($number, $blocksize)
{
$base = “256”;
$result = “”;
$div = $number;
while($div > 0)
{
$mod = bcmod($div, $base);
$div = bcdiv($div, $base);
$result = chr($mod) . $result;
}
return str_pad($result, $blocksize, “x00”, STR_PAD_LEFT);
}

function rsa_encrypt($message, $public_key, $modulus, $keylength)
{
$padded = add_PKCS1_padding($message, true, $keylength / 8);
$number = binary_to_number($padded);
$encrypted = pow_mod($number, $public_key, $modulus);
return $encrypted;
}

function rsa_decrypt($message, $private_key, $modulus, $keylength)
{
$decrypted = pow_mod($message, $private_key, $modulus);
$result = number_to_binary($decrypted, $keylength / 8);
return remove_PKCS1_padding($result, $keylength / 8);
}

$public_key = hex_to_number(“9E649FF1”);
$private_key = hex_to_number(“7C0732C4379EDE1FB6E6CF2E7B262B41”);
$modulus = hex_to_number(“95C3BE09B678F8BD55F859CC24B4797B”);

$enc = rsa_encrypt(“메롱 약오르지롱~”, $public_key, $modulus, 128);
echo rsa_decrypt($enc, $private_key, $modulus, 128);
?>

위의 예제에서는 128 비트 암호화를 이용하였으나 충분히 512 비트 1024비트로 확장할 수 있다. 비트수가 늘어날수록 암호는 깨기 어려워지는 대신 속도가 느려지는 단점이 있다.

HTML 소스입력 전용 textarea




이하 HTML 내용은 미리보기를 통해서 소스보기 하세요 ^^

try catch?? js ???

송효진

php5 에 Exception 이라는 try catch 구문이 있습니다.
하지만 단순히 try { } catch(e) { } 로 사용할 수가 없네요.
클래스를 만들어서 catch 쪽으로 throw 해야 하는것 같군요.
실제적인 ‘감지’ 기능을 못하는것 같습니다.

그래서 ‘감지’가 가능한 함수를 제작했습니다.

include ‘debug.inc’;
SHJTry([감지에러레벨]);
코드
if(false !== ($err = SHJCatch())) {
에러시 코드
}

로 사용하면 됩니다.

debug.inc
/* Debug */
if(!isset($_DEBUG)) {
$_DEBUG = false;
}

$_TRYCATCH = false;
$_ERROR = false;

function SHJErrorHandler($errno, $errstr, $errfile, $errline)
{
global $_DEBUG, $_TRYCATCH, $_ERROR;
$errname = array(E_ERROR => ‘ERROR’, E_WARNING => ‘WARNING’, E_NOTICE => ‘NOTICE’);

switch($errno) {
case E_ERROR:
case E_WARNING:
if($errstr == ‘Division by zero’) {
break;
}
case E_NOTICE:
if($_TRYCATCH & $errno) {
$_ERROR[‘no’] = $errno;
$_ERROR[‘str’] = $errstr;
$_TRYCATCH = false;
} else {
echo “

<br /> &#8220;;<br /> echo $errname[$errno].&#8217; : &#8216;.$errstr.&#8217; : &#8216;.$errfile.&#8217; : &#8216;.$errline.&#8221;<br /> &#8220;;<br /> if($_DEBUG) {<br /> print_r(debug_backtrace());<br /> }<br /> echo &#8220;<br /> “;
if($_DEBUG) {
exit;
}
}
}
}

function SHJTry($error_level = E_ALL)
{
global $_TRYCATCH;
$_TRYCATCH = $error_level;
}

function SHJCatch()
{
global $_TRYCATCH, $_ERROR;

$_TRYCATCH = false;

if(false !== $_ERROR) {
$err = $_ERROR;
$_ERROR = false;
return $err;
}

return false;
}

error_reporting(E_ALL);
set_error_handler(‘SHJErrorHandler’);

?>

test.php
include_once ‘func.inc’;
include_once “debug.inc”;

SHJTry();
$a = $b;
if(false !== ($err = SHJCatch())) {
echo ‘$a = $b 가 실패했습니다.
‘;
$b = ‘a’;
$a = $b;
echo ‘$b 에 a 를 넣고 $a 에 넣었습니다.
‘;
}

SHJTry();
$a = $b;
if(false !== ($err = SHJCatch())) {
echo ‘$a = $b 가 실패했습니다.
‘;
$b = ‘b’;
$a = $b;
echo ‘$b 에 b 를 넣고 $a 에 넣었습니다.
‘;
}

$a = $c;

?>