/dev/randomÀ» ÀÌ¿ëÇÑ ·£´ý°ª »ý¼º
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

  • Ç¥ÁØÆíÂ÷¸¦ À߸ø±¸Çϰí ÀÖÀ½ ¼öÁ¤ÇؾßÇÔ - yundream 2008/7/24
/dev/random À» ÀÌ¿ëÇÑ ·£´ý°ª »ý¼º

/dev/random À» ÀÌ¿ëÇÑ ·£´ý°ª »ý¼º

À± »ó¹è

dreamyun@yahoo.co.kr

교정 과정
교정 1.02004³â 1¿ù 28ÀÏ 19½Ã
/dev/random ÀåÄ¡ ³ëÀÌÁî ¼öÁý ¹®Á¦Á¡
교정 0.92003³â 2¿ù 24ÀÏ 22½Ã
¼Ö¶ó¸®½º¿¡¼­ /dev/random ¹®ÀÚÀåÄ¡»ý¼º
교정 0.82003³â 2¿ù 9ÀÏ 21½Ã
¹®¼­ ÀÛ¼º


1절. ¼Ò°³

À̹ø±ÛÀº ¸®´ª½º ½Ã½ºÅÛ¿¡¼­ Á¦°øÇÏ´Â ¹®ÀÚÀåÄ¡(character devices)¸¦ ÀÌ¿ëÇÑ ·£´ý°ªÀ» ¾ò¾î³»´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ´ã°í ÀÖ´Ù. Linux kernel 2.4.x ȯ°æ¿¡¼­¸¸ Å×½ºÆ®µÇ¾úÀ¸³ª, Kernel 2.2.x ¿¡¼­µµ µ¿ÀÏÇÏ°Ô ÀÛµ¿µÉ°ÍÀ¸·Î »ý°¢µÈ´Ù. Solaris ÀÇ °æ¿ì 2.8 ¹öÀüÀÌÈÄ·Î ÆÐÄ¡¸¦ ÅëÇØ¼­ /dev/random À» Áö¿øÇϴ°ɷΠµÇ¾îÀÖ´Ù. ´Ù¸¥ Unix µéµµ ´ëºÎºÐ Áö¿øÇÏÁö¸¸ ¹öÁ¯¿¡ µû¶ó¼­ Áö¿ø¿©ºÎ°¡ °áÁ¤µÉ°ÍÀÌ´Ù.


2절. RANDOM °ª ¸¸µé±â

2.1절. ¿Ö RANDOM°ªÀÌ Áß¿äÇѰ¡

random ÀÇ Àǹ̰¡ "ÀÓÀÇÀÇ", "ÀÏÁ¤Ä¡ ¾Ê´Â"ÀÇ ¶æÀ» °¡Áø´Ù´Â °ÍÀº ´©±¸µçÁö ¾Ë°í ÀÖÀ»°ÍÀÌ´Ù. °¡Àå °£´ÜÇÑ ·£´ý°ªÀÇ ¿¹´Â ÁÖ»çÀ§°¡ ´øÁ®Áú°æ¿ì ³ª¿À´Â ´«ÀÇ ¼ö °¡ µÉ°ÍÀ̸ç, ´øÁö´Â »ç¶÷ÀÌ ¾Æ¹« »ý°¢¾øÀÌ ´øÁú°æ¿ì "ÀÓÀÇÀÇ" °ªÀÌ ³ª¿À°Ô µÉ°ÍÀÌ´Ù.

ÀÌ "ÀÓÀÇÀÇ" °ªÀº ÀÏ»ó»ýȰ¿¡¼­ ÀÚÁÖ »ç¿ëµÇ¸ç, ƯÈ÷ "º¸¾È"À» ÇÊ¿ä·Î Çϴ°÷¿¡¼­ ´õ¿í Áß¿äÇÏ°Ô ´Ù·ç¾îÁø´Ù. ±Ý°íÀÇ ¹®À» ¿­±â À§ÇÑ 6ÀÚ¸®ÀÇ ¼ýÀÚ¸¦ Á¶ÇÕÇÑ´Ù°í ÇßÀ»¶§, Ä«µå¿¡¼­ Çö±Ý¼­ºñ½ºµîÀ» ¼­ºñ½º¹Þ±â À§ÇØ »ç¿ëÇÏ´Â 4ÀÚ¸® ¼ýÀÚÀÇ Á¶ÇÕµî "ÀÓÀÌÀÇ" °ªÀÌ »ç¿ëµÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ÈçÈ÷ ÀÌ·¯ÇÑ ¼ýÀÚÁ¶ÇÕÀ» ¸¸µé¶§ °¡Àå ¹®Á¦½Ã µÇ´Â°Ô, "ÀÓÀÇÀÇ" °ªÀ» »ç¿ëÇÏÁö ¾Ê°í ¼ýÀÚÁ¶ÇÕÀ» ¸¸µç´Ù´Â Á¡ÀÌ´Ù. Àڱ⠻ýÀÏÀ̶óµçÁö, ¾Æ´Â »ç¶÷ÀÇ ÀüÈ­¹øÈ£µîÀÌ ´ëÇ¥ÀûÀÎ ¿¹·Î, ÀÌ·± °ªµéÀº "ÀÓÀÇÀÇ"°ªÀÌ ¾Æ´Ï´Ù. ÀÓÀÇÀÇ °ªÀÌ ¾Æ´Ï¶õ ¶æÀº À¯Ãß°¡ °¡´ÉÇÔÀ» ¶æÇϸç, À¯Ãß°¡ °¡´ÉÇÏ´Ù´Â °ÍÀº ±×¸¸Å­ ÇêÁ¡ÀÌ ¸¹¾ÆÁú¼ö ÀÖÀ½À» ¶æÇÑ´Ù.

ÄÄÇ»ÆÃ ȯ°æ¿¡¼­µµ ÀÌ·¯ÇÑ "ÀÓÀÇÀÇ"°ª À» ¼±ÅÃÇÒ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¼±ÅÃµÈ ÀÓÀÇÀÇ °ªÀº ¿©·¯°¡Áö ¿ëµµ·Î »ç¿ëµÉ°ÍÀε¥, ´ëÇ¥ÀûÀ¸·Î »ç¿ëÇÒ¼ö ÀÖ´Â°Ô »ç¿ëÀÚ È®ÀÎÀ» À§ÇÑ "password" ¿Í SSL °ú °°Àº ¶óÀ̺귯¸®µî¿¡¼­ ¾Ïȣȭ¹× º¹È£È­¸¦ À§ÇÑ key°ªµîÀÇ Á¦ÀÛÀÏ °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ "ÀÓÀÇÀÇ"°ªµéÀº ´ç¿¬ÇÏÁö¸¸ ÃÖ´ëÇÑ "ÀÓÀÇÀÇ"°ªÀ¸·Î½á, °¡´ÉÇÑ À¯Ãߵɼö ¾ø´Â °ªÀÌ µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ¸¸¾à ¿ì¸®°¡ "ÀÓÀÇÀÇ"°ª À» ¾ò±â À§ÇÑ ¾î¶² ÇÔ¼ö¸¦ ¸¸µé¾ú°í, ÀÌ ÇÔ¼ö¸¦ ÅëÇØ¼­ 1-9999 »çÀÌÀÇ ÀÓÀÇÀÇ °ªÀ» ¾ò¾î³»·Á°í Çϴµ¥, ÇÔ¼ö¸¦ »ç¿ëÇß´õ´Ï 5000 - 6000 »çÀÌÀÇ °ªÀÌ ´Ù¸¥ °ªº¸´Ù Ưº°È÷ ¸¹ÀÌ ³ª¿Â´Ù¸é, ÀÌ ÇÔ¼ö´Â ¹ÏÀ»¼ö ¾ø´Â "°áÇÔÀÌ ÀÖ´Â" ÇÔ¼ö°¡ µÉ°ÍÀ̸ç, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¸¹Àº ÇÁ·Î±×·¥Àº º¸¾È °áÇÔÀ» °¡Áö°Ô µÉ°ÍÀÌ´Ù. ÀÌ»óÀûÀ¸·Î °¢°¢ÀÇ °ªÀÌ ¼±ÅÃµÉ È®·üÀº ¸ðµÎ µ¿ÀÏ(1/°ªÀǹüÀ§)ÇØ¾ß ÇÒ°ÍÀÌ´Ù-´Ù¸¥¸»·Î Ç¥ÁØÆíÂ÷ 0-.


2.2절. Ç¥ÁØ C random ÇÔ¼ö

Ç¥ÁØ C ¿¡¼­´Â ·£´ý°ªÀÇ °è»êÀ» À§Çؼ­ random()¿Í srandom() µÎ°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

#include <stdlib.h>

long random(void);
void srandom(unsigned int seed);
			
srandom ÇÔ¼ö´Â random seed °ªÀ» ¸¸µé±â À§Çؼ­ »ç¿ëµÇ¸ç, random Àº ¸¸µé¾îÁø random seed °ªÀ» ÀÌ¿ëÇØ¼­ ÀÏ·ÃÀÇ ·£´ý°ªÀ» ¹ß»ý½ÃŲ´Ù. ÀÌ ¸»Àº randomÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¹ß»ýµÇ´Â ·£´ý°ªÀº srandom ¿¡ ÀÇÁ¸ÀûÀÓÀ» ¶æÇϸç, ½ÇÁ¦ °°Àº random seed ¸¦ ÀÌ¿ëÇØ¼­ random ÇÔ¼ö¸¦ µ¹¸±°æ¿ì ¾ðÁ¦³ª µ¿ÀÏÇÑ ÀÏ·ÃÀÇ ·£´ý°ªÀ» ¾ò°Ô µÈ´Ù.

srandom ¿¡¼­ÀÇ random seed ´Â ¾Æ±Ô¸ÕÆ®·Î ÁÖ¾îÁö´Â seed¿¡ ÀÇÇØ¼­ »ý¼ºµÈ´Ù.

random ÇÔ¼ö°¡ srandom ¿¡¼­ ¸¸µé¾î³»´Â random seed ¿¡ ÀÇÇØ¼­ ·£´ý°ªÀ» ¸¸µé¾î³½´Ù´Â °ÍÀº ±×¸® ÁÁÁö ¾ÊÀº ¾ÆÀ̵ð¾î¶ó°í »ý°¢µÈ´Ù. ¿Ö³ÄÇϸé seed ¿¡ ÀÓÀÇÀÇ int °ªÀ» ÇÒ´çÇÑ´Ù´Â°Ô »ý°¢Ã³·³ ½¬¿î°Ô ¾Æ´Ï±â ¶§¹®À̸ç(º¸ÅëÀº ÄÄÇ»ÅÍÀÇ ½Ã°£°ªÀ» »ç¿ëÇÑ´Ù), ÀÌ·¯ÇÑ °ªÀº À¯Ãߵɼö Àֱ⠶§¹®ÀÌ´Ù. ±âº»ÀûÀ¸·Î µ¿ÀÏÇÑ seed °ªÀ» ÀÌ¿ëÇÒ°æ¿ì µ¿ÀÏÇÑ ÀÏ·ÃÀÇ ·£´ý°ªÀ» ¾òÀ»¼ö Àֱ⠶§¹®ÀÌ´Ù.

¶ÇÇÑ random À¸·Î »ý¼ºµÇ´Â ·£´ý°ªÀÇ ¹üÀ§´Â 16*((2**31)-1) ÀÌ´Ù. ¾ð¶æº¸¸é ¸Å¿ì Å«¼ýÀÚÀÎ°Í °°´Ù. ±×·¯³ª ÃÖ±Ù ssl µî¿¡¼­ key ÀÇ Å©±â°¡ 128bit ÀΰÍÀ» °¨¾ÈÇÏ¸é ³Ê¹« ÀÛÀº ¹üÀ§ÀÇ ·£´ý°ª¸¸À» ¾ò¾î¿Ã¼ö À־, ÇöÀç ÄÄÇ»ÆÃ ȯ°æÀÌ ¿ä±¸ÇÏ´Â ¼öÁØ¿¡ Å©°Ô ¹Ì´ÞµÇ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.

Áï ±×¸® º¹ÀâÇϰųª Áß¿äÇÏÁö ¾ÊÀº ¾îÇø®ÄÉÀ̼ǿ¡¼­ÀÇ ·£´ý°ªÀ» ¸¸µé±â À§Çؼ­´Â °£´ÜÇÏ°Ô »ç¿ë°¡´ÉÇÏÁö¸¸, ±×·¸Áö ¾ÊÀº ½ÇÁ¦ ¼­ºñ½ºÈ¯°æ¿¡¼­ »ç¿ëÇϱ⿡´Â ºÎÁ·ÇÑÁ¡ÀÌ ÀÖ´Ù.


2.2.1절. ¼º´É Å×½ºÆ®

ÀÏ´Ü random seed ¸¦ Á¦¿ÜÇÏ°í »ý°¢ÇÑ´Ù¸é, ·£´ý°ªÀº Á¤¸» ·£´ýÇÏ°Ô ³ª¿Í¾ß ÇÑ´Ù. ¿¹¸¦µé¾î 1-100 ±îÁöÀÇ ¹üÀ§¿¡¼­ ·£´ý°ªÀ» ÃßÃâÇϰíÀÚ ÇßÀ»¶§ À̰ÍÀ» 100000¹ø µ¹¸®¸é 1-100 »çÀÌÀÇ °¢°¢ÀÇ °ªÀÌ °ÅÀÇ ºñ½ÁÇÑ È½¼ö·Î ¼±ÅõǾîÁ®¾ß ÇÒ°ÍÀÌ´Ù. ¾à°£´õ ¸¹ÀÌ ¼±Åõǰųª ±×·¸Áö ¾ÊÀº ·£´ý°ªÀÌ ÀÖ°ÚÁö¸¸ ´ëÃæ 1000 Á¤µµ¿¡¼­ ¼±ÅõǾîÁ®¾ß ÇÒ°ÍÀ̸ç, ÀÌ ¿ÀÂ÷ ÆøÀÌ ÀÛÀ»¼ö·Ï ¼º´ÉÀÌ ÁÁÀº ·£´ý ÇÔ¼ö¶ó°í ÇÒ¼ö ÀÖ´Ù.

º¸Åë ÀÌ·¯ÇÑ Åë°è¼öÄ¡¿¡¼­ °¢°¢ÀÇ °üÃø°ªÀÌ Æò±Õ¿¡¼­ ¶³¾îÁø Á¤º¸¸¦ °¡Áö°í ¾ó¸¶³ª ¹Ù¶÷Á÷ÇÏ°Ô ºÐÆ÷µÇ¾î ÀÖ´ÂÁö¸¦ ÆÇ´ÜÇÏ°Ô µÇ´Âµ¥, À̸¦ Ç¥ÁØÆíÂ÷¶ó°í ÇÑ´Ù. ¿©±â¿¡¼­´Â random ÇÔ¼öÀÇ ¼º´ÉÀ» ¾Ë¾Æº¸±â À§Çؼ­ Ç¥ÁØÆíÂ÷¸¦ ±¸Çϰí À̸¦ ±×·¡ÇÁ·Î È®ÀÎÇØº¸µµ·Ï ÇϰڴÙ(Åë°è °è»ê°ªÀº ¼ýÀÚº¸´Ù´Â ¾Æ¹«·¡µµ ±×¸²ÀÌ ÀÌÇØÇϱⰡ ½±´Ù).

ÀÌ·¯ÇÑ Ç¥ÁØÆíÂ÷¸¦ ±¸Çϱâ À§Çؼ­ °£´ÜÇÑ Å×½ºÆ®¿ë Äڵ带 ¸¸µé°ÍÀÌ´Ù. ÀÌ ÄÚµå´Â srandom À» ÀÌ¿ëÇØ¼­ random seed ¸¦ ¸¸µé°í, ÀÌ random seed ¸¦ ÅëÇØ¼­ random À» 100000¹ø µ¹¸®°Ô µÉ°ÍÀÌ´Ù. ·£´ý°ªÀÇ ¹üÀ§´Â 1¿¡¼­ 100 »çÀ̰¡ µÉ°ÍÀ̸ç, °¢ °üÃø°ªÀÌ ¸î¹ø¾¿ Ãâ·ÂµÇ´ÂÁö¸¦ È®ÀÎÇϰí, À̰ÍÀ» ÀÌ¿ëÇØ¼­ Ç¥ÁØÆíÂ÷¸¦ ±¸Çϰí, ±×·¡ÇÁ¸¦ ¸¸µé°ÍÀÌ´Ù. Âü°í·Î Ç¥ÁØÆíÂ÷¸¦ ±¸ÇÏ´Â ÀϹÝÀûÀÎ °ø½ÄÀº ´ÙÀ½°ú °°´Ù.

그림 1. Ç¥ÁØÆíÂ÷ °ø½Ä

´ÙÀ½Àº Å×½ºÆ®¸¦ À§ÇÑ ÄÚµåÀÌ´Ù.

¿¹Á¦ : random_test.c

#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);
}
				
À§ÀÇ ½ÇÇà°á°ú¸¦ º¸¸é Ç¥ÁØÆíÂ÷´Â ´ë·« 36 Á¤µµ°¡ ³ª¿Â´Ù. À̸»Àº Æò±Õ°ªÀÎ 1000 ¿¡¼­ ´ë·« 36Á¤µµÀÇ ¹üÀ§³»¿¡ ¸ðµç °üÃø°ªÀÌ À§Ä¡ÇÔÀ» ¶æÇÑ´Ù. ±¦ÂúÀº ¼º´ÉÀ» º¸¿©ÁØ´Ù´Â°É ¾Ë¼ö ÀÖ´Ù. ¾Æ·¡´Â ½ÇÇà°á°úÀÌ´Ù.
96 1012
97 992
98 970
99 1008
Æò±Õ : 1000
ÇÕ   : 100000
1303
				
¸¶Áö¸· Ãâ·Â°ªÀÎ 1303 ¿¡ sqrt ¿¬»êÀ» ÇØÁÖ¸é Ç¥ÁØÆíÂ÷¸¦ ±¸ÇÒ¼ö ÀÖ´Ù.

´ÙÀ½Àº À§ÀÇ Äڵ带 µ¹·Á¼­ ³ª¿Â °á°ú¸¦ ±×·¡ÇÁ·Î ³ªÅ¸³½°ÍÀε¥, Æò±Õ°ªÀÎ 1000 ºÎ±Ù¿¡ ´ëºÎºÐ À§Ä¡Çϰí ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ÀÌ ±×·¡ÇÁ´Â gnuplot ¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁ³´Ù.

그림 2. random ¼º´ÉÅ×½ºÆ® °á°ú

random.dat ´Â srandom ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾ÊÀº »óÅ¿¡¼­ ±âº» random seed ¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø °ªÀ̸ç, random2.dat ´Â srandom À» 100 À¸·Î ÇÑ´ÙÀ½¿¡ ¸¸µé¾îÁø °ªÀÌ´Ù.


2.3절. /dev/random ÀÇ ÀÌ¿ë

Unix ¿¡¼­´Â Á»´õ ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. /dev/random À̶ó´Â ¹®ÀÚÀåÄ¡¸¦ ÅëÇÑ ·£´ý°ª°¡Á®¿À±â°¡ ÀÌ ¹æ¹ýÀÌ´Ù.

ÀÌ ¹®ÀÚÀåÄ¡´Â Ä¿³Î¿¡¼­ Á¦°øÇϴµ¥, int ÇüÀÇ °ªÀ» ÀÌ¿ëÇØ¼­ random seed ¸¦ »ý¼ºÇس»´Â random ÇÔ¼ö ¿Í´Â ´Þ¸® ´Ù¸¥ ÀåÄ¡µå¶óÀ̹ö¿Í ¿£Æ®·ÎÇÇÇ®¾ÈÀÇ ´Ù¸¥ ¼Ò½º µé·Î ºÎÅÍ ³ëÀÌÁ ¸ðÀ¸°í ÀÌ·¯ÇÑ ³ëÀÌÁî¿Í ÀåÄ¡µå¶óÀ̹ö¿¡ °É¸®´Â ÀÎÅÍ·´Æ®½Ã°£ °£°ÝµîÀ» ÀÌ¿ëÇØ¼­ ³­¼ö¸¦ »ý¼º½ÃŲ´Ù.

°£´ÜÈ÷ »ý°¢Çؼ­ Űº¸µå, ¸¶¿ì½º, µð½ºÅ© ȤÀº ³»ºÎÀûÀ¸·Î ¹ß»ýµÇ´Â ´Ù¸¥ ÀÎÅÍ·´Æ®µîÀ» ÀÌ¿ëÇØ¼­ ³­¼ö¸¦ ¹ß»ý½ÃŲ´Ù°í º¸¸é µÈ´Ù. À̵é ÀÎÅÍ·´Æ® °ªµîÀº ¿¹ÃøÇϱⰡ ¸Å¿ì Èûµé±â ¶§¹®¿¡ ±Ùº»ÀûÀ¸·Î random ÇÔ¼ö¸¦ ÀÌ¿ëÇϴ°ͺ¸´Ù ¸Å¿ì ¾ÈÀüÇÏ°Ô ·£´ý°ªÀ» »ý¼ºÇÒ¼ö°¡ ÀÖ´Ù. ¶ÇÇÑ ³­¼öÀÇ ¹üÀ§¸¦ ¸Å¿ì Å©°Ô ÀâÀ»¼ö Àֱ⠶§¹®¿¡, 128bit Å©±â¸¦ ±âº»À¸·Î »ç¿ëÇÏ´Â Áö±ÝÀÇ ÄÄÇ»ÆÃ ȯ°æ¿¡ À¯¿ëÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖ´Ù

½ÇÁ¦ openssl °ú °°Àº ¶óÀ̺귯¸®µîÀº ¾ÏȣȭµÈ keyÀÇ »ý¼ºÀ» À§Çؼ­ /dev/random À» »ç¿ëÇÑ´Ù. ´ÙÀ½Àº 128bit Å©±âÀÇ ³­¼ö¸¦ »ý¼ºÇÏ´Â °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.

¿¹Á¦ : dev_mem.c

#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]);
    }
}
			
À§ÀÇ ÄÚµå´Â 16 * 8(128)bit Å©±â¸¦ °¡Áö´Â ·£´ý°ªÀ» ¸¸µé¾î³½´Ù. À§ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ °á°ú°ªÀ» È®ÀÎÇϱâ ÁÁ°Ô ¸¸µé±â À§Çؼ­ mimecode ¸¦ ÅëÇØ¼­ ¾Æ·¡¿Í °°ÀÌ Ãâ·ÂÇØº¸¾Ò´Ù.
[root@localhost c_source]# ./dev_mem | mimencode 
6qK3AlTHc0nUUETnoL5LRA==
			
mimencode ´Â ÀԷ°ªÀ» base64 ÀÎÄÚµùÇØ¼­ ±× °á°ú¸¦ Ãâ·ÂÇϸç, º¸Åë MIME ¸Þ½ÃÁö¸¦ ÷ºÎÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÇ´Â ¾îÇø®ÄÉÀ̼ÇÀÌ´Ù.

ÄÚµå´Â ¸Å¿ì °£´ÜÇϸç, ½ÇÇà½Ã¸¶´Ù ¼­·Î ´Ù¸¥ ·£´ý°ªÀÌ Ãâ·ÂµÇ´Â°É È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. ¶ÇÇÑ ·£´ý°ªÀÇ Å©±â Á¦ÇÑ¿ª½Ã ¸Å¿ì ÀÚÀ¯·Ó´Ù. À§ÀÇ key ¹è¿­ÀÇ Å©±â¸¦ 32 ·Î ÇÑ´Ù¸é °£´ÜÇÏ°Ô 256bit Å©±â¸¦ °¡Áö´Â ÇÔ¼ö¸¦ »ý¼ºÇÒ¼ö ÀÖ´Ù.


2.3.1절. Á¶¿ëÇÑ ½Ã½ºÅÛ¿¡¼­ÀÇ /dev/random ¹®Á¦Á¡

/dev/randomÀ» »ç¿ëÇϴµ¥ À־ »ç¼ÒÇÑ(¶§¿¡ µû¶ó¼­´Â ½É°¢ÇÑ) ¹®Á¦°¡ Çϳª Àִµ¥, ÀåÄ¡ÀÇ ³ëÀÌÁ ¼öÁýÇØ¼­ ¾ØÆ®·ÎÇÇ Ç®¿¡ ÀúÀåÇϰí ÀÌ °ªÀ» ÀÌ¿ëÇØ¼­ ·£´ý°ªÀ» ¸¸µé¾î ³½´Ù´Â Ư¡ ¶§¹®¿¡ ÀåÄ¡¿¡ ³ëÀÌÁî°¡ ¾øÀ» ¶§´Â ¾ØÆ®·ÎÇÇ Ç®ÀÌ ºñ¾î ¹ö¸®°í, ¶§¹®¿¡ ¸Å¿ì ¿À·£ ½Ã°£µ¿¾È ·£´ý°ªÀÌ ¹ß»ýÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.

´ÙÀ½ÀÇ Äڵ带 Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù.

#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);
}
				
´ç½ÅÀÇ ½Ã½ºÅÛÀÌ Á¶¿ëÇÑ »óŶó°í °¡Á¤ÇÑ´Ù¸é óÀ½ ¸î °³´Â ¹ß»ýÇÏÁö¸¸ ±× ÈÄ¿¡´Â ¶ç¾ö¶ç¾ö ¹ß»ý ÇÏ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÚ ÀÌÁ¦ Űº¸µå¸¦ ´­·¯ º¸°Å³ª. ¸¶¿ì½º¸¦ ¿òÁ÷¿© º¸°Å³ª º¹»ç¿Í °°Àº ÆÄÀÏ °ü·Ã ÀÛ¾÷À» ÇØº¸±â ¹Ù¶õ´Ù. ¾Æ¸¶ ·£´ý°ªÀÌ ºü¸£°Ô ¹ß»ýÇÏ´Â °É È®ÀÎ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ /dev/randomÀÇ Æ¯Â¡ ¶§¹®¿¡ ¿¬¼ÓÇØ¼­ ·£´ýÇÑ °ªÀ» ¾ò°íÀÚ ÇÒ ¶§ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸´Ï ÀÌ·² °æ¿ì »ç¿ë¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù.(¹°·Ð ±×¸® ÈçÇÑ °æ¿ì°¡ ¾Æ´Ï±ä ÇÏÁö¸¸)

¸¸¾à ÀÐ¾î µéÀÌ·Á´Â Å©±â¸¸Å­ÀÇ ³ëÀÌÁî°¡ ¾ØÆ®·ÎÇÇ Ç®¿¡ ÀÖÁö ¾ÊÀ» °æ¿ì ¿äûÇÑ Å©±âº¸´Ù ´õ ÀûÀº °ªÀ» ÀÐ¾î ¿Ã ¼öµµ ÀÖÀ¸¹Ç·Î ªÀº ½Ã°£¿¡ ¿©·¯°³ÀÇ ·£´ý°ªÀ» »ý¼ºÇØ¾ß ÇÒ °æ¿ì ÁÖ¼® 1.¿¡¼­ ó·³ »çÀÌÁ °è»êÇØÁà¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù.

ªÀº ½Ã°£¿¡ ¿©·¯°³ÀÇ ·£´ý°ª »ý¼ºÀº ÀÎÁõ°ª°ú °°Àº Áß¿äÇÑ ºÎºÐ¿¡ »ç¿ëµÈ´Ù°í º¸±â´Â Èûµé´Ù. ÀÌ·± °æ¿ì¿¡´Â ±×³É random()À» ÀÌ¿ëÇϵµ·Ï ÇÏÀÚ.

Ä¿³Î 2.6¿¡¼­´Â /dev/random¿¡ Çâ»óÀÌ ÀÖ´Ù°í ÇÏ´Ï Çѹø È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.


2.3.2절. Áö¿ø OS Á¦ÇÑ

/dev/random ¹®ÀÚÀåÄ¡¸¦ ÀÌ¿ëÇØ¼­ ·£´ý°ªÀ» ¾ò¾î¿À´Â ¹æ¹ýÀº ¸Å¿ì È¿À²ÀûÀ̱ä ÇÏÁö¸¸, ¸ðµç OS°¡ ÀÌ ¹®ÀÚÀåÄ¡¸¦ Áö¿øÇÏ´Â°Ç ¾Æ´Ï´Ù. ÇÊÀÚ°¡ ¾Æ´Â ¹Ù·Î´Â Linux ÀÇ °æ¿ì 2.x ÀÌ»óÀÇ Ä¿³Î¿¡¼­ Áö¿øÇϸç Sun os ÀÇ °æ¿ì 5.8 À̻󿡼­¸¸ Áö¿øÇÏ´Â °É·Î ¾Ë°í ÀÖ´Ù. Sun os 5.8 Àǰæ¿ì¿¡´Â ÆÐÄ¡¸¦ ÅëÇØ¼­ Áö¿øÇÑ´Ù.

±×·³À¸·Î /dev/random À» ÀÌ¿ëÇÑ ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇϰíÀÚ ÇÒ¶§´Â ¹èÆ÷ÇÏ´Â OS¿¡ ´ëÇØ¼­ ½Å°æÀ» ½áÁà¾ß ÇÑ´Ù.


2.3.2.1절. Sun OS ¿¡¼­ÀÇ /dev/random »ý¼º

SunÀÇ °æ¿ì /dev/random À» »ý¼ºÇϱâ À§ÇÑ °£´ÜÇÑ ¹æ¹ýÀÌ ÀÖ´Ù. egd ¶ó´Â Perl ¸ðµâÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ýÀε¥, ¹æ¹ýÀε¥ sunfreeware ³ª cpan.org ¿¡¼­ ¾òÀ»¼ö ÀÖ´Ù. °³ÀÎÀûÀ¸·Î sunfreeware ¿¡¼­ ¹öÁ¯¿¡ ¸Â´Â egd ¸¦ ¼³Ä¡ÇÏ´Â°É ÃßõÇÑ´Ù.

sunfreeware ¿¡ °¡º¸¸é °¢ ¹öÁ¯º°·Î egd ¸ðµâÀÌ Á¸ÀçÇÒ°ÍÀÌ´Ù. Àû´çÇÑ egd ¸¦ ´Ù¿î¹Þ¾Æ¼­ ¼³Ä¡ÇÏ¸é µÇ´Âµ¥, ÆÐŰÁö°¡ ¾Æ´Ñ ½î¾²¸¦ ´Ù¿î¹Þ¾Æ¼­ Á÷Á¢ ¼³Ä¡Çϵµ·Ï ÇÑ´Ù. egd-0.x.tar.gz ¸¦ ´Ù¿î¹Þ¾Æ¼­ ¾ÐÃàÀ» Ǭ´ÙÀ½¿¡ ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î ÄÄÆÄÀÏÈÄ ¼³Ä¡Çϵµ·Ï ÇÑ´Ù.

[root@localhost egd]# perl Makefile.PL 
...
[root@localhost egd]# make 
...
[root@localhost egd]# make install
...
					
¼º°øÀûÀ¸·Î ÄÄÆÄÀÏÀ» ¸¶ÃÆ´Ù¸é egd.pl À̶ó´Â ÆÞ ½ºÅ©¸³Æ®°¡ ¸¸µé¾îÁö°í ÀÌ°É ÀÌ¿ëÇØ¼­ /dev/random À» »ý¼ºÇÒ¼ö ÀÖ´Ù.
[root@locaohost egd]# egd.pl /dev/random
...
					
egd.pl À» ½ÇÇà½Ã۸é /dev/random ÀÌ ¸¸µé¾îÁö´Âµ¥ ls ·Î È®ÀÎÇØ º¸¸é ¹®ÀÚÀåÄ¡ ÆÄÀÏÀÌ ¾Æ´Ñ Unix Domain ¼ÒÄÏÆÄÀÏÀÓÀ» ¾Ë¼ö ÀÖ´Ù. ±×·³À¸·Î ¿ì¸®°¡ ·£´ý°ªÀ» ¾ò¾î¿À±â À§Çؼ­´Â Á÷Á¢ ¼ÒÄÏ¿¡ ¿¬°áÇØ¼­ /dev/random ¼ÒÄÏÆÄÀÏ·Î ºÎÅÍ °ªÀ» ¾ò¾î¿Í¾ß ÇÑ´Ù. egd.pl Àº perl ·ÎµÈ Unix Domain ¼ÒÄÏ ¼­¹öÀÌ´Ù.

´ÙÀ½°ú °°Àº ¹æ¹ýÀ» ÅëÇØ¼­ ·£´ý°ªÀ» ¾ò¾î¿Ã¼ö ÀÖ´Ù.

	
#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);
}
					

Âü°í·Î edg.pl Àº SHA(Secure Hash algorithm)À» »ç¿ëÇÑ´Ù. MD5 °è¿­ÀÇ Hash ÇÔ¼ö¿Í ¸Å¿ì À¯»çÇÏ°Ô ÀÛµ¿Çϸç, SHS(secure hash standard) ¿¡ Á¤ÀǵǾî ÀÖ´Ù. MD5 º¸´Ù ´Ù¼Ò ´À¸®Áö¸¸ ´õ ¾ÈÀüÇÏ´Ù´Â Æò°¡¸¦ ¹Þ°í ÀÖ´Ù.


3절. °á·Ð

À̻󰣴ÜÇÏ°Ô ·£´ý°ªÀ» ¾ò¾î¿À´Â 2°¡Áö ÀϹÝÀûÀÎ ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. /dev/random ÀÇ °æ¿ì ³ªÁß¿¡ ´Ù·ç°ÔµÉ ssl ÇÁ·Î±×·¡¹Ö¿¡¼­µµ ¾²ÀÓÀ¸·Î ¾Ë¾Æ ³õÀ¸¸é ¾ðÁ¨°¡ À¯¿ëÇÏ°Ô ½á¸ÔÀ»¼ö ÀÖÀ»°ÍÀÌ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.