이 포스팅은 Stanford University 의 Cryptography I - Dan Boneh 강의를 바탕으로 제작되었습니다. 제가 머신러닝을 공부하면서 Coursera를 사용하였는데, 그곳에서 암호학(Cryptography) 강좌를 발견하게 되어 기쁜 마음으로 수강을 신청하였습니다. 더불어서, Andrew Ng교수님의 머신러닝 강의를 한국어로 잘 정리하여 포스팅하신 헐멍님의 블로그를 굉장히 잘 참고하였던 독자이기에, 저도 Cryptography를 공부하시고자 하는 분들을 위해 조금이나마 기여할 수 있을까하여 포스팅을 지속하기로 결정하였습니다.

향후 진행될 강좌 일정은 
Week 1 : Course overview and stream ciphers
Week 2 : Block Ciphers
Week 3 : Message Integrity
Week 4 : Authenticated Encryption
Week 5 : Basic Key Exchange
Week 6 : Public-Key Encryption
Week 7 : Final exam 
으로 진행됩니다. 이 강좌가 끝나면 아마 Cryptography 2 를 진행할 계획입니다.
(수정: 예상대로 2016년 여름부터 Cryptography 2 가 개강되었네요. 지금 진도가 더디긴해도 2까지 한번 달려보겠습니다.)


암호학(Cryptography)는 컴퓨터 시스템에서의 정보보호를 위해 필수불가결(indispensable)한 요소입니다. 이 강좌에서는 암호학적인 원시함수들의 내부적 작동원리와, 이를 어떻게 올바르게 활용할 수 있을지에 대해 배웁니다. 강의를 수강하시는 분들은 암호학을 통한 보안의 원리와, 이를 어떻게 실제 시스템에서 적용할 수 있을지에 대해 깨닫게 되실 것으로 기대합니다. 수업은 먼저 두 이용자간의 통신에서 비밀키(secret key)를 사용하여 도청이나 트래픽 침입 공격으로부터 안전할 수 있는 방법과 프로토콜에 대해 자세하게 논의합니다. 그리고 그 다음파트에서는 공유키(public key) 기반 암호를 생성하고 사용하는 법을 배울 예정입니다. 여기에는 적절한 수학 이론이 필요합니다. 기회가 된다면 이를 직접 프로그래밍하는 것도 제시하고자 합니다. 그리고 Cryptography 2에서는 조금 더 진보된 영지식 증명(Zero-knowledge)이나 개인정보 관련 메커니즘, 다른 암호 형식에 대해 다루도록 하겠습니다.


강의에 참고하실 사이트는 아래와 같습니다.

  • Background on discrete probability : html
  • A course in applied cryptography : html
  • A Computational Introduction to Number Theory and Algebra : pdf


그럼, 강의를 시작하도록 하겠습니다.

안녕하세요. 저는 Dan Boneh입니다. Stanford University의 컴퓨터과학 교수이며, Stanford Computer Security Lab의 Co-director이기도 합니다. (http://crypto.stanford.edu/~dabo/) 이번 학기에는 암호학을 강의하려합니다. 이 강의는 온라인으로도 촬영하기 때문에, 관심있으신 분들은 누구나 수강하실 수 있도록 할 것입니다. 그럼 시작해볼까요?


이 강의를 통해 이루고자하는 저의 목적은, Cryptographic primitives의 기본적인 작동원리를 가르치는 것입니다. 또한, 암호학을 당신의 상황에서 어떻게 올바르게 적용할 수 있을지에 대해 다루고자 합니다. 우리는 다양한 Cryptographic primitives를 살펴보고 증명할 것입니다. 이 강의를 마칠 무렵에는 여러분이 암호학 전반을 이해하실 수 있을 것이며, 안전하지 못한 방법을 사용한 시스템의 취약점을 발견하실 수 있도록 하시는 것이 이 강의의 목표입니다.

여러분 모두가 아시다시피, 컴퓨터가 사용되는 곳은 어디든지 암호학이 사용된다고 해도 과언이 아닐 것입니다. 데이터를 보호하기위해서는 필수적으로 필요합니다. 예를들어, Web 트래픽은 HTTPS라 불리우는 프로토콜을 사용해 보호할 수 있습니다. Wi-Fi와 같은 무선(Wireless) 트래픽은 802.11i의 WPA2를 사용할 수 있습니다. 휴대전화의 트래픽은 GSM에 포함된 암호화 메커니즘을 사용하고, Bluetooth 또한 마찬가지입니다. 이러한 것들을 모두 살펴볼 것입니다. 
또한, Disk에 저장된 File들을 보호할 때에도 암호화가 유용하게 사용됩니다. 만약 디스크를 도난당했더라도, 파일의 내용을 지켜낼 수 있습니다. DVD나 Blu-Ray 디스크의 Content를 암호화할 수도 있습니다. DVD는 CSS(Content Scrambling System)을 사용하고, Blu-Ray는 AACS라는 방법을 사용하여 디스크 안의 영화를 숨깁니다. 이러한 방법들에 대해 알아볼 때 CSS가 상대적으로 얼마나 취약한지, 공격자가 어떻게 그 암호 시스템을 무력화시킬 수 있는지 알아 볼 수 있을 것입니다. 마지막으로, 암호화는 사용자 인증(User Authentication)에서도 유용하게 사용됩니다. 이 부분은 다음주에 자세히 다루도록 하겠습니다.

이 그림은 안전한 통신에 대해 도식화한 그림입니다. 웹 페이지를 이용하려는 사용자 Alice가 있고, 서버를 운영하는 Bob이 있다고 가정해봅시다. 우리는 HTTPS라는 프로토콜을 사용하여(SSL/TLS 라고도 합니다) 네트워크를 통해 데이터를 송수신할 수 있습니다. 이 때 악의적인 공격자는 이 데이터를 도청(eavesdrop)할 수 없으며, 중간에서 허가없이 위변조(tamper) 할 수 없습니다.


방금의 Web 트래픽을 보호하는 SSL/TLS 프로토콜에 대해 좀 더 자세히 설명해보겠습니다. 이 과정에는 크게 2가지의 단계가 있습니다. 첫째로는 Handshake 프로토콜입니다. 이는 Alice와 Bob이 서로 통신하기 위해서 K라는 비밀키(a shared secret key)를 생성하는 과정입니다. 이 열쇠(Key)는 두 당사자만이 알고 있으며, 기밀로 유지하기 때문에 중간의 공격자가 K값을 알 수 없도록 해야합니다. 이렇게 생성한 K값은 Alice와 Bob사이에 교환(handshake)가 이루어져야합니다. 이 때에는 공개키(public key) 암호화 기법을 사용합니다.(이 부분은 강좌의 두번째 파트에서 다룹니다.) 어쨌든 여기에서는 대칭키를 사용하여 데이터를 암호화하여 송수신 부분에 대해서 설명하고자 합니다.

이 그림은 Disk안의 파일을 암호화하여 보호하는 것을 보여주고 있습니다. 만약 Alice가 디스크를 잃어버렸다하더라도, 그것을 훔친 사람이 디스크 안의 데이터를 열람할 수 없습니다. 만약 강제로 해독하려는 시도를 한다는 것이 감지될 때 그 자료를 삭제해버리는 등의 방법으로 대처할 수 있을 것입니다. 이것은 기밀성(confidentiality) 과 무결성(integrity)을 지켜내는 것으로 이해할 수 있습니다. 그리고 Alice가 디스크 암호를 통해서 오늘의 데이터를 내일도 보장할 수 있음을 증명하는 것은, Alice와 Bob사이의 통신을 보장하는 것과 큰 차이가 없습니다. 결국 똑같은 시나리오인 것이죠.

지금 설명드리는 것은 일명 Building block으로, 대칭키 암호화 방식에 속합니다. 이번 Course의 초반부 절반은 대칭키 암호화 시스템(Symmetric encryption system)에 대해 다룰 것입니다. 기본적으로 대칭키 암호화에서는 송신자(Alice)와 수신자(Bob)가 비밀키(secret key) K를 갖게 됩니다. 이 k 값은 공격자에게 노출되어서는 안됩니다. 오직 앨리스와 밥만이 k값을 알고있으며, 위 그림에서 E와 D로 표현된 알고리즘에 파라미터로 사용될 것입니다. 
E는 암호화(Encryption) 알고리즘이고, D는 복호화(Decryption)알고리즘입니다. 두 알고리즘은 메세지와 key값을 input으로 받아들이고, 그에 따른 변환값을 출력하도록 설계되어 있습니다.


여기에서 중요한 점 한가지를 강조하고 넘어가겠습니다. 이 암호화에서 사용된 E와 D의 함수 구현은 세상사람 모두에게 알려져 있습니다. 그럼에도 불구하고, k값을 모른다면 사람들은 그 암호를 풀어낼 수 없습니다. 즉, 푸는 방법을 다 가르쳐주되 k값 하나만을 숨겼을 때에도 그 k값 찾아내기가 굉장히 어려워야한다는 것입니다. (The only thing that's kept secret is the secret key k. Other than that everything else is completely public) 이는 일명 케르크호프스의 원리(Kerckhoffs’s  principle)이라고도합니다. 이는 암호체계의 안전성은 키의 비밀성에만 의존해야함을 의미합니다. 이것은 암호학 전체에 있어서 굉장히 중요한 개념입니다. 암호 알고리즘은 이미 수많은 선구자들에 의해 지난 수백년동안 검증되었고, 다양한 공격이 시도되었습니다. 하지만 여전히 안전하다고 생각되는 것들만이 살아남았습니다. 그러므로 여러분은 표준(standard)로 인정된 것들만을 사용하시는 것이 좋습니다. 만약 여러분이 스스로 엄청나다고 생각되는 아이디어를 통해 암호알고리즘을 개발하신뒤에, 그 개발 내용을 숨기는 방법으로 안전을 도모하실 수 있다고 생각하신다면 큰 오산입니다. 절대로 그렇게 하지마시길 바랍니다. 역공학(reverse engineering)을 당하거나 몇번의 공격 시도끝에 깨질 가능성이 매우 크기 때문입니다. 그보다는, 지금까지 충분히 검증된 표준 알고리즘을 사용하시길 권장합니다.

다음으로 설명드릴 것은 Single use key와 Multi use key입니다. Single use key는 이메일 암호화에서 사용되는 방법인데, 1개의 메세지를 암호화할때마다 새롭게 생성되는 key입니다. 반면, Multi use key는 동일한 하나의 key로 암호화작업시에 여러번 사용하는 경우입니다. 이것은 한개의 키를 사용해서 많은 file을 암호화할 때 유용하게 사용됩니다.

끝으로 이번 강의를 요약해보겠습니다. 
첫째, 암호학은 컴퓨터시스템의 보안에 있어서 아주 굉장한 도구임에는 틀림없습니다. 그럼에도 불구하고, 암호학이 가진 한계점 또한 명확합니다. 암호학은 모든 종류의 security를 보장해주지는 못합니다. 예를들어, 소프트웨어 버그 등의 중대한 결함으로 인한 취약점에 대해서는 암호학으로 해결할 수 없습니다. 비슷하게, 사회공학적 해킹방법(social engineering)에 의해 부주의한 사용자(fool user)가 해커(attacker)에 의해 공격받는 경우, 암호학은 그를 도와줄 수 없습니다.

둘째, 암호화 구현에서 오류가 있었다면, 그 시스템은 완전히 불안전합니다. 설령 이미 많은 시스템이 그 방식을 통해서 암/복호화를 수행하고 있다하더라도, 뒤늦게 취약점이 발견됐을 때 당장 사용을 중단해야합니다. 저는 여기서 WEP라는 아주 오래된 Wi-Fi 암호화 표준을 언급하고자합니다. WEP는 설계상에 있어서 많은 실수가 있었음이 입증되었습니다. 기회가 된다면 WEP를 break하는 것을 보실 수 있을 것입니다. 어쨌든 WEP는 더이상 사용하시면 안됩니다!

셋째, 암호화 알고리즘을 직접 개발하려고 노력하지마십시오. 위에서 언급드렸듯이, 이미 개발되어있는 표준(standard primitives)에 대해서 연구하시고, 사용하도록 노력하십시오. 이미 수많은 사람들이 수백년동안 연구한 결과물에는 나름의 이유가 있습니다. 또한, ad-hoc design(특별히 설계된 자신만의) 암호화 방식을 사용했던 경우 그것이 역으로 분석되어 깨지는것은 순식간입니다. 절대 사용하지 마십시오.


그럼 다음강의에서 뵙겠습니다.

CPUU님의 창작활동을 응원하고 싶으세요?