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

ÀÌ ±Û¿¡ ´ëÇÑ ÀǰßÀ» ³²°ÜÁÖ¼¼¿ä.