페이지

Post List

2012년 8월 10일 금요일

[computer] Google 검색, 제대로 활용하기!

 구글 검색은 정말 뛰어난 검색 엔진이다. 공부 중이나, 프로그래밍 중에 모르는 것이 생겼을 때, 구글 검색을 통해 대부분 해결책을 얻을 수 있을 정도로 말이다. 하지만 아무리 좋은 툴도 제대로 사용해야만 그 진가를 발휘하는 법! 이번에는 구글 고급 검색에 대해서 포스팅 한다.



  먼저 구글과 조금 친해져 보자.


 주소창에 www.google.com 을 치면 구글 메인 페이지가 나온다. 지금은 올림픽 기간이라 구글 메인페이지에 단순한 축구 게임이 나오지만, 구글 메인페이지는 자주 바뀌는 편이다.

 또한, 구글에는 여러가지 이스터 에그 (Easter egg)가 있다. 한번 구글 검색창에 "Do a barrel roll"을 쳐보시라. 타이핑 도중 재밌는 현상을 마주하게 될테다. 그 밖에도 "askew" 등 여러가지 트릭들이 숨어있다. 이러한 것들이 너무 재밌다면 구글에 검색을 해보길 바란다.



 이제 구글과 조금 친해졌다면, 구글 검색의 묘미를 슬슬 느껴보도록 하자.

1. 단어 검색 :

    대부분의 사용자가 구글 검색에 사용하는 것은 단어 검색이다. 예를 들어 검색창에 google tricks  같이 치는 것이다. 이 때, 구글은 googletricks가 함께 들어 있는 웹페이지, 혹은 둘 중에, 하나의 단어만 포함하는 페이지들도 검색을 해준다. 물론, 유사어 까지 검색이 되기도 한다.

2. 구 검색 :

    검색을 해보면 알겠지만, 위의 단어 검색은 두 단어사이가 떨어져 있는 것들도 검색을 하기 때문에 정확한 정보를 찾기 힘들 수 있다. 두 단어가 순서대로 붙어 있는 것을 찾고 싶을 때, 가능한 것이 바로 구 검색이다. 이는 별로 어렵지 않게, 하나의 구를 쌍따옴표로 묶어주면 된다. 즉, "google tricks", 이렇게 말이다.

3. I'm Feeling Lucky :

    I'm Feeling Lucky 버튼은 검색어와 가장 연관있는 페이지로 바로 이동하는 기능을 가지고 있는 버튼이다. 검색창에 검색어를 치다보면 밑에 자동완성 단어들이 뜨게 되는 데, 마우스를 가져다 대보면 오른편에 I'm Feeling Lucky라고 뜨는 것을 볼 수 있을 것이다. 이 것을 클릭하면 바로 연관 페이지로 이동한다.

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

그렇다면 이제, 구글 검색의 기본 연산자들을 알아보자.

1. AND

    AND는 구글 검색에서 따로 지원하지 않는다. 일상적으로 검색하는 것을 and로 받아들이면 된다.

2. OR

    OR 연산자는 검색창에 A OR B 또는 A | B 로 작성한다 (주의! OR은 대문자로만 써야한다). 이는 말그대로 A 또는 B를 포함하는 페이지들을 검색해 주게 된다. 한가지 유의 사항이 있다. 보통 프로그래밍을 해본 사람이라면, AND와 OR이 뒤섞인 경우 AND 부터, 그리고 다음으로 OR을 수행하는 것을 순서로 알고 있을 것이다. 하지만 구글 검색에서는 AND가 먼저고, OR이 다음인 것이 아니라, 항상 왼쪽에서 오른쪽으로 인식을 하니 검색 시 주의하도록 하자.

3. NOT

    NOT 연산자는 검색창에 A -B 로 작성한다. '-' 와 검색에서 제외할 단어 B 사이에는 공백이 존재해서는 안된다. NOT 연산자를 활용한 위의 예시의 의미는 "B를 포함하지 않는 A를 검색"하라는 의미다. 어떤 단어 또는 구를 검색했을 때, 원하는 것과 다른 WORD에 대해서 주로 나온다면, 검색창에 추가로 -WORD를 써서 검색 결과를 줄일 수 있다.

4. 유사어 검색 '~'

 고급 연산자에 들어가기 전에, 한가지 더 알아둘 연산자가 있다. 바로 "유사어 (Synonym) 검색"이다. 예로, computer와 유사한 모든 단어를 검색하고 싶을 때, ~computer를 검색창에 타이핑하면 된다. 그러면 computer 뿐만 아니라, hardware, pc, laptop 등 computer와 관련된 모든 단어들을 검색해 준다.

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

  그렇다면 이제, 구글 검색의 고급 연산자에 대해서 알아보자. 참고로, 구글이 지원하는 고급 연산자의 종류는 여기서 설명하는 것보다 훨씬 많다. 블로그에는 가장 많이 사용할 법한 것 8개 (intitle, inurl, intext, filetype, site, link, numrange, define)에 대해서 정리할 것이므로, 이 외에도 궁금하다면, 구글에서 google operators를 검색해보기 바란다.


0. 문법

    고급 연산자를 사용하기 위한 문법은 아주 쉽다. 검색하고자 하는 것을 WORD라고 하면, 문법은 operator:WORD 이다. operator는 이제 설명할 연산자의 이름으로, 유의깊게 봐야 할 것은 operator와 콜론 (:), 검색어 WORD사이에는 어느 공백도 없다는 것이다.

1. intitle

    intitle 연산자는 페이지의 제목에서 검색한다. (ex. intitle:maple)

2. inurl

    inurl 연산자는 url에서 검색한다. (ex. inurl:rose)

3. intext

    intext 연산자는 페이지의 text, 즉 내용에서 검색한다. 보통의 구글 검색은 제목, url, 내용 등을 통틀어 검색하는 반면, 고급 연산자를 사용하면 원하는 부분에서 검색을 할 수 있다. (ex. intext:strawberry)

4. filetype (=ext)

    filetype 연산자는 특수한 파일 종류를 검색해 준다. 예를 들어 cryptography와 관련된 pdf 파일을 찾고 싶다면, filetype:pdf 또는 ext:pdf와 cryptography를 검색창에 써서 파일들을 찾을 수 있다. 이 외에도 원하지 않는 파일 형식을 제외하는 것으로 검색 결과를 줄일 수도 있다. (ex. cryptography filetype:pdf)

5. site

    site 연산자는 url 검색과 비슷하지만, 서버 이름를 검색어로 받아 이에 관련된 페이지들을 검색해준다. 예를 들어, site:google.com으로 검색을 해본다면, images.google.com, www.google.com/finance 등등 여러 사이트가 결과로 나올 것이다. (ex. site:google.com)

6. link

    link 연산자는 url이나 서버 이름를 검색어로 받아서, 페이지들 중 검색어와 연결된 링크가 있는 페이지들을 검색한다. 다만 link를 가지고 검색을 해보면 하이라이팅되는 부분이 없어 조금 헷갈릴 수도 있겠다. link된 것을 직접 확인하기 위해서는 검색된 페이지의 소스코드를 참조하면 된다. 소스코드를 보는 방법은 Chrome의 경우, 도구-소스 보기를 클릭하면 된다. (ex. link:google.com)

7. numrange

    numrange 연산자는 작은 수와 큰 수 사이의 범위를 검색해 준다. 사용법은 두가지 방법이 있는 데, numrange:100-200 같이 작은수와 큰수를 대시로 연결하여 사용하는 법과 좀 더 축약하여 그냥 100..200 처럼 쓰는 방법이다. (ex. numrange:1-2, 1..2)

8. define

    define 연산자는 검색어의 정의를 검색한다. 내 경우에는 용어 대부분은 그냥 wikipedia에서 찾기는 하지만, 간단한 단어의 뜻 같은 것은 define을 이용하여 쉽게 검색할 수 있다. (ex. define:wikipedia)

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

 지금까지 구글의 기본 검색, 기본 연산자 및 몇가지 고급 연산자를 다루었다. 이 정도로도 충분히 지금보다 더 훌륭한 검색을 할 수 있을 것이다.

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

+ URL 직접 다루기

  구글에서 검색창에 검색어를 써 넣으면 자동으로 url이 생성되면서 검색 결과를 보여준다. 이 url을 수정함으로써 검색 결과를 바꿀 수도 있다. 이에 관해서는 url 문법들과 어떤 변수가 필요한 지도 새로 알아야 하기 때문에 자세한 것은 생략한다. 간단하게 소개를 하자면, &lr=langko 를 검색 url 뒤에 추가하여 한국어로 된 페이지만 검색을 할 수도 있으며, &restrict=countryKR 을 추가하여 페이지 주소가 "한국"인 페이지만 검색할 수도 있다.

2012년 8월 8일 수요일

[cryptography] Cryptography 3.(1) - Block cipher

 일과 올림픽 때문에 내 블로그가 죽어가고 있었다.. 그동안 정리하려고 자료들을 모아두기만 하였기에 이제 시간을 내서 몰아서 정리를 해야겠다.

 이번엔 Block cipher에 대해서 정리를 해본다.

 Block cipher에는 DES, 3DES, AES 등이 있다. 사실 무선 공유기를 설정할 때에, 어떤 암호화 기법을 사용할지 선택을 해야하기에, 이러한 예의 이름은 상당히 익숙하다. 물론 어떻게 암호화가 되었는지는 이제까지는 몰랐지만 말이다. cryptography 3번째 강의는 이 block cipher에 관한 내용이다. 양이 적지 않기 때문에, 2~3 부분으로 나누어 정리한다.

 이번 강의의 첫번째 부분의 내용을 요약하면 아래와 같다.
  1. Block cipher 개요
  2. Pseudo Random Function (PRF), Pseudo Random Permutation (PRP)의 정의
  3. Secure PRF 정의
  4. Example : DES
 그러면, 하나하나 정리를 시작한다.


1. Block cipher 개요


 Block cipher는 n bits의 Plain Text (PT, 평문)을 k bits의 key를 통해서 암호화를 시켜 역시 n bits의 Cipher Text (CT, 암호문)을 만들어 낸다. 여기까지는 Stream cipher와 크게 다를 바가 없어 보인다. 하지만 이제 곧 알게 되겠지만, Stream cipher와는 암호화 방법에서 차이점이 있다.

 이제, Block cipher에서 암호화하는 방법을 살펴보자.


 위의 그림은 Block cipher의 암호화 방법을 도식화한 것이다. 찬찬히 살펴보면, 먼저 key를 확장시켜서 총 n개의 key를 생성해 낸다. 그러면 텍스트와 key를 인풋으로 받는 R (round function)을 총 n번 거치면서 평문 m은 c로 암호화된다. 지금은 조금 받아들이기 힘들 수 있으나, 마지막에 DES에 대한 예를 살펴보면 확실히 와 닿을 것이다.


2. Pseudo Random Function (PRF), Pseudo Random Permutation (PRP)의 정의

 PRF와 PRP는 block cipher의 암호화 과정의 round function을 엄밀하게 정의한 개념들이다. PRF는 좀더 일반적인 개념이고, Block cipher에서 필요한 것은 PRF의 좀더 특별 케이스인 PRP이다.


 PRF의 정의는 상당히 단순하다. 위에 나타난 것처럼, K와 X를 Y로 대응시켜주는 함수 F가 PRF인데, 조건은 이 F(k, x)를 평가하는 효과적인 알고리즘만 있으면 된다. 한마디로 k와 x를 가지고 효과적으로 F(k, x)를 뽑아내면 된다는 것이다.

 이제 PRF를 정의했으니 PRP를 정의해보자.


 PRP는 PRF의 좀더 특별한 케이스이다. 공역이 줄어들고, 조건이 몇가지 더 붙었다. 먼저 PRF의 조건에서 결정적이라는 단어가 추가되었다. 이 말은 즉, k와 x를 주면 E(k, x)는 하나로 결정된다는 것이다. 그리고, 추가적으로 key k가 주어졌을 때는 1대1 대응함수가 된다. 감이 오는가? PRP는 말 그대로 X에서 X로 K에 따라서 순서를 뒤섞어 주는 함수이다. 물론 마지막 조건, 효과적인 역함수가 존재해야 하는 것은 암호의 특성상 당연히 필요하다.


3. Secure PRF 정의

 PRF가 무엇인지 알았다면, 이제 안전한 PRF가 무엇인지 정의를 해야 PRF를 사용하는 Block cipher가 안전한지 아닌지를 알 수 있을 것이다.


 Secure PRF의 정의를 위해 두가지 집합을 새로 정의했다. Funs[X, Y]와 S_F이다. S_F는 모든 Key에 대한 PRF (F)의 집합으로 정의했다. 여기서 포인트는 모든 함수의 집합에서 임의로 선택된 함수와, S_F에서 선택한 임의의 함수가 서로 구별할 수 없다는 부분이다. 이 명제가 성립해야만 이 PRF가 안전하다는 것이다. "구별할 수 없다"에 대해서는 앞서 포스팅한 2.(2)의 PRG Security 부분을 참고하시라.


 4. Example : DES

 이제 마지막으로, DES (Data Encryption Standard)에 대해서 살펴본다.

 DES는 1970년대 초반, IBM의 Horst Feistel이 고안한 Lucifer로 부터 시작된다. 1973년, IBM에서는  NBS (National Bureau of Standards, 미국 표준 규격국)의 block cipher 제안 요청에 따라 Lucifer를 조금 변경하여 제출하였다. 이 것이 DES이며, 1976년에는 연방 표준으로 자리 잡게 되었다. 하지만 1997년, 무차별 대입으로 인해 암호가 깨지면서 보안성에 문제가 제기되었고, 2000년에는 AES가 DES를 대신하게 된다.

 그럼 이제, 이 DES의 원리를 살펴보자. DES의 핵심은 바로 Feistel Network이다.

 위의 그림에서 f1, f2, ..., fd는 바로 다음에서 설명을 하겠다. 먼저 그림을 보면 대강 Feistel Network가 어떤 것인지 감이 올 것이다. 먼저 input은 n bits 짜리 text 2개이다. 첫번째 round function을 지날 때, L1은 R0가 그대로 들어오고, R1은 L0와 f1을 통과한 R0와의 XOR 연산된 값이 들어오게 된다. 이런식으로 반복하여 d번째 결과가 곧 output이 된다.

 항상 암호에서 중요한 것은 역연산이 가능한가이다. 위의 network를 보면 복잡하여 역연산이 불가능해 보일 수도 있지만, 역연산은 생각보다 간단하게 똑같은 회로에서 f1부터 fd까지의 순서만 바꾸면 된다. 결과적으로 추가적인 회로 없이도 역연산을 할 수 있기 때문에 효율적이라 할 수 있겠다.

 여기서, 중요한 정리를 하나 소개한다.


 앞에서 우리가 정의 했던 것은 secure PRF였다. 위의 정리는 key 3개를 사용한 Feistel이 secure PRP이다 라는 것이다 (자세한 증명은 위의 논문 참조). 이는 3DES가 안전하다는 것의 밑바탕이 된다.

 아무튼, 이제 위의 Feistel Network에서 설명을 넘어갔던 f1, f2 ... fd에 대해서 설명을 한다. 이 설명에서 R0, L0 등은 32 bits, 그리고 각 key들은 48 bits를 사용한다고 가정한다.


 수식으로 나타낸다면, f (x) = F (k, x) 정도 이겠다. 먼저 함수 E는 주어진 32 bits 데이터를 확장 및 뒤섞는 역할을 한다. 그 결과 key의 크기와 같은 48 bits 데이터가 나오며, 이는 key와 XOR 연산이 된다. 이는 각 6 bits 씩 나누어져서 S box 들을 통해 4 bits의 데이터로 축소되고, 이것이 다시 모여 32 bits 데이터를 이룬다. P는 단순히 뒤섞는 역할을 하여 결과적으로 32 bits 데이터를 내놓는다.

 한가지 주의할 점이 있다. S box는 6 bits를 4bits로 축소하는 역할을 하는 데, 이 것이 linear 해서는 절대로 안된다. 만약 linear일 경우, 전체 DES cipher 자체가 linear하게 된다.

( m이 64 bits, n이 16이라 하면 각 k가 48 bits 이므로 총 832 bits )

 이렇게 되면 몇개의 암호문만 알게 된다면, 손쉽게 key를 복구할 수 있기 때문에, 암호의 보안성은 사라지게 된다고 한다.






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