RSA °ø°³Å° ¾ÏÈ£È ¾Ë°í¸®Áò °ø°³Å° ¾ÏÈ£È ¾Ë°í¸®Áò
¾ÏÈ£ÀÇ ¿ª»ç´Â ·Î¸¶ ½Ã´ë·Î ±îÁö °Å½½·¯¿Ã¶ó°£´Ù°í ÇÏÁö¸¸ ÀÎÅͳÝÀ» ÅëÇØ ¼ö¸¹Àº ±ÝÀ¶ °Å·¡°¡ ÀÌ·ç¾îÁöÀÖ´Â ¿äÁò ó·³ ¾ÏÈ£ÈµÈ Åë½ÅÀÌ ³Î¸® »ç¿ëµÇ´Â ¶§µµ ¾Æ¸¶ ¾øÀ» °ÍÀÌ´Ù. ½ÇÁ¦·Î ¾î¶² ÆÄÀÏ È¤Àº ¹®ÀåÀ» ÀÎÅͳݻóÀÇ ´Ù¸¥ »ç¿ëÀÚ¿¡°Ô ºñ¹Ð¸®¿¡ Àü¼ÛÇÏ·Á°í ÇÒ ¶§ ¾î¶² ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖÀ»±î? °¡Àå ¸ÕÀú »ý°¢ÇÒ ¼ö ÀÖ´Â °ÍÀº ¿ì¸®°¡ ÈçÈ÷ 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°¡ ±âº»À¸·Î µé¾î°¡ ÀÖ½À´Ï´Ù.
// GPL¿¡ ÀǰÅÇÏ¿© http://www.edsko.net/phpsource.php?file=projects/rsa.php
// ¸¦ ¼öÁ¤ÇÏ¿´½À´Ï´Ù. ¼öÁ¤ ³¯Â¥ : 2005/04/29
// 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} == "\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, "\0", 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ºñÆ®·Î È®ÀåÇÒ ¼ö ÀÖ´Ù. ºñÆ®¼ö°¡ ´Ã¾î³¯¼ö·Ï ¾ÏÈ£´Â ±ú±â ¾î·Á¿öÁö´Â ´ë½Å ¼Óµµ°¡ ´À·ÁÁö´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
ÀÛ¼ºÀÚ : ÀÌÇüö
»ý¼ºÀÏ : 2005-04-27 19:33:13
ÃÖÁ¾ ¼öÁ¤ÀÏ : 2005-07-16 13:14:09
Áö±Ý±îÁö 3823 ¹ø ÀÐÈû
Æ®·¢¹é ÁÖ¼Ò http://lucid.astronote.org/tb/1573
ÀÌ ±Û¿¡ ´ëÇÑ ÀǰßÀ» ³²°ÜÁÖ¼¼¿ä.
|
|