프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 죠쉬

이번엔 조금 더 프랙티컬 한 주제를 다루어 보도록 하겠다. 지인들 중 적지않은 수가 잘못 알고있는 사실중 하나인 '인증서를 사용하는 것이 가장 안전한 암호화 방법이다'가 잘못 되었다는 것에 대해 이야기해 보고자 한다. 일반적으로 블럭 암호와 공개키 방식 암호로 이야기 되어지는 - 대칭 암호(Symmetric Cryptography)와 비대칭 암호(Asymmetric Cryptography)의 용도가 다르다는 것을 설명하는 것을 통해 각 방식이 사용되기에 적합한 상황에 대한 이해를 돕고자 한다.

  1. 스파이가 목숨을 걸고 운반하는 가방엔 뭐가 들었을까?

    드라마나 영화에 가끔 등장하는 
    이 아자씨가 목숨 걸고 운반하는 저 가방에는 뭐가 들었을까낭?

    스파이 영화를 보면 꽤 자주 나오는 것 중의 하나가 목숨을 걸고 배달 해야하는 골치 덩어리 가방이 하나 있다. 배달을 맡은 스파이는 가방과 자신의 손목을 수갑으로 연결해서 개고생을 하며 가방을 운반한다. 그런데, 자세히 보면 가방이 그닥 무겁지는 않은 것 같다. 대체 그 가방안에는 무엇이 들어있을까? 비밀 정보가 들어있을까? 그럴리는 없다. 무언가 비밀을 전달해야 할 일이 있을 때마다 스파이를 보낸다는 것은 발각의 위험도 높거니와 적에게 빼앗기면 그야말로 재미없는 일이다.

    비밀 정보를 안전하게 보내는 방법중 하나는 비밀정보를 암호화 한 다음에 암호화 된 정보와 암호를 푸는데 사용되는 정보를 따로 보내는 것 이다. 적에게 둘 다 빼앗기지 않는 한 문제가 발생하지 않는다. 위험성이 절반이 되는 것 이다. 게다가 암호화된 정보를 빼앗겼다면 암호를 푸는데 사용되는 정보를 보내지 않으면 된다. 암호화된 정보가 제대로 전달 되었다면 그때 암호를 푸는 정보를 보내면 된다.

    그러나 위의 방법역시 매번 스파이가 직접 가야 하기 때문에 인적 희생이 발생할 확률이 아주 높아진다. 보내야할 정보가 있을 때 마다 적진에 스파이를 두 명이나 매번 침투 시킨다는 것은 정말 힘들고 위험성도 많은 일이다. 둘 중 하나가 잡히면 다른 하나도 잡히게 될 가능성이 압도적으로 높아져 버린다.

    그러면 어떻게 해야 안전하게 정보를 전달 할 수 있을까요? 뿌잉뿌잉~~ 무선 통신을 이용해 데이터를 전달할 수 있게된지는 무지하게 오래 되었기 때문에 데이터를 무선으로 전달하는 것 자체는 어렵지 않~아요~ 전파를 이용한 무선통신은 1880년대에 발명 되었으며, 우리가 매일매일 사용하는 CDMA 방식은 1930년대에 개발된 것 이거든요. 그러니까 정보는 무선통신으로 날릴수 있어요~ 영화에 나오는 스파이 아저씨 들이 활동하던 2차대전 당시에는 무선으로 통신하는게 드믄일은 아니었답니다. 그러니, 암호문을 푸는 정보만 스파이 아저씨가 배달하면 돼요. 결국, 스파이가 목숨을 걸고 운반하던 그 가방 안에는 디코딩을 위한 코드 - 즉 복호화 키가들어 있었을 것 이예요.

    암호화된 통신을 하기 위해서 가장 먼저 해야하는 일은 공격자들이 키를 주고 받는 것이다. 안전하게 키를 주고 받는다는 것은 굉장히 어려운 일이고 많은 수학자들이 쉽고 안전하게 키를 주고 받기 위한 노력을 해왔고, 하고 있으며, 할 것 이다.


  2. 키를 전달하기 좋은 공개키 방식의 암호

    그러면 스파이의 목숨을 걸지 않고도 안전하고 쉽게 비밀 키를 상대방에게 넘겨주는 방식이 무엇이 있을까? 라는 고민을 수많은 수학자들이 고민을 때리기 시작했다. 물론, 이러한 암호화 방식에 가장 관심이 많았던건 정부기관이었다. 비싸게 기른 스파이가 암호화 키를 넘겨주려다가 붙잡히거나 저승으로 초 장기 출장을 가버리는 일은 정부기관 입장에선 그다지 선호할 만한 일이 아니었기 때문이다.

    그렇게 수많은 수학자들이 뇌세포를 작살내며 고민을 하다가 고안해낸 방식이 비대칭키 암호화 - 공개키 암호화 방식이다. 그 전까지는 암호화 할 때 사용하는 키와 암호를 다시 원 상태로 만드는 일을 할 때 - 즉, 복호화 할 때 사용하는 키가 같은 키였다. 그렇기 때문에 키를 전달하다가 빼앗기면 그것으로 끝이었다. 그에 반해서 비 대칭키 방식의 암호는 암호화 할 때의 키와 복호화 할 때의 키가 다르다.

    일반적으로 비 대칭키 방식의 암호는 한 쌍의 키로 구성이 되어있다. 한 쌍의 키를 A와 B라고 하면, 보통 A로 암호화 한 암호문은 B로 복호화 되고, B로 암호화 된 암호문은 A로 복호화 된다. 그리고, 키 A를 이용해서는 B를 알아내기가 아주 어렵고, 마찬가지로 키 B를 이용해서 키 A를 알아내는 것 역시 아주 어렵다. 일반적으로 두 키중 하나는 공개를 하고 다른 하나는 비밀로 보관을 하며, 공개를 하는 키를 '공개키 - Public Key', 비밀로 보관하는 키를 '개인키 - Private Key'라 부른다.

    공개키로 암호화 하면 개인키로만 복호화 할 수 있습니다.
    반대로, 개인키로 암호화 하면 공개키로만 복호화 할 수 있습니다.


    그렇기 때문에 공개키 방식의 암호를 사용하면 스파이는 몸만 침투하면 된다. 그 다음에 무선이던 무선이던 상관 없이 비대칭키 방식의 키중 하나 - 보통 누구든지 원하면 얻을 수 있다는 의미로 '공개키 - public key'라 부르는 키를 얻은 다음에, 원하는 정보를 암호화 해서 보내주면 된다. 위에서 언급 했듯이 비대칭 암호는 키 한쪽을 가지고 다른 키를 알아내는 게 아주 어렵기 때문에 키 한쪽을 가져가는 건 크게 문제가 되지 않는다.

    여기까지 읽고 나면 '키를 얻으려고 시도하는 놈을 잡으면 되지 않느냐?'라는 생각이 들 것이다. 그것이 어렵다는 것을 보이기 위해, 실제로 911 테러때 테러리스트들이 정보를 주고 받기 위해 사용된 방법 이라고 주장되고 있는 방법 하나를 소개해 보겠다. JPG 포멧은 손실 압축을 하기 때문에 중간 중간에 실제 이미지 데이터가 아닌 데이터가 끼어 있어도 표시되는 이미지의 퀄리티에는 크게 영향을 미치지 않는다는 점을 이용해서, 포르노그라피 이미지에 테러와 관련된 정보를 담아두고, 그 이미지를 통해 테러 시행에 대한 정보를 주고 받았다고 한다.

    예를 들자면, 소식을 주고 받을 때 "구글에서 '홀딱벗은 그녀'로 검색해서 나오는 여자중에 탄띠를 맨 여자"의 사진에 키를 포함해 두기로 약속했다고 하자. 설령 그 사실에 대해 미리 첩보를 입수했다 해도 홀딱벗은 그녀를 검색해서 이미지를 다운 받은 미국인을 체포 한다면... 남녀 불문하고 꽤 많은 사람이 잡혀 들어가야 했을 것 이다. 나무를 숨기려면 숲 속에 숨기라는 말이 있는 것 처럼, 흔히 존재하는 정보들 사이에 비밀 키를 숨겨둔다면 쉽게 찾을 수 없을 것이며, 찾는 사람이 많은 류의 - 주로 헐벗은 남녀의 사진속에 비밀 정보를 숨긴다면 그 사진을 다운받아 가는 사람중에 진짜 불순한 의도를 갖는 이가 누구인지 확인하기도 힘들다.

    이렇게 조낸 좋은 공개키 방식의 암호가 갖는 단점은 암/복호화 하기 위한 연산량이 많고, 충분한 안전성을 확보하기 위해서는 수천 비트에 해당하는 키를 사용해야 한다는 점이다. 기본적으로 대부분의 공개키 방식은 비슷한 근본 원리를 갖는다. 가장 많이 사용되는 RSA의 경우, 두 소수를 개인키로 사용하고, 두 소수를 곱한 값을 공개키로 사용한다[각주:1]. 그렇기 때문에 공개된 키를 소인수분해 해서 두 소수를 구하면 개인키를 얻어낼 수 있다. 그렇기 때문에, 가능한 큰 키를 사용해야 공격자가 공개키를 이용해서 개인키를 구하는데 많은 시간을 투자하게 되고, 공격에 성공하지 못할 수 있다. 예를 들어 공개키가 15라면, 누구든지 개인키가 3과 5라는 걸 쉽게 알아 낼 수 있을 것 이다. 그렇기 때문에 충분히 큰 값의 두 소수를 선택해야 안전해 질 수 있다[각주:2].  이 과정에서 큰 정수의 사칙 연산을 수행해야 하는데, 계산의 대상이 되는 정수값이 크면 클수록 연산시간이 많이 걸릴 수 밖에 없다. 또한, 더 안전하게 하려면 더 큰 소수를 골라야 하며, 더 큰 소수는 더 큰 키를 요구하게 된다. 최근에 가장 많이 사용되는 키의 크기는 1024비트 이며, 2048 비트 크기의 키를 사용하는 경향이 늘고 있다.

    공개키 방식 - 인증서를 이용하는 암호화 통신 방식에서 흔히 사용하는 암호화 방식이 암호의 안전성에 있어 뛰어나다고 생각하는 사람이 많지만 사실은 같은 크기의 키를 사용하는 블럭암호에 비해 안전성은 떨어진다.128비트의 AES와 2048비트의 RSA는 비슷한 안전성을 갖는 것 으로 간주된다[각주:3]. 아래 논문은 관련된 논문이다.

    Arjen K. Lenstra, Unbelievable Security: Matching AES security using public key systems, Proceedings Asiacrypt 2001, LNCS 2248, Springer-Verlag 2001, 67–86

    다음 링크를 통해 논문의 내용을 확인할 수 있을 것 이다.

    http://www.win.tue.nl/~klenstra/aes_match.pdf 

    위의 논문은 2001년에 발표된 논문이며, 실제 컴퓨터 성능의 향상 속도는 그 당시에 예측했던 것 보다는 덜 빠르게 발전한 것으로 알려져 있으므로, 위의 논문보다는 조금정도 안전하다는 가정을 할 수 있겠지만 안전과 관련된 문제는 비관적인 관점으로 볼 필요가 있다. 어찌 되었든, 공개키는 아무렇게나 뿌려도 상관이 없기 때문에  대칭키(Symmetric Key)를 사용하는 블럭암호와는 달리 키 전달을 위해 노력을 할 필요가 없다. 

    결론적으로, 키 전달이 쉽고 키가 안전하게 전달될 수 있을 것 이라는 것 때문에 때문에 공개키 방식을 많이 사용하는 것이지, 더 안전하기 때문에 공개키 방식을 사용하는 것은 아니다. 그러므로, 키가 공격자에게 빼앗기지 않으리라는 보장이 있다면, 공개키 방식을 사용하는 것 보다는 대칭키 방식을 사용하는 것이 같은 안전도를 갖는 경우에는 키의 크기가 작아지고, 같은 크기의 키를 사용하는 경우에는 더 안전한 대칭키 방식의 암호 - 블록암호를 사용하는 편이 더 좋다. 반대로, 키가 공격자에게 노출될 위험을 갖는다면 대칭키 방식을 사용하는 것이 나쁜 선택이 될 확률이 높다 할 수 있다.


*     *     *

다른 사람에 비해 실력이 떨어지는 주제에 비슷한 분량의 글을 쓰려고 하다보니 가랭이가 찢어졌습니다. 글을 쓰고 나서 내용을 확인하고, 논문 찾고 하다보니 시간이 많이 드네요. ㅡ,.ㅡa 앞으로는 스스로의 실력을 감안해서 글의 양을 좀 줄여 보도록 하겠습니다.

다음 번에는 블럭방식의 암호화의 특징에 대해 설명하고, PGP 방식이 어떤 식으로 동작하는지에 대해 설명을 하도록 하겠습니다.

*     *     *


  1. 물론, 구체적인 내용은 조금 다릅니다만, 큰 그림 안에서는 대충 맞습니다. 자세한 내용을 알기 원하시는 분은 http://ko.wikipedia.org/wiki/RSA_%EC%95%94%ED%98%B8 나 http://www.di-mgt.com.au/rsa_alg.html 를 참고하세요 [본문으로]
  2. 실제로 큰 두 소수의 곱을 소인수 분해하여 원래의 두 소수를 구하는 것은 어려운 일 이라는 것이 수학적으로 증명되어 있습니다. 그러므로 충분히 큰 값의 키를 사용한다면 공격자가 공격에 충분히 안전합니다. [본문으로]
  3. 이 내용은 Arjen K. Lenstra 의 논문에서 제시한 내용입니다. 논문에서 저자는 컴퓨터의 속도에 따라 각 암호화 방식이 깨지는 속도의 차이가 나기 때문에 2001년 당시의 하드웨어의 속도 향상의 추세를 놓고 볼때 2030년 까지는 128비트의 AES와 2048비트의 RSA가 비슷한 정도의 안전성을 가질 것 이라고 예측 했습니다. [본문으로]

댓글을 달아 주세요

  1. Favicon of http://www.sysnet.pe.kr kevin 2012.04.07 12:01  댓글주소  수정/삭제  댓글쓰기

    본문에 "반대로, 개인키로 암호화 하면 공개키로만 복호화 할 수 있습니다." 라고 되어 있는데요. 보통 개인키로는 암호화를 안하죠. ^^ (실제로 라이브러리에 따라서 개인키로 암호화를 시도하면 오류를 내는 경우도 있습니다.) "개인키로는 '서명'을 하고 공개키로 그 서명에 대한 '검증'을 할 수 있다"는 것이 좀더 현실적인 표현이지 않을까 싶습니다. ^^

    • Favicon of https://gamedevforever.com 죠쉬 2012.04.10 12:09 신고  댓글주소  수정/삭제

      크흑! 감사합니다.

      누군가 그 글에 대해 태클을 걸어주길 바랬습니다. 사실, 그에 대한 설명을 쓰고 싶었는데 본문과는 성격이 다른 내용이라 뺐거든요. 그래서 본문에도 못 쓰고 소심하게 그림의 캡션에 넣었... ㅡ,.ㅡa

      말씀하신 대로, 개인키로 암호화 하는 것을 보고 '전자서명' 이라고 합니다. 개인키는 공개하지 않으니, 어떤 공개키로 복호화 된다는 것은 그와 쌍이되는 개인키로 암호화 했다는 증거가 되는 것 이지요.

      특히 개인 인증서에 포함되어 있는 개인키로 서명 - 암호화가 되어있다면 그 인증서를 소유한 사람이 서명했다는 증거가 됩니다. 이런 기능을 '부인방지'라 하는데, 서명을 해놓고도 하지 않았다고 우기는 것을 방지하는 공개키 방식의 부가 기능입니다.

      개인키로 암호화를 시도하는데 에러를 내는 라이브러리 라니... 개인키와 공개키를 구별하기가 쉽지 않을텐데... 인증서를 전제로한 라이브러리 인가요? 흠, 아마도 암호화 함수와 서명 함수를 따로 제공하는 모양이군요.

  2. sammy7002 2012.04.10 12:48  댓글주소  수정/삭제  댓글쓰기

    재미있게 잘 보았습니다. 좋은 글 감사합니다 ^^

  3. Favicon of http://bluekms21.blog.me 크로스 2012.05.08 16:00  댓글주소  수정/삭제  댓글쓰기

    이게 교제로 본다면 무척 괴로운 일일텐데 재밌게 잘 정리하셨네요.
    이핑계 저 핑계로 못읽어보다가 이제야 보게 되었습니다.
    저도 공개키 암호화 방식이 더 좋아서(=안전해서)쓰는 줄 알았으니 부끄럽네요.

  4. Hassooni 2012.05.24 08:39  댓글주소  수정/삭제  댓글쓰기

    PGP 키가 날라가서 암호화된 외장하드를 복구하지 못하고 있습니다.
    가능한 방법이 있을까요?