2012년 9월 26일 수요일

쓰레드(Thread)

<생성방법>

1. Thead 클래스의 상속


Class ThreadClass extends Thread {
    public void run(){ 
        System.out.println("쓰레드가 실행되었습니다");     
    }
}

Class ThreadTest {

  public static void main(String[] args){
     ThreadClass threadClass = new ThreadClass();
     threadClass.start();
     //start하면 쓰레드에게 cpu가 할당되었을때 run()이 실행된다
  }
}

2. Runnable 인터페이스 구현


Class RunnableClass implements Runnable {
    public void run(){ 
        System.out.println("쓰레드가 실행되었습니다");     
    }
}

Class ThreadTest {

  public static void main(String[] args){
     Runnable runnableClass = new RunnableClass();
     Thread thread = new Thread(runnableClass);
     thread.start();
  }

}

* 상속을 이용한 Thread 클래스는 다른 클래스를 상속할 수 없지만(이미 쓰레드를 상속하고있기 때문에, 인터페이스를 구현한 Runnable 클래스는 다른 클래스를 상속할 수 있다.


<생성자>


1. Thread()
2. Thread(String s)
3. Thread(Runnable r)
4. Thread(Runnable r, String s)

s : 쓰레드 이름
r  : Runnable Interface를 구현한 Class


<메소드>

1. static void sleep(long msec) : 
  msec에 지정된 밀리초 동안 대기

2. static void sleep(long msec, int nsec) : 
    msec에 지정된 밀리초 + nsec에 지정된 나노초 동안 대기

3. String getName() : 
    스레드의 이름을 반환

4. void setName(String s) : 
스레드의 이름을 s로 설정

5. void start() : 
스레드를 시작시킨다. run() 메소드를 호출

6. final int getPriority() : 
스레드의 우선순위를 반환

7. final void setPriority(int p) : 
스레드의 우선순위를 p 값으로 설정

8. boolean isAlive() : 
스레드가 실행 가능 상태, 실행상태, 대기상태에 있으면 true를 그렇지 않으면 false를 반환

9. void join() throws InterruptedException : 
스레드가 끝날 때까지 대기

10. void run() : 
스레드가 실행할 부분을 기술하는 메소드, 하위 클래스에서 오버라이딩 되어야 한다.

11. void suspend() : 
스레드가 일시 정지된다. resume()에 의해 다시 시작될 수 있다.

12. void resume() : 
일시 정지된 스레드를 다시 시작시킨다.


이외에는 JAVA API 의 Thread 클래스 참조.
 - JAVA7 API : http://docs.oracle.com/javase/7/docs/api/ 

<생명 주기>


1. 쓰레드 객체가 생성되면 쓰레드는 메모리에 올라간다.

2. start() 메소드가 호출되면 실행가능 상태가 된다.(cpu 할당대기)

3. cpu가 할당되면 run() 메소드를 실행하며 실행상태가 된다.

4. cpu할당 시간이 종료되거나, yield() 함수가 실행되면 다시 실행가능 상태로 변한다.

5. sleep(), join(), 입출력 등을 요구하게되면 쓰레드는 대기상태로 전환되고, sleep time이 말료되거나, join() 할 쓰레드가 종료, 입출력 종료, notify(), notifyAll() 메소드가 호출되었을시에 실행가능 상태로 전환한다.

6. 해당 쓰레드의 코드가 모두 실행되었을 경우에는 종료된다.




2012년 9월 23일 일요일

비제네르 암호 공략에 대한 결론.


방법1의 약점은 완성된 영어 문장을 사용하므로, 암호문 작성에 이용되는 키 단어가 문자의 통계적인 정보로 공격 당할 수 있는 취약성을 가지고 있다는 것이다. 그러므로 무작위로 선택한 문자들로 만든 무한 수열을 키 단어로 사용하면, 키 단어에서의 통계적인 데이터는 아무 의미가 없게 된다. 예를 들어 확률적으로 고르게 나오는 26면(영어 문자가 26자이므로)을 가진 상상의 주사위를 사용한다. 이 무작위 문자열로 만든 수열을 문자벌레(worm of letters)라고 한다.

이러한 문자벌레는, 암호문으로부터 평문의 어떤 단일문자도 예측할 수 없게 하는 임의의 부분 수열을 가지고 있다. 만약 이 문자벌레를 사용해 평문을 암호화한다면, 암호문은 단순히 문자들의 무작위 배열에 불과하다. 비록 Mr. X가 충분히 많은 양의 평문과, 방법2를 이용하여 암호화한 암호문을 가지고 있다하더라도 그 것들로부터 암호공격에 필요한 아무런 정보도 얻지 못할 것이다. 다시 말하면 이 방법은 완벽한 안전성, 즉 이론적으로 완벽한 안전성을 가지고 있다. 이러한 완전 시스템에 대해서는 다음 번에 다룰 것이다.

 알았다. 그러면 모든 비제네르 암호가 깨지는 것은 아닐까?  앞 절에서 소개한 비제네르 암호 공격법은 비교적 짧은 키 단어를 사용한 경우에만 효율적이다. 결론적으로 말해서 긴 키 단어를 사용한 비제네르 암호는 비교적 안전한 암호화 방법이 된다. 즉 키 단어의 길이가 길면 깨기가 어려워진다.

그러면 어느 정도 긴 키 단어가 안전할까? 극단적으로 말하자면 암호화할 때, 평문의 문자수와 같은 정도로 긴 키 단어를 사용하면, 앞 절에서 이용한 방법으로는 키 단어를 알아 낼 수 없다.

다음 두 가지 방법을 사용하여 키 단어를 만들면, 암호공격자들이 암호를 공격하는데 아주 어려울 것이다.

  방법1.
어떤 책에 있는 문장을 키 단어로 사용한다. 그러한 키는 관리하기가 쉬워 평문을 암호로 바꾸는데 아주 유용하다. 다음 문장은  에드가 알렌 포우(Edgar Allen Poe)의 ``황금벌레" 에 나오는 것이다. 수신자는 암호를 복호화하기 위해, 키 단어로 사용된 이 긴 문장을 따로 보관할 필요가 없고, 단지 저자와 책이름만을 기억하면  된다.

Many years ago, I contracted an intimacy with a Mr. William Legand. He was of an ancient Huguenot family, and had once been wealthy;  but a series of misfourtunes had reduced him to want. To avoid the morfication censequent upon his disaster, he left New Orleans, the city of his forefathers, and took up his residence at Sullivan's Island, near Chalston, South Carolina ...

몇년 전 나는 윌리엄 리젼드라고 하는 한 남자와 교분을 가진 적이 있습니다. 그는  위그노 교도였으며 한 때는 아주 부자였습니다. 그러나 계속된 불행은 그를 아주 궁핍하게 만들었습니다. 꼬리를 물고 일어나는 재앙을 피할 생각으로 그는 조상대대로 살아 왔던 뉴올리언즈를 떠나 사우스캐롤라이나의 샬럿 근처에 있는 설리번 섬에 정착하였습니다.

 이렇게 긴 키 단어를 사용하면  어떠한 방법을 써도 키 단어의 길이를  구할 수가 없다. 하지만 이 키 단어도 역시 영어 문장이므로, 암호문을 공격하는데 중요한 통계적 데이터(예를 들어 문자의 출현빈도)를 완전히 없앨 수는 없다. 그러므로 매우 영리한 암호공격자는 그러한 암호도 깰 수 있다. 이 방법을 이용한 암호문은 1920년에 프리드만에 의해 처음으로 깨졌다.

 방법2.
방법1의 약점은 완성된 영어 문장을 사용하므로, 암호문 작성에 이용되는 키 단어가 문자의 통계적인 정보로 공격 당할 수 있는 취약성을 가지고 있다는 것이다. 그러므로 무작위로 선택한 문자들로 만든 무한 수열을 키 단어로 사용하면, 키 단어에서의 통계적인 데이터는 아무 의미가 없게 된다. 예를 들어 확률적으로 고르게 나오는 26면(영어 문자가 26자이므로)을 가진 상상의 주사위를 사용한다. 이 무작위 문자열로 만든 수열을 문자벌레(worm of letters)라고 한다.

이러한 문자벌레는, 암호문으로부터 평문의 어떤 단일문자도 예측할 수 없게 하는 임의의 부분 수열을 가지고 있다. 만약 이 문자벌레를 사용해 평문을 암호화한다면, 암호문은 단순히 문자들의 무작위 배열에 불과하다. 비록 Mr. X가 충분히 많은 양의 평문과, 방법2를 이용하여 암호화한 암호문을 가지고 있다하더라도 그 것들로부터 암호공격에 필요한 아무런 정보도 얻지 못할 것이다. 다시 말하면 이 방법은 완벽한 안전성, 즉 이론적으로 완벽한 안전성을 가지고 있다. 이러한 완전 시스템에 대해서는 다음 번에 다시 다루기로 한다.


비제네르암호 공략법 - 2 - <프리드만의 암호공격>


이 방법은 1925년 미국의 유명한 암호 해독가인 프리드만(Willam Frederick 프리드만)이 고안했다. 이 테스트의 요점은 바로 『암호문에서 임의로 두 문자를 선택했을 때, 두 문자가 서로 같을 확률은 얼마인가?』 이다. 이 값을 일치지수(index of coincidence)라고 한다.

 개의 문자들로 이루어진 문자열이 있고,

 은 a의 개수,  는 b의 개수, ... ,  은 z의 개수라고 하자.

우선 임의로 두 문자를 택하였을 때 두 문자 모두 a일 확률은 얼마일까?

첫번째 문자가 a일 확률은  이고 두 번째 문자도 a일 확률은  이다.

선택하는 순서는 관계없으므로, 두 문자가 모두 a일 확률은 단순히 두 확률 값을 곱하여

 이다.

그러므로 임의로 선택한 두 문자가 서로 같을 확률은

 이다.

이 값을 일치지수(index of coincidence)라고 하고  로 나타낸다. 프리드만 자신은 κ로 표기했었고, 그런 이유로 Kappa 테스트라고 부르기도 한다.

이제 다른 방법으로 일치지수를 계산해 보자.

자연언어에서 사용하는 문자는 모두 고유의 확률(출현빈도)을 가지고 있다.
a는 확률  을, b는 확률  를, , z는 확률  을 가지고 있다.
영어의 경우 이 확률들은 1장에서 통계적 분석에 의한 암호공격에서 설명했었다.
다루고자 하는 문서에서 임의로 두 문자를 택하였다고 하자.

첫 번째 문자가 a일 확률은  이므로 두 문자 모두 a일 확률은  이다.
(정확히 말하자면 처음의 확률과 두 번째 확률은 아주 미세하게 다르지만 문서가 충분히 길다면 무시해 좋을 정도의 차이이다).

다른 문자의 경우도 마찬가지이므로, 임의로 선택한 두 문자가 서로 같을 확률은
 이다.

당연히 이 값은 국가 혹은 사용언어에 따라 다르다. 예를 들어

● 영어에서는
 이다.

즉 영어 문장에서 임의로 선택한 두 문자가 같아지는 경우가 약 6.5% 라는 의미이다.

● 한편 모든 문자의 출현빈도를 같게 조절해 놓은 이상적인 문서가 있다고 하자. 모든 문자의 확률은
 과 같으므로
??img5.gif 이다.

이처럼 모든 문자들을 잘 섞어 놓은 문서에서 두 문자가 서로 같아질 확률은, 아무런 의도가 없는 평범한 영어문서의 경우와 비교하면 약 절반이 된다.

?비제네르 암호로 작성한 암호문에서 일치지수는 어떻게 되어 있을까?

● 공격하고자 하는 암호문에서 각 문자들의 출현빈도(확률)  , ,  들은 모두 세어보면
간단하게 알 수 있다.어떤 문자의 출현빈도가  이고 값이 적절히 크다면,
 은  과 근사하다고 볼 수 있다.

즉 이 확률들의 제곱의 합은 거의 일치지수와 같아질 것이다: 즉

● 문서를 작성할 때 특정한 문자를 집중적으로 사용하면  값은 커지고, 문자들의 빈도를
의도적으로 균등하게 조절했다면 작아질 것이다. 증명은 하지 않겠지만 일치지수의
최소값은 0.038 이다.

● 잠시 단일문자 암호로 되돌아가자. 단일문자 암호는 단순히 문자들을 재배열한 것이므로 암호문과 평문의 일치지수는 달라지지 않는다. 예를 들어 평문에서 a의 확률이 0.082 이었다면, 이 값은 a에 대응하는 암호문자 x의 확률이 된다. 즉 각 문자의 확률도 역시 재배열되므로 전체 제곱의 합은 변하지 않는다. 결국 단일문자 암호에서 일치지수는 변화하지 않는다.

● 한편 다중문자 암호에서는 문자의 출현빈도를 균등화하였으므로 일치지수가 감소한다. 그러므로 어떤 암호문의 일치지수를 계산해 보면 단일문자 암호를 사용했는지 아닌지를 판단할 수 있다. 만약 일치지수가 0.065에 가까우면 단일문자 암호를 사용한 것이고, 0.065보다 현저하게 작으면 아마 다중문자 암호를 사용했을 것이라고 추측할 수 있다.

다시 비제네르 암호로 돌아와 키 단어의 길이를 알아내는 데 일치지수를 어떻게 사용하는지 알아보자. 비제네르 암호는 다중문자 암호이므로 당연히 일치지수가 0.065보다 작아진다. 그러나 얼마나 작아지는가? 대답은 『키 단어의 길이 에 따라서 달라진다』이다.

암호문에서의 일치지수를 이용하면 키 단어의 길이를 알 수 있다. 공식을 유도하기 위해 지금부터 약간 수학적인 계산을 하겠다. 어려운 계산은 아니지만 혹시 수식에 지루함을 느낀다면 이 절 끝에 있는 결론으로 건너 뛰어도 괜찮다.

 을 키 단어 길이라고 하자. 간단하게 하기 위해 키 단어는 중복되지 않는 문자들로 되어 있다고 한다.

우선 암호문을  개의 열로 배열하여 놓는다. 그러면 1,  ,  ,  번째 문자들이 ?첫번째 열에 오게 되고 이 문자들은 모두 같은 키 단어 문자로 암호화된 것이다.

마찬가지로 두번째 열의 문자들은 키 단어의 두번째 문자로 암호화되어 있다(그림 2.4).

키 단어 문자들



그림 2.4 비제네르 암호의 일치지수

이제 이 형태를 잘 관찰하면 일치지수를 계산할 수 있다.

첫번째 관찰 : 각각의 열은 단일문자 암호이면서 더하기 암호이다. 그러므로 각 열의 일치지수
는 0.065 이다.

한편 서로 다른 열에서 두 문자를 선택할 경우에는 서로 다른 더하기 암호를 무작위로 사용한 것이므로, 두 문자가 서로 같아질 확률도 그야말로 우연에 의한다. 일치지수는 당연히 0.065보다 작아질 것이고, 이 절에서는 0.038이라고 가정한다.
만약 키 단어 문자열이 아주 무작위로 선정되어 있다면 정확히  이다. 그러나 키 단어를 아주 긴 문장, 예를 들어 어떤 책에 있는 문장으로 했다면 이 값은 약간 커질 것이다.)

두번째 관찰 : 이제 한 쌍의 동일 문자들을 전체 문장에서 임의로 선택하는 경우의 수를 계산
해 보자. 을 전체 문자의 수라고 하면 각 열에는 개씩의 문자가 있다. 문서가 충
분히 길다고 하면 소수점 이하는 무시해도 된다.

우선 선택한 문자들이 같은 열에 있을 경우는 몇가지일까? 첫 번째 문자는 전체 문장의 n개 문자에서 하나를 선택하므로 n가지이고, 두번째 문자는 첫번째 문자가 선택된 열에서 다시 동일한 문자를 선택해야 하므로, 두번째 문자를 선택하는 경우의 수는  이다. 그리고 두 문자를 선택하는 순서는 무시해야 하므로 ?같은 열에서 같은 문자 쌍을 선택하는 경우의 수는

 이다.

이제 서로 다른 열에서 같은 문자를 선택하는 경우의 수를 계산해 보자. 앞의 경우와 마찬가지로 우선 첫 번째 문자를 선택하는 경우의 수는 역시 n가지이다. 두 번째 문자는 첫 번째 문자가 속한 열을 제외한 다른 열에서 선택해야 하므로 모두  가지이다. 그러므로 서로 다른 열에서 같은 문자를 선택하는 경우의 수는 모두

 이 된다.

위 사실들을 종합해 보면, 임의로 두 문자를 선택했을 때 같은 문자일 경우의 기대값
img7.gif 이다.

임의로 두 문자를 선택했을 때 서로 같을 확률은, 기대값을 전체 문자 선택 경우의 수로 나누어서,
img8.gif

이다. 마지막으로 일치지수는 이 확률값과 거의 근사하므로

img9.gif이다.

키 단어의 길이를 ? 에 관하여 다시 정리하면

img10.gif 이다.

수식이 다소 복잡하고 이끌어 내는 과정이 길지만 실제 적용할 때는 마지막 수식만 사용하면 되니까 어려울 것은 없다.

전체 문자 수와 각 문자들이 나타나는 횟수를 세고 나면  는 자동으로 계산된다! 그리고 신기한 것은 아주 적은 문자수를 가진 문서에서도 값은 거의 정확하게 알아낼 수 있다는 점이다.

지금까지의 내용을 앞의 예에 적용해 보자. 문자와 빈도수를 계산해 보면
 이므로

임을 알 수 있다. 그러므로 이 식에서 키 단어의 길이  은


이고 5, 10, 15, 20 가운데 5가 키 단어의 길이이다.

키 단어 확정
키 단어의 길이를 알았으므로 키 단어가 무엇인지 알아내는 것은 쉽다. Mr. X는 문자들을 키 단어의 길이에 맞추어서 개의 열로 다시 쓴다. 각 열을 기준으로 하면 같은 키 단어 문자로 암호화했으므로 단일문자 더하기 암호이므로 1장의 암호공격법을 번 반복하면 된다. 그림 2.2의 열에서 가장 많이 나타나는 문자는 Z이고, 평문에서 가장 많이 사용하는 문자인 e가 암호화된 것으로 추측할 수 있으므로 키 단어의 첫 문자는 V이다.

나머지 키 단어도 같은 방법으로 찾아 낼 수 있다.



출처 - http://system.kcu.ac/opendept/crypto/sub/sub02_2.htm

블로그 보관함