ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
HTML º¯È¯¹®¼
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<article lang="ko">
<!-- -->
<!-- ¹®¼ Á¤º¸ -->
<!-- -->
<articleinfo>
<title>/dev/random À» ÀÌ¿ëÇÑ ·£´ý°ª »ý¼º</title>
<author>
<surname>À± »ó¹è</surname>
<affiliation>
<address>
<email>dreamyun@yahoo.co.kr</email>
</address>
</affiliation>
</author>
<revhistory>
<revision>
<revnumber>1.0</revnumber>
<date>2004³â 1¿ù 28ÀÏ 19½Ã</date>
<revremark>/dev/random ÀåÄ¡ ³ëÀÌÁî ¼öÁý ¹®Á¦Á¡</revremark>
</revision>
<revision>
<revnumber>0.9</revnumber>
<date>2003³â 2¿ù 24ÀÏ 22½Ã</date>
<revremark>¼Ö¶ó¸®½º¿¡¼ /dev/random ¹®ÀÚÀåÄ¡»ý¼º</revremark>
</revision>
<revision>
<revnumber>0.8</revnumber>
<date>2003³â 2¿ù 9ÀÏ 21½Ã</date>
<revremark>¹®¼ ÀÛ¼º</revremark>
</revision>
</revhistory>
</articleinfo>
<!-- -->
<!-- ¼½¼Ç ½ÃÀÛ -->
<!-- -->
<section>
<title>¼Ò°³</title>
<para>
À̹ø±ÛÀº ¸®´ª½º ½Ã½ºÅÛ¿¡¼ Á¦°øÇÏ´Â ¹®ÀÚÀåÄ¡(character devices)¸¦
ÀÌ¿ëÇÑ ·£´ý°ªÀ» ¾ò¾î³»´Â ¹æ¹ý¿¡ ´ëÇØ¼ ´ã°í ÀÖ´Ù.
Linux kernel 2.4.x ȯ°æ¿¡¼¸¸ Å×½ºÆ®µÇ¾úÀ¸³ª, Kernel 2.2.x ¿¡¼µµ
µ¿ÀÏÇÏ°Ô ÀÛµ¿µÉ°ÍÀ¸·Î »ý°¢µÈ´Ù.
Solaris ÀÇ °æ¿ì 2.8 ¹öÀüÀÌÈÄ·Î ÆÐÄ¡¸¦ ÅëÇØ¼ /dev/random À»
Áö¿øÇϴ°ɷΠµÇ¾îÀÖ´Ù. ´Ù¸¥ Unix µéµµ ´ëºÎºÐ Áö¿øÇÏÁö¸¸
¹öÁ¯¿¡ µû¶ó¼ Áö¿ø¿©ºÎ°¡ °áÁ¤µÉ°ÍÀÌ´Ù.
</para>
</section>
<section>
<title>RANDOM °ª ¸¸µé±â</title>
<section>
<title>¿Ö RANDOM°ªÀÌ Áß¿äÇѰ¡</title>
<para>
random ÀÇ Àǹ̰¡ "ÀÓÀÇÀÇ", "ÀÏÁ¤Ä¡ ¾Ê´Â"ÀÇ ¶æÀ» °¡Áø´Ù´Â
°ÍÀº ´©±¸µçÁö ¾Ë°í ÀÖÀ»°ÍÀÌ´Ù. °¡Àå °£´ÜÇÑ ·£´ý°ªÀÇ ¿¹´Â
ÁÖ»çÀ§°¡ ´øÁ®Áú°æ¿ì ³ª¿À´Â ´«ÀÇ ¼ö °¡ µÉ°ÍÀ̸ç,
´øÁö´Â »ç¶÷ÀÌ ¾Æ¹« »ý°¢¾øÀÌ ´øÁú°æ¿ì "ÀÓÀÇÀÇ" °ªÀÌ ³ª¿À°Ô
µÉ°ÍÀÌ´Ù.
</para>
<para>
ÀÌ "ÀÓÀÇÀÇ" °ªÀº ÀÏ»ó»ýȰ¿¡¼ ÀÚÁÖ »ç¿ëµÇ¸ç, ƯÈ÷ "º¸¾È"À»
ÇÊ¿ä·Î Çϴ°÷¿¡¼ ´õ¿í Áß¿äÇÏ°Ô ´Ù·ç¾îÁø´Ù.
±Ý°íÀÇ ¹®À» ¿±â À§ÇÑ 6ÀÚ¸®ÀÇ ¼ýÀÚ¸¦ Á¶ÇÕÇÑ´Ù°í
ÇßÀ»¶§, Ä«µå¿¡¼ Çö±Ý¼ºñ½ºµîÀ» ¼ºñ½º¹Þ±â À§ÇØ »ç¿ëÇÏ´Â
4ÀÚ¸® ¼ýÀÚÀÇ Á¶ÇÕµî "ÀÓÀÌÀÇ" °ªÀÌ »ç¿ëµÇ¾î¾ß ÇÒ°ÍÀÌ´Ù.
ÈçÈ÷ ÀÌ·¯ÇÑ ¼ýÀÚÁ¶ÇÕÀ» ¸¸µé¶§ °¡Àå ¹®Á¦½Ã µÇ´Â°Ô, "ÀÓÀÇÀÇ" °ªÀ»
»ç¿ëÇÏÁö ¾Ê°í ¼ýÀÚÁ¶ÇÕÀ» ¸¸µç´Ù´Â Á¡ÀÌ´Ù. Àڱ⠻ýÀÏÀ̶óµçÁö,
¾Æ´Â »ç¶÷ÀÇ ÀüȹøÈ£µîÀÌ ´ëÇ¥ÀûÀÎ ¿¹·Î, ÀÌ·± °ªµéÀº
"ÀÓÀÇÀÇ"°ªÀÌ ¾Æ´Ï´Ù. ÀÓÀÇÀÇ °ªÀÌ ¾Æ´Ï¶õ ¶æÀº À¯Ãß°¡ °¡´ÉÇÔÀ»
¶æÇϸç, À¯Ãß°¡ °¡´ÉÇÏ´Ù´Â °ÍÀº ±×¸¸Å ÇêÁ¡ÀÌ ¸¹¾ÆÁú¼ö
ÀÖÀ½À» ¶æÇÑ´Ù.
</para>
<para>
ÄÄÇ»ÆÃ ȯ°æ¿¡¼µµ ÀÌ·¯ÇÑ "ÀÓÀÇÀÇ"°ª À» ¼±ÅÃÇÒ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
¼±ÅÃµÈ ÀÓÀÇÀÇ °ªÀº ¿©·¯°¡Áö ¿ëµµ·Î »ç¿ëµÉ°ÍÀε¥, ´ëÇ¥ÀûÀ¸·Î
»ç¿ëÇÒ¼ö ÀÖ´Â°Ô »ç¿ëÀÚ È®ÀÎÀ» À§ÇÑ "password" ¿Í
SSL °ú °°Àº ¶óÀ̺귯¸®µî¿¡¼ ¾ÏÈ£È¹× º¹È£È¸¦ À§ÇÑ key°ªµîÀÇ
Á¦ÀÛÀÏ °ÍÀÌ´Ù.
</para>
<para>
ÀÌ·¯ÇÑ "ÀÓÀÇÀÇ"°ªµéÀº ´ç¿¬ÇÏÁö¸¸ ÃÖ´ëÇÑ "ÀÓÀÇÀÇ"°ªÀ¸·Î½á,
°¡´ÉÇÑ À¯Ãߵɼö ¾ø´Â °ªÀÌ µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù.
¸¸¾à ¿ì¸®°¡ "ÀÓÀÇÀÇ"°ª À» ¾ò±â À§ÇÑ ¾î¶² ÇÔ¼ö¸¦ ¸¸µé¾ú°í,
ÀÌ ÇÔ¼ö¸¦ ÅëÇØ¼ 1-9999 »çÀÌÀÇ ÀÓÀÇÀÇ °ªÀ» ¾ò¾î³»·Á°í Çϴµ¥,
ÇÔ¼ö¸¦ »ç¿ëÇß´õ´Ï 5000 - 6000 »çÀÌÀÇ °ªÀÌ ´Ù¸¥ °ªº¸´Ù
Ưº°È÷ ¸¹ÀÌ ³ª¿Â´Ù¸é, ÀÌ ÇÔ¼ö´Â ¹ÏÀ»¼ö ¾ø´Â "°áÇÔÀÌ ÀÖ´Â"
ÇÔ¼ö°¡ µÉ°ÍÀ̸ç, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¸¹Àº ÇÁ·Î±×·¥Àº
º¸¾È °áÇÔÀ» °¡Áö°Ô µÉ°ÍÀÌ´Ù. ÀÌ»óÀûÀ¸·Î °¢°¢ÀÇ °ªÀÌ ¼±ÅÃµÉ È®·üÀº
¸ðµÎ µ¿ÀÏ(1/°ªÀǹüÀ§)ÇØ¾ß ÇÒ°ÍÀÌ´Ù-´Ù¸¥¸»·Î Ç¥ÁØÆíÂ÷ 0-.
</para>
</section>
<section>
<title>Ç¥ÁØ C random ÇÔ¼ö</title>
<para>
Ç¥ÁØ C ¿¡¼´Â ·£´ý°ªÀÇ °è»êÀ» À§Çؼ random()¿Í srandom() µÎ°³ÀÇ
ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
<screen>
#include <stdlib.h>
long random(void);
void srandom(unsigned int seed);
</screen>
srandom ÇÔ¼ö´Â random seed °ªÀ» ¸¸µé±â À§Çؼ »ç¿ëµÇ¸ç,
random Àº ¸¸µé¾îÁø random seed °ªÀ» ÀÌ¿ëÇØ¼
ÀÏ·ÃÀÇ ·£´ý°ªÀ» ¹ß»ý½ÃŲ´Ù. ÀÌ ¸»Àº randomÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼
¹ß»ýµÇ´Â ·£´ý°ªÀº srandom ¿¡ ÀÇÁ¸ÀûÀÓÀ» ¶æÇϸç, ½ÇÁ¦ °°Àº
random seed ¸¦ ÀÌ¿ëÇØ¼ random ÇÔ¼ö¸¦ µ¹¸±°æ¿ì
¾ðÁ¦³ª µ¿ÀÏÇÑ ÀÏ·ÃÀÇ ·£´ý°ªÀ» ¾ò°Ô µÈ´Ù.
</para>
<para>
srandom ¿¡¼ÀÇ random seed ´Â ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁö´Â
<emphasis>seed</emphasis>¿¡ ÀÇÇØ¼ »ý¼ºµÈ´Ù.
</para>
<para>
random ÇÔ¼ö°¡ srandom ¿¡¼ ¸¸µé¾î³»´Â random seed ¿¡ ÀÇÇØ¼
·£´ý°ªÀ» ¸¸µé¾î³½´Ù´Â °ÍÀº ±×¸® ÁÁÁö ¾ÊÀº ¾ÆÀ̵ð¾î¶ó°í »ý°¢µÈ´Ù.
¿Ö³ÄÇϸé seed ¿¡ ÀÓÀÇÀÇ int °ªÀ» ÇÒ´çÇÑ´Ù´Â°Ô »ý°¢Ã³·³ ½¬¿î°Ô
¾Æ´Ï±â ¶§¹®À̸ç(º¸ÅëÀº ÄÄÇ»ÅÍÀÇ ½Ã°£°ªÀ» »ç¿ëÇÑ´Ù), ÀÌ·¯ÇÑ
°ªÀº À¯Ãߵɼö Àֱ⠶§¹®ÀÌ´Ù. ±âº»ÀûÀ¸·Î µ¿ÀÏÇÑ seed °ªÀ»
ÀÌ¿ëÇÒ°æ¿ì µ¿ÀÏÇÑ ÀÏ·ÃÀÇ ·£´ý°ªÀ» ¾òÀ»¼ö Àֱ⠶§¹®ÀÌ´Ù.
</para>
<para>
¶ÇÇÑ random À¸·Î »ý¼ºµÇ´Â ·£´ý°ªÀÇ ¹üÀ§´Â
16*((2**31)-1) ÀÌ´Ù. ¾ð¶æº¸¸é ¸Å¿ì Å«¼ýÀÚÀÎ°Í °°´Ù.
±×·¯³ª ÃÖ±Ù ssl µî¿¡¼ key ÀÇ Å©±â°¡ 128bit ÀΰÍÀ» °¨¾ÈÇϸé
³Ê¹« ÀÛÀº ¹üÀ§ÀÇ ·£´ý°ª¸¸À» ¾ò¾î¿Ã¼ö ÀÖ¾î¼, ÇöÀç ÄÄÇ»ÆÃ ȯ°æÀÌ
¿ä±¸ÇÏ´Â ¼öÁØ¿¡ Å©°Ô ¹Ì´ÞµÇ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
</para>
<para>
Áï ±×¸® º¹ÀâÇϰųª Áß¿äÇÏÁö ¾ÊÀº ¾îÇø®ÄÉÀ̼ǿ¡¼ÀÇ
·£´ý°ªÀ» ¸¸µé±â À§Çؼ´Â °£´ÜÇÏ°Ô »ç¿ë°¡´ÉÇÏÁö¸¸, ±×·¸Áö ¾ÊÀº
½ÇÁ¦ ¼ºñ½ºÈ¯°æ¿¡¼ »ç¿ëÇϱ⿡´Â ºÎÁ·ÇÑÁ¡ÀÌ ÀÖ´Ù.
</para>
<section>
<title>¼º´É Å×½ºÆ®</title>
<para>
ÀÏ´Ü random seed ¸¦ Á¦¿ÜÇÏ°í »ý°¢ÇÑ´Ù¸é,
·£´ý°ªÀº Á¤¸» ·£´ýÇÏ°Ô ³ª¿Í¾ß ÇÑ´Ù.
¿¹¸¦µé¾î 1-100 ±îÁöÀÇ ¹üÀ§¿¡¼ ·£´ý°ªÀ» ÃßÃâÇϰíÀÚ ÇßÀ»¶§
À̰ÍÀ» 100000¹ø µ¹¸®¸é 1-100 »çÀÌÀÇ °¢°¢ÀÇ °ªÀÌ
°ÅÀÇ ºñ½ÁÇÑ È½¼ö·Î ¼±ÅõǾîÁ®¾ß ÇÒ°ÍÀÌ´Ù. ¾à°£´õ
¸¹ÀÌ ¼±Åõǰųª ±×·¸Áö ¾ÊÀº
·£´ý°ªÀÌ ÀÖ°ÚÁö¸¸ ´ëÃæ 1000 Á¤µµ¿¡¼ ¼±ÅõǾîÁ®¾ß ÇÒ°ÍÀ̸ç,
ÀÌ ¿ÀÂ÷ ÆøÀÌ ÀÛÀ»¼ö·Ï ¼º´ÉÀÌ ÁÁÀº ·£´ý ÇÔ¼ö¶ó°í ÇÒ¼ö ÀÖ´Ù.
</para>
<para>
º¸Åë ÀÌ·¯ÇÑ Åë°è¼öÄ¡¿¡¼ °¢°¢ÀÇ °üÃø°ªÀÌ Æò±Õ¿¡¼
¶³¾îÁø Á¤º¸¸¦ °¡Áö°í ¾ó¸¶³ª ¹Ù¶÷Á÷ÇÏ°Ô ºÐÆ÷µÇ¾î ÀÖ´ÂÁö¸¦
ÆÇ´ÜÇÏ°Ô µÇ´Âµ¥, À̸¦ Ç¥ÁØÆíÂ÷¶ó°í ÇÑ´Ù.
¿©±â¿¡¼´Â random ÇÔ¼öÀÇ ¼º´ÉÀ» ¾Ë¾Æº¸±â À§Çؼ Ç¥ÁØÆíÂ÷¸¦
±¸Çϰí À̸¦ ±×·¡ÇÁ·Î È®ÀÎÇØº¸µµ·Ï ÇϰڴÙ(Åë°è °è»ê°ªÀº
¼ýÀÚº¸´Ù´Â ¾Æ¹«·¡µµ ±×¸²ÀÌ ÀÌÇØÇϱⰡ ½±´Ù).
</para>
<para>
ÀÌ·¯ÇÑ Ç¥ÁØÆíÂ÷¸¦ ±¸Çϱâ À§Çؼ °£´ÜÇÑ Å×½ºÆ®¿ë Äڵ带
¸¸µé°ÍÀÌ´Ù. ÀÌ ÄÚµå´Â srandom À» ÀÌ¿ëÇØ¼ random seed ¸¦
¸¸µé°í, ÀÌ random seed ¸¦ ÅëÇØ¼ random À» 100000¹ø
µ¹¸®°Ô µÉ°ÍÀÌ´Ù. ·£´ý°ªÀÇ ¹üÀ§´Â 1¿¡¼ 100 »çÀ̰¡ µÉ°ÍÀ̸ç,
°¢ °üÃø°ªÀÌ ¸î¹ø¾¿ Ãâ·ÂµÇ´ÂÁö¸¦ È®ÀÎÇϰí, À̰ÍÀ»
ÀÌ¿ëÇØ¼ Ç¥ÁØÆíÂ÷¸¦ ±¸Çϰí, ±×·¡ÇÁ¸¦ ¸¸µé°ÍÀÌ´Ù.
Âü°í·Î Ç¥ÁØÆíÂ÷¸¦ ±¸ÇÏ´Â ÀϹÝÀûÀÎ °ø½ÄÀº ´ÙÀ½°ú °°´Ù.
<figure>
<title>Ç¥ÁØÆíÂ÷ °ø½Ä</title>
<graphic fileref="http://www.joinc.co.kr/albums/album01/abs.gif">
</figure>
</para>
<para>
´ÙÀ½Àº Å×½ºÆ®¸¦ À§ÇÑ ÄÚµåÀÌ´Ù.
</para>
<para>
<emphasis>¿¹Á¦ : random_test.c</emphasis>
<screen>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
struct mdata
{
int count;
};
int main()
{
int i = 0;
struct mdata mydata[101];
int sum = 0;
int avg = 0;
int dosu = 0;
int dosu_p = 0;
memset((void *)&mydata, 0x00, sizeof(struct mdata)*101);
// srandom(100);
// 100000¹øµ¿¾È 0-99 »çÀÌÀÇ ·£´ý°ªÀ» ¾ò¾î¿Â´Ù.
// ¾ò¾î¿Â ·£´ý°ªÀº counting µÈ´Ù.
while( i < 100000)
{
mydata[random()%100].count++;
i++;
}
i = 0;
// Ä«¿îÆÃµÈ ·£´ý°ªÀ» ÀÌ¿ëÇØ¼
// Æò±Õ,ÇÕ,Ç¥ÁØÆíÂ÷¸¦ ±¸Çس½´Ù.
while (i < 100)
{
sum += mydata[i].count;
printf("%d %d\n", i, mydata[i].count);
i++;
}
avg = sum/100;
printf("Æò±Õ : %d\n", avg);
printf("ÇÕ : %d\n", sum);
sum = 0;
i = 0;
while (i < 100)
{
sum += (mydata[i].count - avg)*(mydata[i].count - avg);
i++;
}
// sqrt(sum/100) À» Çϸé Ç¥ÁØÆíÂ÷°¡
// ³ª¿Â´Ù.
printf("%d\n", sum/100);
}
</screen>
À§ÀÇ ½ÇÇà°á°ú¸¦ º¸¸é Ç¥ÁØÆíÂ÷´Â ´ë·« 36 Á¤µµ°¡ ³ª¿Â´Ù.
À̸»Àº Æò±Õ°ªÀÎ 1000 ¿¡¼ ´ë·« 36Á¤µµÀÇ ¹üÀ§³»¿¡ ¸ðµç
°üÃø°ªÀÌ À§Ä¡ÇÔÀ» ¶æÇÑ´Ù.
±¦ÂúÀº ¼º´ÉÀ» º¸¿©ÁØ´Ù´Â°É ¾Ë¼ö ÀÖ´Ù.
¾Æ·¡´Â ½ÇÇà°á°úÀÌ´Ù.
<screen>
96 1012
97 992
98 970
99 1008
Æò±Õ : 1000
ÇÕ : 100000
1303
</screen>
¸¶Áö¸· Ãâ·Â°ªÀÎ 1303 ¿¡ sqrt ¿¬»êÀ» ÇØÁÖ¸é Ç¥ÁØÆíÂ÷¸¦ ±¸ÇÒ¼ö
ÀÖ´Ù.
</para>
<para>
´ÙÀ½Àº À§ÀÇ Äڵ带 µ¹·Á¼ ³ª¿Â °á°ú¸¦
±×·¡ÇÁ·Î ³ªÅ¸³½°ÍÀε¥, Æò±Õ°ªÀÎ 1000 ºÎ±Ù¿¡ ´ëºÎºÐ À§Ä¡Çϰí
ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.
ÀÌ ±×·¡ÇÁ´Â gnuplot ¸¦ ÀÌ¿ëÇØ¼ ¸¸µé¾îÁ³´Ù.
<figure>
<title>random ¼º´ÉÅ×½ºÆ® °á°ú</title>
<graphic fileref="http://www.joinc.co.kr/albums/album01/abr.gif">
</figure>
random.dat ´Â srandom ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾ÊÀº »óÅ¿¡¼
±âº» random seed ¸¦ ÀÌ¿ëÇØ¼ ¸¸µé¾îÁø °ªÀ̸ç,
random2.dat ´Â srandom À» 100 À¸·Î ÇÑ´ÙÀ½¿¡ ¸¸µé¾îÁø
°ªÀÌ´Ù.
</para>
</section>
</section>
<section id="prob">
<title>/dev/random ÀÇ ÀÌ¿ë</title>
<para>
Unix ¿¡¼´Â Á»´õ ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.
/dev/random À̶ó´Â ¹®ÀÚÀåÄ¡¸¦ ÅëÇÑ ·£´ý°ª°¡Á®¿À±â°¡ ÀÌ ¹æ¹ýÀÌ´Ù.
</para>
<para>
ÀÌ ¹®ÀÚÀåÄ¡´Â Ä¿³Î¿¡¼ Á¦°øÇϴµ¥, int ÇüÀÇ °ªÀ» ÀÌ¿ëÇØ¼ random seed ¸¦
»ý¼ºÇس»´Â random ÇÔ¼ö ¿Í´Â ´Þ¸® ´Ù¸¥ ÀåÄ¡µå¶óÀ̹ö¿Í ¿£Æ®·ÎÇÇÇ®¾ÈÀÇ ´Ù¸¥ ¼Ò½º
µé·Î ºÎÅÍ ³ëÀÌÁ ¸ðÀ¸°í ÀÌ·¯ÇÑ ³ëÀÌÁî¿Í ÀåÄ¡µå¶óÀ̹ö¿¡ °É¸®´Â ÀÎÅÍ·´Æ®½Ã°£
°£°ÝµîÀ» ÀÌ¿ëÇØ¼ ³¼ö¸¦ »ý¼º½ÃŲ´Ù.
</para>
<para>
°£´ÜÈ÷ »ý°¢Çؼ Űº¸µå, ¸¶¿ì½º, µð½ºÅ© ȤÀº ³»ºÎÀûÀ¸·Î ¹ß»ýµÇ´Â ´Ù¸¥
ÀÎÅÍ·´Æ®µîÀ» ÀÌ¿ëÇØ¼ ³¼ö¸¦ ¹ß»ý½ÃŲ´Ù°í º¸¸é µÈ´Ù.
À̵é ÀÎÅÍ·´Æ® °ªµîÀº ¿¹ÃøÇϱⰡ ¸Å¿ì Èûµé±â ¶§¹®¿¡ ±Ùº»ÀûÀ¸·Î random ÇÔ¼ö¸¦
ÀÌ¿ëÇϴ°ͺ¸´Ù ¸Å¿ì ¾ÈÀüÇÏ°Ô ·£´ý°ªÀ» »ý¼ºÇÒ¼ö°¡ ÀÖ´Ù. ¶ÇÇÑ
³¼öÀÇ ¹üÀ§¸¦ ¸Å¿ì Å©°Ô ÀâÀ»¼ö Àֱ⠶§¹®¿¡, 128bit Å©±â¸¦ ±âº»À¸·Î »ç¿ëÇÏ´Â
Áö±ÝÀÇ ÄÄÇ»ÆÃ ȯ°æ¿¡ À¯¿ëÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖ´Ù
</para>
<para>
½ÇÁ¦ openssl °ú °°Àº ¶óÀ̺귯¸®µîÀº ¾ÏÈ£ÈµÈ keyÀÇ »ý¼ºÀ» À§Çؼ /dev/random
À» »ç¿ëÇÑ´Ù.
´ÙÀ½Àº 128bit Å©±âÀÇ ³¼ö¸¦ »ý¼ºÇÏ´Â °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.
</para>
<para>
<emphasis>¿¹Á¦ : dev_mem.c</emphasis>
<screen>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int i, fd;
char key[16];
if ((fd = open("/dev/random", O_RDONLY)) == -1)
{
perror("open error");
exit(1);
}
if ((read(fd, key, 16)) == -1)
{
perror("read error");
exit(1);
}
for (i = 0; i < 16; i++)
{
printf("%c", key[i]);
}
}
</screen>
À§ÀÇ ÄÚµå´Â 16 * 8(128)bit Å©±â¸¦ °¡Áö´Â ·£´ý°ªÀ» ¸¸µé¾î³½´Ù.
À§ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ °á°ú°ªÀ» È®ÀÎÇϱâ ÁÁ°Ô ¸¸µé±â À§Çؼ mimecode ¸¦
ÅëÇØ¼ ¾Æ·¡¿Í °°ÀÌ Ãâ·ÂÇØº¸¾Ò´Ù.
<screen>
[root@localhost c_source]# ./dev_mem | mimencode
6qK3AlTHc0nUUETnoL5LRA==
</screen>
mimencode ´Â ÀԷ°ªÀ» base64 ÀÎÄÚµùÇØ¼ ±× °á°ú¸¦ Ãâ·ÂÇϸç,
º¸Åë MIME ¸Þ½ÃÁö¸¦ ÷ºÎÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÇ´Â ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù.
</para>
<para>
ÄÚµå´Â ¸Å¿ì °£´ÜÇϸç, ½ÇÇà½Ã¸¶´Ù ¼·Î ´Ù¸¥ ·£´ý°ªÀÌ Ãâ·ÂµÇ´Â°É
È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. ¶ÇÇÑ ·£´ý°ªÀÇ Å©±â Á¦ÇÑ¿ª½Ã ¸Å¿ì ÀÚÀ¯·Ó´Ù.
À§ÀÇ key ¹è¿ÀÇ Å©±â¸¦ 32 ·Î ÇÑ´Ù¸é °£´ÜÇÏ°Ô 256bit Å©±â¸¦ °¡Áö´Â
ÇÔ¼ö¸¦ »ý¼ºÇÒ¼ö ÀÖ´Ù.
</para>
<section>
<title>Á¶¿ëÇÑ ½Ã½ºÅÛ¿¡¼ÀÇ /dev/random ¹®Á¦Á¡</title>
<para>
/dev/randomÀ» »ç¿ëÇϴµ¥ ÀÖ¾î¼ »ç¼ÒÇÑ(¶§¿¡ µû¶ó¼´Â ½É°¢ÇÑ)
¹®Á¦°¡ Çϳª Àִµ¥, ÀåÄ¡ÀÇ ³ëÀÌÁ ¼öÁýÇØ¼ ¾ØÆ®·ÎÇÇ Ç®¿¡
ÀúÀåÇϰí ÀÌ °ªÀ» ÀÌ¿ëÇØ¼ ·£´ý°ªÀ»
¸¸µé¾î ³½´Ù´Â Ư¡ ¶§¹®¿¡ ÀåÄ¡¿¡ ³ëÀÌÁî°¡ ¾øÀ» ¶§´Â
¾ØÆ®·ÎÇÇ Ç®ÀÌ ºñ¾î ¹ö¸®°í, ¶§¹®¿¡
¸Å¿ì ¿À·£ ½Ã°£µ¿¾È ·£´ý°ªÀÌ ¹ß»ýÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.
</para>
<para>
´ÙÀ½ÀÇ Äڵ带 Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù.
<screen>
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_RND_SIZE 32
int random_init()
{
int fd;
fd = open("/dev/random", O_RDONLY);
return fd;
}
int random_get(int fd, void *buf, size_t size)
{
int i = 0;
int n = 0;
// ÁÖ¼® 1.
while( n < size)
{
n += read(fd, buf, size - n);
}
return n;
}
int random_clear(int fd)
{
close(fd);
}
int main()
{
int fd;
int n;
unsigned int value;
fd = random_init();
sleep(5);
while(1)
{
n = random_get(fd, (void *)&value, 4);
printf("%d %lu\n", n, value);
}
random_clear(fd);
}
</screen>
´ç½ÅÀÇ ½Ã½ºÅÛÀÌ Á¶¿ëÇÑ »óŶó°í °¡Á¤ÇÑ´Ù¸é
óÀ½ ¸î °³´Â ¹ß»ýÇÏÁö¸¸ ±× ÈÄ¿¡´Â ¶ç¾ö¶ç¾ö ¹ß»ý ÇÏ´Â °ÍÀ»
È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÚ ÀÌÁ¦ Űº¸µå¸¦ ´·¯ º¸°Å³ª.
¸¶¿ì½º¸¦ ¿òÁ÷¿© º¸°Å³ª º¹»ç¿Í °°Àº ÆÄÀÏ °ü·Ã ÀÛ¾÷À»
ÇØº¸±â ¹Ù¶õ´Ù. ¾Æ¸¶ ·£´ý°ªÀÌ ºü¸£°Ô ¹ß»ýÇÏ´Â °É
È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
</para>
<para>
ÀÌ·¯ÇÑ /dev/randomÀÇ Æ¯Â¡ ¶§¹®¿¡ ¿¬¼ÓÇØ¼ ·£´ýÇÑ °ªÀ» ¾ò°íÀÚ
ÇÒ ¶§ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸´Ï ÀÌ·² °æ¿ì »ç¿ë¿¡ ÁÖÀÇÇØ¾ß
ÇÑ´Ù.(¹°·Ð ±×¸® ÈçÇÑ °æ¿ì°¡ ¾Æ´Ï±ä ÇÏÁö¸¸)
</para>
<para>
¸¸¾à ÀÐ¾î µéÀÌ·Á´Â Å©±â¸¸ÅÀÇ ³ëÀÌÁî°¡ ¾ØÆ®·ÎÇÇ Ç®¿¡ ÀÖÁö
¾ÊÀ» °æ¿ì ¿äûÇÑ Å©±âº¸´Ù ´õ ÀûÀº °ªÀ» ÀÐ¾î ¿Ã ¼öµµ ÀÖÀ¸¹Ç·Î
ªÀº ½Ã°£¿¡ ¿©·¯°³ÀÇ ·£´ý°ªÀ» »ý¼ºÇØ¾ß ÇÒ °æ¿ì
<emphasis>ÁÖ¼® 1.</emphasis>¿¡¼ ó·³ »çÀÌÁ °è»êÇØÁà¾ß ÇÒ
Çʿ伺ÀÌ ÀÖ´Ù.
</para>
<para>
ªÀº ½Ã°£¿¡ ¿©·¯°³ÀÇ ·£´ý°ª »ý¼ºÀº ÀÎÁõ°ª°ú °°Àº Áß¿äÇÑ
ºÎºÐ¿¡ »ç¿ëµÈ´Ù°í º¸±â´Â Èûµé´Ù. ÀÌ·± °æ¿ì¿¡´Â ±×³É random()À»
ÀÌ¿ëÇϵµ·Ï ÇÏÀÚ.
</para>
<para>
Ä¿³Î 2.6¿¡¼´Â /dev/random¿¡ Çâ»óÀÌ ÀÖ´Ù°í ÇÏ´Ï
Çѹø È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
</para>
</section>
<section>
<title>Áö¿ø OS Á¦ÇÑ</title>
<para>
/dev/random ¹®ÀÚÀåÄ¡¸¦ ÀÌ¿ëÇØ¼ ·£´ý°ªÀ» ¾ò¾î¿À´Â ¹æ¹ýÀº
¸Å¿ì È¿À²ÀûÀ̱ä ÇÏÁö¸¸, ¸ðµç OS°¡ ÀÌ ¹®ÀÚÀåÄ¡¸¦ Áö¿øÇϴ°Ç
¾Æ´Ï´Ù. ÇÊÀÚ°¡ ¾Æ´Â ¹Ù·Î´Â Linux ÀÇ °æ¿ì 2.x ÀÌ»óÀÇ Ä¿³Î¿¡¼
Áö¿øÇϸç Sun os ÀÇ °æ¿ì 5.8 À̻󿡼¸¸ Áö¿øÇÏ´Â °É·Î ¾Ë°í ÀÖ´Ù.
Sun os 5.8 Àǰæ¿ì¿¡´Â ÆÐÄ¡¸¦ ÅëÇØ¼ Áö¿øÇÑ´Ù.
</para>
<para>
±×·³À¸·Î /dev/random À» ÀÌ¿ëÇÑ ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇϰíÀÚ ÇÒ¶§´Â
¹èÆ÷ÇÏ´Â OS¿¡ ´ëÇØ¼ ½Å°æÀ» ½áÁà¾ß ÇÑ´Ù.
</para>
<section>
<title>Sun OS ¿¡¼ÀÇ /dev/random »ý¼º</title>
<para>
SunÀÇ °æ¿ì /dev/random À» »ý¼ºÇϱâ À§ÇÑ °£´ÜÇÑ ¹æ¹ýÀÌ ÀÖ´Ù.
egd ¶ó´Â Perl ¸ðµâÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀε¥,
¹æ¹ýÀε¥ <ulink url="http://www.sunfreeware.com">sunfreeware</ulink> ³ª
<ulink url="http://www.cpan.org">cpan.org</ulink> ¿¡¼ ¾òÀ»¼ö ÀÖ´Ù.
°³ÀÎÀûÀ¸·Î sunfreeware ¿¡¼ ¹öÁ¯¿¡ ¸Â´Â egd ¸¦ ¼³Ä¡ÇÏ´Â°É ÃßõÇÑ´Ù.
</para>
<para>
sunfreeware ¿¡ °¡º¸¸é °¢ ¹öÁ¯º°·Î egd ¸ðµâÀÌ Á¸ÀçÇÒ°ÍÀÌ´Ù.
Àû´çÇÑ egd ¸¦ ´Ù¿î¹Þ¾Æ¼ ¼³Ä¡ÇÏ¸é µÇ´Âµ¥, ÆÐŰÁö°¡ ¾Æ´Ñ ½î¾²¸¦
´Ù¿î¹Þ¾Æ¼ Á÷Á¢ ¼³Ä¡Çϵµ·Ï ÇÑ´Ù.
egd-0.x.tar.gz ¸¦ ´Ù¿î¹Þ¾Æ¼ ¾ÐÃàÀ» Ǭ´ÙÀ½¿¡
´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÄÄÆÄÀÏÈÄ ¼³Ä¡Çϵµ·Ï ÇÑ´Ù.
<screen>
[root@localhost egd]# perl Makefile.PL
...
[root@localhost egd]# make
...
[root@localhost egd]# make install
...
</screen>
¼º°øÀûÀ¸·Î ÄÄÆÄÀÏÀ» ¸¶ÃÆ´Ù¸é egd.pl À̶ó´Â ÆÞ ½ºÅ©¸³Æ®°¡
¸¸µé¾îÁö°í ÀÌ°É ÀÌ¿ëÇØ¼ /dev/random À» »ý¼ºÇÒ¼ö ÀÖ´Ù.
<screen>
[root@locaohost egd]# egd.pl /dev/random
...
</screen>
egd.pl À» ½ÇÇà½Ã۸é /dev/random ÀÌ ¸¸µé¾îÁö´Âµ¥ ls ·Î È®ÀÎÇØ º¸¸é
¹®ÀÚÀåÄ¡ ÆÄÀÏÀÌ ¾Æ´Ñ Unix Domain ¼ÒÄÏÆÄÀÏÀÓÀ» ¾Ë¼ö ÀÖ´Ù.
±×·³À¸·Î ¿ì¸®°¡ ·£´ý°ªÀ» ¾ò¾î¿À±â À§Çؼ´Â Á÷Á¢ ¼ÒÄÏ¿¡ ¿¬°áÇØ¼
/dev/random ¼ÒÄÏÆÄÀÏ·Î ºÎÅÍ °ªÀ» ¾ò¾î¿Í¾ß ÇÑ´Ù.
egd.pl Àº perl ·ÎµÈ Unix Domain ¼ÒÄÏ ¼¹öÀÌ´Ù.
</para>
<para>
´ÙÀ½°ú °°Àº ¹æ¹ýÀ» ÅëÇØ¼ ·£´ý°ªÀ» ¾ò¾î¿Ã¼ö ÀÖ´Ù.
<screen>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int sockfd;
int clilen;
int value;
char de[36];
struct sockaddr_un clientaddr;
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("exit : ");
exit(0);
}
clientaddr.sun_family = AF_UNIX;
strcpy(clientaddr.sun_path, "/dev/random");
clilen = sizeof(clientaddr);
if (connect(sockfd, (struct sockaddr *)&clientaddr, clilen) < 0)
{
perror("connect error : ");
exit(0);
}
printf("OK READ\n");
while(1)
{
memset(de, 0x01, 4);
write(sockfd, de, 4);
read(sockfd, (void *)&value, sizeof(int));
printf("%d\n", value);
sleep(1);
}
close(sockfd);
exit(0);
}
</screen>
</para>
<para>
Âü°í·Î edg.pl Àº SHA(Secure Hash algorithm)À» »ç¿ëÇÑ´Ù.
MD5 °è¿ÀÇ Hash ÇÔ¼ö¿Í ¸Å¿ì À¯»çÇÏ°Ô ÀÛµ¿Çϸç, SHS(secure hash standard)
¿¡ Á¤ÀǵǾî ÀÖ´Ù. MD5 º¸´Ù ´Ù¼Ò ´À¸®Áö¸¸ ´õ ¾ÈÀüÇÏ´Ù´Â Æò°¡¸¦
¹Þ°í ÀÖ´Ù.
</para>
</section>
</section>
</section>
</section>
<section>
<title>°á·Ð</title>
<para>
À̻󰣴ÜÇÏ°Ô ·£´ý°ªÀ» ¾ò¾î¿À´Â 2°¡Áö ÀϹÝÀûÀÎ ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù.
/dev/random ÀÇ °æ¿ì ³ªÁß¿¡ ´Ù·ç°ÔµÉ ssl ÇÁ·Î±×·¡¹Ö¿¡¼µµ ¾²ÀÓÀ¸·Î
¾Ë¾Æ ³õÀ¸¸é ¾ðÁ¨°¡ À¯¿ëÇÏ°Ô ½á¸ÔÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.
</para>
</section>
</article>
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|