2010년 4월 12일 월요일

암호화 알고리즘

AES(Advanced Encryption Standard) 혹은 Rijndael

1997년 1월에, 기존의 데이터 암호 표준, 즉 DES를 대체할 보다 강력한 알고리즘을 찾기 위한 공모 작업이 미국 상무부의 한 기관인 표준기술연구소(NIST)에 의해 시작된다. 새로운 알고리즘이 충족해야 할 규격 요건으로는, 최소 128 비트나 192 비트 또는 256 비트 크기의 키를 지원하는 128 비트 크기의 블록 암호화를 사용한 대칭형 (암호화나 복호화를 하는데 동일한 키가 사용되는) 알고리즘으로서, 전 세계적으로 로열티 없이 사용할 수 있어야 하며, 향후 20년~30년 동안 데이터를 보호하기 위해 충분한 정도의 보안성을 제공할 것이 요구되었다. 또한, 이 알고리즘은 스마트카드 등과 같은 제한된 환경을 포함하여 하드웨어나 소프트웨어로 구현하기 쉬워야 했으며, 다양한 공격 기술에 대해서도 잘 방어할 수 있어야 했다.

전반적인 선정 과정은 대중적 조사와 평가에 완전히 공개되었으며, 이러한 투명성으로 인해 제출된 모든 설계안들에 대해 최적의 분석이 가능하였다. 1998년에 NIST는 미국 안보국을 포함, 세계의 암호화 단체에 의해 기본적인 분석을 받게 될 15개의 AES 후보작을 선정하였다. 여기에 기반을 두고 1999년 8월, NIST는 보다 심도 있는 2차 분석을 받게 될 다음의 5개 알고리즘을 선정하였다.

MARS: IBM 연구소 제출
RC6: RSA Security 제출
Rijndael: 두 명의 벨기에 암호학자 Joan Daemen와 Vincent Rijmen 공동 제출
Serpent: Ross Andersen, Eli Biham 그리고 Lars Knudsen의 공동 제출
Twofish: Counterpane의 존경받는 암호학자 Bruce Schneier를 비롯한 대규모 연구팀 제출

위의 다섯 개 알고리즘은 모두 ANSI C와 자바 언어를 이용, 하드웨어와 소프트웨어 중심의 시스템 모두에서, 암호화와 복호화 속도 측정, 키와 알고리즘 설정 시간, 다양한 공격에 대한 저항성 등과 같은 심도 있는 시험을 거쳤다. 그 후, 이들 알고리즘은 새로운 암호화 체계를 깨보고자 자원하는 일부 팀을 포함 세계적인 암호화 단체들에 의해 다시 한번, 자세한 분석이 이루어졌다. 그 결과, 2000년 10월 2일에 NIST는 Rijndael를 표준안으로 최종 선정하였다. 2001년 12월 6일, 미 상무부 장관은 민감하지만 비밀로 분류되지 않은 모든 문서들에 AES로서 Rijndael을 사용할 것을 규정하는 연방 정보처리 표준, 즉 FIPS 197을 공식 승인하였다.

2010년 4월 11일 일요일

외눈박이 물고기의 사랑 ...

남문서점

이미지출처 : www.ibuybook.co.kr


 

 

 

 

 

 

 

 

 

 

외눈박이 물고기처럼 살고 싶다.

외눈박이 물고기처럼

사랑하고 싶다.

두눈박이 물고기처럼 세상을 살기위해

평생을 두 마리가 함께 붙어 다녔다는

외눈박이 물고기 비목처럼

사랑하고 싶다.

 

우리에게 시간은 충분했다 그러나

우리는 그만큼 사랑하지 않았을 뿐

외눈박이 물고기처럼

그렇게 살고 싶다

혼자 있으면

그 혼자 있음이 금방 들켜 버리는

외눈박이 물고기 비목처럼

목슴을 다해 사랑하고 싶다.

 

 

2009년 11월 3일 화요일

소프트웨어를 구현한다는 것은?

소프트웨어는 무엇이라 말할 수 있는가 ?

XD1c2A1hYk.jpg

소프트웨어란 프로그램과 프로그램의 개발, 운용, 보수에 필요한 관련 정보 일체를 말한다. 소프트웨어에 프로그램 이외의 문서와 정보를 포함시키는 이유는 이들 모두가 소프트웨어 생산 행위의 결과이기 때문이다. 또한 프로그램은 프로그램 언어로 작성된 코드, 즉 정적인 표현을 의미하지만 소프트웨어는 프로그램이 컴퓨터를 가동시킨다는 동적인 의미도 포함하고 있다.

소프트웨어는 종이나 자기 디스크와 같은 유형의 매체에 저장되지만 개념적이고 무형적이다. 건축이나 자동차는 그 생산물을 보고 그 구조를 쉽게 파악할 수가 있으나 소프트웨어는 그 생산물의 구조가 코드 안에 숨어 있다. 이를 소프트웨어의 비가시성(invisibility) 이라고 한다. 소프트웨어의 다른 특성으로 복잡성(complexity)을 들 수 있다. 소프트웨어는 개발 과정이 복잡할 뿐만 아니라 전산화 대상 업무, 소프트웨어 시스템 자체가 난해하다. 소프트웨어는 수학이나 물리학에서 볼수 있는 규칙적이고 정형적인 구조가 없다. 요구나 환경의 변화에 따라 적절히 변형시킬 수 있는 특징(conformity)이 있다.

[Brooks, 1987]

소프트웨어를 정의하는 것은 어려운 일이지만 다음과 같은 특징을 가지고 있다고 본다.

  • 소프트웨어는 부드럽다(soft). 적응력이 있으며 변경되기도 한다. 기계 엔지니어들이 설계하고 구현한 물리적 장치와는 매우 다르다.
  • 광범위하게 적용될 수 있는 몇 가지 소프트웨어 규칙들이 있다. 화학 엔지니어와 전기 엔지니어들은 물리학과 화학의 기본 원칙을 따라 설계한다. 만약 소프트웨어 법칙이 있다면 아직 그것들을 발견하지 못한 것 같다. 컴퓨터 하드웨어 디자이너들은 정확한 공식을 사용하면 그들이 설계하는 칩에서 발생하는 열의 양을 계산할 수 있지만 소프트웨어 엔지니어들은 프로그램 사이즈 같은 제품 속성을 측정할 방법 조차도 합의에 이르지 못한다.
  • 소프트웨어는 대량으로 생산되지 않는다. 자동차 같은 경우는 대량 생산이 가능하다. 액세서리는 변화시킬 수 있지만 기본 디자인을 반복적으로 사용한다. 소프트웨어는 그렇지 않다. OS 같은 특정 프로그램을 복사하여 수백만 사용자들에게 배포할 수는 있지만 단 하나의 실제 프로그램만 구현해야 한다. 제조 과정에는 카피를 만드는 것이 포함되지만 또 다른 동일 제품을 구현하는 것은 포함되지 않는다.
  • 소프트웨어의 스펙은 지속적으로 변한다. 심지어 개발 사이클 후반에도 바뀔 수 있다. 절반 정도가 완성된 다리를 보고, "저기요, 내가 보기에 이 다리가 여기 보다는 저쪽에다 짓는 것이 나을 것 같은데요! " 라고 말하는 고객은 없을 것이다. 불행히도 그와 같은 요구 사항에 대한 변경 요청은 소프트웨어에는 끊임없이 발생한다.

 
소프트웨어 공학이란 ?

소프트웨어 공학이란 소프트웨어의 품질과 생산성을 향상시키기 위하여 사용자의 요구사항을 체계적으로 분석하여 설계 및 구현, 구현된 시스템의 시험 그리고 유지보수 및 폐기 시까지 소프트웨어 전수명주기 간에 걸쳐 이루어지는 체계적인 접근법을 말한다.

[Sommerville, in “Software Engineering”]

소프트웨어 엔지니어링은 신뢰성 있고 실제 머신에서도 효율적으로 작동하는 소프트웨어를 얻기 위해 올바른 엔지니어링 원칙을 확립하고 사용하는 것이다

[A Report on a Conference Sponsored by the NATO Science Committee. NATO 1969]

“The application of a systematic, disciplined, quantifiable approach to development, operation, and maintenance of software; that is, the application of engineering to software.
(소프트웨어의 개발, 운영 및 유지보수에 체계적이고, 훈련이 잘 된 정량적인 접근 방법을 적용하는 것으로,소프트웨어 개발및 관리를 공학적으로 접근하는 것을 말한다)”

[Definition by IEEE Computer Societ]

즉, 소프트웨어 공학이라는 것은 소프트웨어의 개발, 운영 및 유지 보수에 체계적이고, 훈련이 잘되고 정량적인 접근 방법을 적용하는 것을 의미하며, 이는 곧 소프트웨어에 공학적으로 접근하는 것을 말한다. 1968년10월 7일 ~ 11일 간 열린NATO 소프트웨어 엔지니어링 컨퍼런스에서 소프트웨어 위기(Software Crisis)라는 용어가 처음 언급된 이후 소프트웨어 개발에 공학적인 접근 방법의 필요성이 제기되면서 소프트웨어공학이라는 용어가 처음 소개되었으며 이후로 약간씩의 수정이 가해졌지만 소프트웨어공학의 정의는 대체로 유사한 내용을 담고 있다.

이러한 역사적 배경때문에 소프트웨어 공학의 출발은 상업용 어플리케이션이 아닌 국방 또는 정부 시스템을 개발하기 위한 요구사항들을 충족시키기 위하여 발전되었다. 실재로 소프트웨어 개발에서 체계적이고, 훈련되고, 정량화를 통한 측정 가능한 접근방식은 안정성이 최우선 가치가 되는 시스템 개발에서 아주 효과적인 것으로 증명되었다. (그러나 상업용 어플리케이션은 안정성이 최우선 되는 시스템과는 다르다.)

소프트웨어공학 관련 기술 및 지식은 다양한 분류가 가능하겠지만 2004년 IEEE 컴퓨터 학회는 소프트웨어공학 전체를 10개의 기술 분야로 분류하고 각 기술별로 필요한 상세 지식을 정의한 Guide to SoftWare Engineering Body Of Knowledge (SWEBOK 2004) 를 내놓았다. (소
프트웨어 공학자가 알아야할 지식의 범위에 대한 표준 ISO/IEC 24773) 

1. 소프트웨어 요구 사항
2. 소프트웨어 설계
3. 소프트웨어 구현
4. 소프트웨어 시험
5. 소프트웨어 유지 보수
6. 소프트웨어 형상 관리
7. 소프트웨어 공학 관리
8. 소프트웨어 공학 프로세스
9. 소프트웨어 공학 도구 및 방법
10. 소프트웨어 품질



그러나 소프트웨어 공학은 진실 또는 거짓의 개념이 아닌 유용한가/유용하지 않는가 의 개념이다. 유용한가의 여부는 해보지 않고서는 알수 없다. 무턱대로 비판없이 사용하는 것은 브룩스가 이야기한 은빛 총알과 다르지않다.

소프트웨어 라이프사이클(Software Life Cycle)
소프트웨어 라이프사이클이란 소프트웨어를 생산하기 위해 필요한 모든 활동들을 설명하는 모델을 의미한다. 소프트웨어를 개발하는 스타일이라고 할 수 있다. 비슷한 용어로 소프트웨어 프로세스(Software process), 소프트웨어 개발 프로세스(Software Development Process) 가 있다.

소프트웨어 개발의 각 단계와 절차는 어떤 입장(스타일)에서 소프트웨어를 만드느냐에 따라 조금씩 다르며, Waterfall, Spiral, Prototyping, Incremental, Evolutionary 등 여러가지 모델들이 있다.

유사한 용어인 소프트웨어 개발 방법론은 소프트웨어 공학의 원리를 소프트웨어 라이프 사이클에 적용한 개념으로 소프트웨어를 생산하기 위해 반복적으로 수행되는 작업활동, 절차, 산출물, 기법등을 체계적으로 정리한 것이다.




성공적인 소프트웨어 개발
성공적인 소프트웨어 개발은 비용, 납기, 품질 3가지 요소를 만족시킬수 있음을 의미한다.

IBM 386 메인 프레임의 아버지인 프레드 브룩스는 "No Silver Bullet" 에서 "하드웨어의 생산성과 같은 소프트웨어 개발의 생산성을 10배 향상시킬수 있는 마법과 같은 해결책은 없다" 라고 단언한다.

1994년 베일에 감추어진 SW 프로젝트의 성공과 실패에 대한 보고서로 많은 이들의 주목을 받았던Standish Group 의 정기적 보고서 통계 자료에 따르면 SW 프로젝트 성공률은 2009년을 제외하고 년간 1.7% 정도 성공률이 개선되는 것으로 보여진다. 이러한 경향이 계속된다면 2014년에는 SW 프로젝트 성공률은 50% 에 이를것으로 추정하고 있다.

   날짜 성공률
 First CHAOS 보고서  1994  16%
 "Extreme CHAOS"  2001  28%
 CHAOS  2003  31.1%
 CHAOS  2006  35%
 CHAOS  2009  32%

성공적인 소프트웨어 개발을 위하여 방법론과 도구 관련하여 엄청난 투자가 이루어 졌다.


소프트웨어 구현
소프트웨어에서의 구현(Construction)이란 소프트웨어를 구성하는 프로그램과 관련 여러 산출물들을 만들기 위하여 필요한 실무적 활동(Activity)들을 의미한다.

보통 소프트웨어 구현은 아래의 그림이 보여주듯이 소프트웨어 라이프사이클 모델에서 상세설계 > 코딩 과 디버깅 > 시스템 테스트 단계(Phase) 를 구현이라고 표현 한다.


스티브 맥코넬은 그의 저서 Code Complete 2 에서 기존의 시각과는 조금 다르게 구현(Construction)을 라이프사이클 모델의 특정 단계(Phase)가 아닌 활동(Activity)으로 보고있다.  아래 그림은 소프트웨어 개발 활동들과 연관된 구현의 위치를 보여준다.


그림에서 구현의 대부분의 활동은 코드 작성과 디버깅이며, 상세설계, 구현 계획, 단위테스트, 통합, 통합 테스트와 같은 활동들도 수반한다.

또한 스티브 맥코넬은 소프트웨어 구현은 다음과 같은 이유에서 아주 중요하다고 말한다.

구현은 소프트웨어 개발에서 큰 비중을 차지한다.
구현은 소프트웨어 개발 과정에서 중심적인 활동이다.
구현에 집중함으로써, 프로그래머 개인의 생산성을 극대화할 수 있다.
구현의 결과물인 소스 코드만이 소프트웨어를 정확하게 설명한다.
구현은 반드시 수행되는 유일한 활동이다.


참고서적 및 자료

Steve McConnell, Code Complete 2
Steve McConnell, Professional software development
Guide to SoftWare Engineering Body Of Knowledge (SWEBOK 2004)

2009년 10월 21일 수요일

구글 검색통계로 보는 Springframework 인기

여기 저기에서 스프링프레임워크를 사용하고 있는데 과현 전세계적으로 인기는 어떻까?

간단하게 구글 검색통계에서 "springframework" 검색어에 대한 지역/도시 별 관심도을 보았다.

지역별로는
한국>홍콩>인도>싱가포르>노르웨이>대만>중국>러시아>스위스>오스트리아

도시별로는
서울>Bangalore>홍콩>베이징>싱가포르>상하이>샌프란시스코>도쿄>위싱턴>뉴욕

위의 결과만 보아도 국내의 스프링 프레임워크에 대한 열기는 대단한 것으로 보인다.

언제부터 이렇게 관심이 높아졌을까를 알아보기 위해서 지역을 한국에 국한하여 검색을 해본다 결과에 따르면 2006년 부터 관심도가 급증한 것으로 보인다.









 
다른 지역들과의 비교를 위해서 이번에는 한국,미국,인도, 몇몇 지역별로 비교하여 검색해본다. 재미있는 것은 한국과 같이 눈에띄게 관심도의변화 추이가 나타나는 국가는 없다는 것이다.











너무 특정 기술을 신봉한는 듯한 모양새가 보이는 것 같기도 하다.

2009년 9월 2일 수요일

소셜 미디어 혁명

소셜 미디어는 단순한 유행에 불과한가? 아니면 산업혁명 이래 가장 큰 변화인가? 소셜 노믹스에 오신것을 환영합니다. 소셜 미디어는 웹 사용 목적에 있어 포르노 서비스를 제치고, 어느덧 NO 1 이 되었다.

2009년 8월 14일 금요일

고성능 자바 프로그래밍 - 동기화

프로세스와 스레드
프로세스는 여러 컴퓨터 프로그램들을 동시에 실행할 수 있는 컴퓨터 시스템에 의해서 순서되로 실행된는 하나 또는 그이상의 스레드로 구성된  컴퓨터 프로그램의 인스턴스이다.

컴퓨터 프로그램은 수동적인 명령(어)들의 모음이지만, 프로세스는 이러한 명령(어)들의 실재 실행을 의미한다.  예들들어 같은 컴퓨터 프로그램의 여러 인스턴스들을 시작한다는 것은 하나 이상의 프로세스가 실행된다는 의미이다.

단일 컴퓨터 CPU는 (클럭 사이클 마다)  한번에 하나 또는 그 이상의 명력(어)들을 실행한다. (슈퍼스칼라 CPU 아키텍처 참조)

사용자가 여러 프로그램을 한꺼번에 실행하려면, 단일 CPU 시스템은 시분할(time-sharing) 을 할 수 있어야 한다. 시분할(time-sharing)은 프로세스들이 실행과 실행대기 사이를 전환(switch)할 수 있게 하는데, 대부분의 경우 전환은 아주 빠르게 이뤄지기 때문에, 여러 프로세스들이 동시에 실행되는 것과 같은 효과를 제공한다. 하나 이상의 CPU 을 사용한다면 보다 실제에 근접하는 동시 실행을 가능하게 할 것이다.

자바가상머신을 프로세스라고 한다면 스레드는 자바가상머신에 의하여 수행되는 바이코드 명령들의 순서라고 볼수 있다. 스레드에는 명령들의 순서, 메소드들의 의하여 사용되는 지역변수와 인자들(런타임 스택)이 저장된다. 스레드들은 자신만의 런타임 스텍을 갖고 있기 때문에 지역변수와 인자값들은 항상 스레드에 안전하게 된다. 즉 어떤 스레드에서 다른 스레드의 러타임 스텍에 접근할 수 있는 방법이 제공되지 않는 것이다. 이러한 이유에서 힙 메모리에 저장된는 정턱 필드와 객체의 모든 필드들에 대한 접근이 없는 메소드는 다른 스레드들로 부터서 안전하게 동작할 수 있다.

스레드에 안전하다는 것(thread-safe)은 메소드가 다중 스레드 환경에서 안전하게 동작할 수 있다는 것을 의미한다. 즉 스레드는 프로세스 수준 (자바가상머신의 스텍) 에서 공유되는 데이터를 여러 다른 스레드들과 함께 안전하고 효율적으로 접근할 수 있어야 할 것이다.

동기화
스레드 안정성의 핵심에는 동기화라는 개념이 있다. 동기화란, 여러개의 스레드가 동시에 안전하게 동작할 수 있게 하는 매커니즘을 의미한다. 자바는 다음 두가지 고유한 동기화 매커니즘을 가지고 있다.
  • 동기화된(synchronized) 블럭과 함수
  • 휘발성(volatile) 변수
전통적으로 시스템의 한정된 자원이 특정 프로세스에 점유되었는지 여부를 표시하기 위하여 세마포어(Semaphore)라는 용어를 많이 사용한다. C에서는 시스템의 모든 자원들은 세마포어라는 플래그가 존재하고 이 세마포어를 먼저 획득한 프로세스 만이 리소스를 점유하여 사용하는 개념으로 사용된다.
 
세마포어는 수기신호라는 의미이다. 즉, 어떤 자원의 상태를 수기신호에 비유해 운영체제 내부에서 사용가능, 또는 사용불가의 상태를 관리하는 정도로 이해하면 된다. 시스템 관점에서는 동시에 다수의 프로세스가 동일한 자원을 점유하여 시스템이 불안정해지는 것을 방지하기 위한 개념이라고 할 수 있다.
 
자바는 이 개념을 객체에 적용하여 뮤텍스(mutex:Mutual Exclusion)라는 용어로 부른다.  즉, 동시에 하나의 객체 인스턴스에 접근할 수 있는 스레드는 오직 하나만 존재하여야 한다는 개념이다.
 
다른 말로는 객체 락(Object lock) 라고 표현하기도 하는데 각 객체에 해당하는 락를 먼저 획득하는 스레드가 해당 객체을 사용할 수 있다는 개념이다. 당연이 락(lock)을 획득한 스레드가 락을 풀어주기 전에는 다른 스레드는 그 객체를 사용할 수 없게 된다.

동기화을 사용하면 어떤 스레드가 락을 획득하든지 스레드는 주어진 변수들에 대한 단독 접근과 변경을 할 수 있도록 보호받으며, 스레드들이 다음으로 락을 획득할때 변수들이 보여지게 된다.
동기화에 가장 문제시 되는 부분은 오버헤드이다. 만일 스레드들은 서로 락을 획득하기 위하여 지나치게 경쟁을 하게 되면, 아주 비효율적으로 동작하게 된다. 락을 이용한 동기화의 또다른 문제는 어떤 이유에서 락을 가지고 있는 스레드가 지연된다면, 어떤 스레드로 락을 획득하지 못하게 된다.

휘발성(volatile) 변수는 "synchronized" 의 가시성 기능을 제공한다. (원자성 기능을 제공하지 않는다.) 이는 스레드들은 자동적으로 가장 최근에 수정된 휘발성(volatile) 변수 값을 볼수 있음을 의미한다. 아주 제안된 경우에만 사용한다면 스레드에 안전한게 동작할 것이다.
  • 자신의 현재 값에 의존하지 않는 변수에 사용.
  • 다른 변수들과 함께 변하지 않는 값으로 사용되지 않는 경우.


2009년 8월 13일 목요일

마이크로소프트 미래의 컴퓨팅 2029

마이크로소프트 Office lab 팀에서 최근 와튼 비즈니스 테크놀로지 컨퍼런스에서 공개한 미래 컴퓨팅 '2019' 비디오...

주로 MS surface와 각종 터치스크린,E-book 기기들의 광범위한 사용을 보여주고 있다.

(아래 PPT는 마이크로소프트 비즈니스 디비전 사장 Stephen Elop의 프레젠테이션 자료)