수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1691115
  • Today | 421
  • Yesterday | 628

1 Articles, Search for '/dev/random'

  1. 2007/05/14 random 값 얻어오기
Programming/UNIX/Linux C2007/05/14 09:54

random 값 얻어오기

보통 random 값은 표준 C 함수인 random(3)를 이용해서 얻어온다. 이 문서는 random 함수외에 /dev/random 문자장치(커널 난수 생성기)를 이용해서 랜덤값을 얻어오는 방법을 기술하고 있다.

사용자 삽입 이미지


다음은 테스트를 위한 코드이다.

예제 : random_test.c



위의 실행결과를 보면 표준편차는 대략 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
 

위의 코드는 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을 사용하는데 있어서 사소한(때에 따라서는 심각한) 문제가 하나 있는데, 장치의 노이즈를 수집해서 앤트로피 풀에 저장하고 이 값을 이용해서 랜덤값을 만들어 낸다는 특징 때문에 장치에 노이즈가 없을 때는 앤트로피 풀이 비어 버리고, 때문에 매우 오랜 시간동안 랜덤값이 발생하지 않을 수 있다는 점이다.

다음의 코드를 테스트 해보기 바란다.
                               

당신의 시스템이 조용한 상태라고 가정한다면 처음 몇 개는 발생하지만 그 후에는 띄엄띄엄 발생 하는 것을 확인할 수 있을 것이다. 자 이제 키보드를 눌러 보거나. 마우스를 움직여 보거나 복사와 같은 파일 관련 작업을 해보기 바란다. 아마 랜덤값이 빠르게 발생하는 걸 확인 할 수 있을 것이다.

이러한 /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 소켓 서버이다.

다음과 같은 방법을 통해서 랜덤값을 얻어올수 있다.         




참고로 edg.pl 은 SHA(Secure Hash algorithm)을 사용한다. MD5 계열의 Hash 함수와 매우 유사하게 작동하며, SHS(secure hash standard) 에 정의되어 있다. MD5 보다 다소 느리지만 더 안전하다는 평가를 받고 있다.


--------------------------------------------------------------------------------

3절. 결론
이상간단하게 랜덤값을 얻어오는 2가지 일반적인 방법에 대해서 알아보았다. /dev/random 의 경우 나중에 다루게될 ssl 프로그래밍에서도 쓰임으로 알아 놓으면 언젠가 유용하게 써먹을수 있을것이다.



출처 : http://joinc.co.kr/modules.php?name=new ··· 3Dnested
"UNIX/Linux C" 카테고리의 다른 글
  • fcntl 함수 사용하기 (0)2007/05/14
  • 터미널 제어 (0)2007/05/14
  • random 값 얻어오기 (0)2007/05/14
  • openssl 을 통한 데이타 암호화 (0)2007/05/14
  • pthread API 레퍼런스 (3)2007/05/14
2007/05/14 09:54 2007/05/14 09:54
Posted by webdizen
Tags /dev/random, random
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2933

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Sun
  • Network
  • renfe
  • Watch
  • 데이터 분산
  • Firefox
  • 창강관
  • 동기화 클래스
  • 성능
  • 인터페이스
  • 데이터 웨어 하우스
  • 점유율
  • FoxPro
  • 회사
  • RSS
  • 생존
  • find
  • T-SQL
  • TCP/IP
  • pcap

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08
  • 재밌네요~ 첫번째꺼는 요즘....
    Hybrid 2009

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.