실무자를 위한 암호학 강좌의 맛보기 강의입니다.
네 안녕하세요 저는 실무자를 위한 암호학 강의를 맡게 된 MCA 연구센터 연구원 권상원이라고 합니다 이제부터 저랑 같이 이 암호학 강의를 시작해 보겠습니다 먼저 비밀을 유지하기 위해 당사자들끼리만 알 수 있도록 꾸민 기호 그것을 우리는 암호, 사이퍼라고 합니다 그리고 그 암호를 다시 평문으로 바꾸는 것을 복호 디사이퍼라고 하고 평문을 암호로 바꾸는 작업을 암호화라고 하며 암호화된 암호문을 평문으로 다시 바꾸는 것을 복호화라고 합니다 그리고 암호화, 전송, 복호화 이 세 단계를 합쳐서 암호체계를 이루고 있습니다 그럼 이 암호체계가 어떻게 이루어지는지 이미지로 본다면 A가 B에게 평문, plaintext를 보내고 싶다고 해봅시다 그러면 이 암호체계를 통해 A는 먼저 암호화 알고리즘을 거쳐서 암호문을 형성하고 이 암호문 사이퍼텍스트는 전송되어 B에게 암호문으로 도착하게 됩니다 그럼 이 암호문은 다시 복호화 알고리즘을 통해 평문으로 변환되게 되고 B는 A가 보낸 평문을 확인할 수 있게 되겠죠 이런 알고리즘을 실행시켜 주는 것을 우리는 키라고 불러주며 이런 알고리즘을 형성하고 구현하는 데 있어 수학의 역할이 상당히 중요한데 그것은 앞으로 강의를 진행하면서 차차 설명하도록 하겠습니다 암호체계의 이런 전송 특성 때문에 몇 가지 기능을 가져야 하는데요 암호체계는 먼저 암호문이 노출되더라도 쉽게 그 평문의 내용을 알 수 없어야 한다는 보안을 유지해야 한다는 기밀성 그리고 암호화와 복호화하는 과정에서 혹은 전달 과정에서 그 정보가 변하거나 오류가 발생하면 안 된다는 무결성 변질되어서는 안 된다는 무결성 그리고 설령 잘 전달되었다 하더라도 그것을 다시 복호화하거나 알고리즘을 구현하는 데 있어 지나치게 많은 시간과 비용이 들면 안 되기 때문에 시간과 비용에 있어 편리해야 한다는 효율성 이런 기능들을 꼭 가지고 있어야 합니다 이런 기능이 필요한 이유는 또 외부 공격자의 공격 때문에 이런 기능을 가져야 하기도 하는데요 공격자의 공격은 공격자가 가진 정보력에 따라 이렇게 네 단계로 나눌 수 있는데 첫 번째 암호문 단독 공격이란 이 경우 공격자는 암호문만 가지고 있는 상태입니다 그렇다면 이 공격자가 할 수 있는 일은 몇 가지 알고리즘을 직접 시도해보거나 혹은 무작위로 대입해보거나 이런 방법밖에 없기 때문에 공격자 입장에선 가장 힘든 공격이 되겠죠 알려진 평문 공격 이 경우 공격자는 몇 개의 암호문과 그에 해당하는 평문을 알고 있는 상황으로 암호문 단독 공격보단 그래도 조금 더 공격적인 방법이 되겠죠 선택 평문 공격 이 경우 공격자는 몇 가지 평문을 스스로가 암호화할 수 있는 상태로 암호화 알고리즘이나 암호키는 모르고 있지만 평문을 스스로가 암호문으로 만들 수 있기 때문에 꽤나 강력한 공격법이라 볼 수 있겠죠 그리고 네 번째, 선택 암호문 공격 이 경우는 몇 가지 암호문을 평문으로 복호화시킬 수 있는 상황으로 이 역시도 암호키에 대한 정보는 모르지만 최종적으로는 암호키를 알아내는 것이 목적인 방법입니다 높은 번호일수록 더 강력한 공격 방법이고 높은 번호에 대한 안전한 암호체계는 더 낮은 공격에 대해서도 안전하다고 할 수 있죠 그리고 암호체계는 늘 이렇게 공격자가 공격할 수 있다 그런 공격 상황에 노출될 수 있다는 가정 아래에 있기 때문에 항상 안전한 암호체계를 만드는 것이 가장 중요합니다 다음으로 암호화의 종류는 크게 단방향 암호화와 양방향 암호화로 나눌 수 있습니다 먼저 단방향 암호화란 방금 설명했던 무결성을 바탕으로 해서 평문을 암호문으로 바꾸는 암호화는 가능하지만 복호화는 불가능한 이 경우 단방향 암호화라고 하고 양방향 암호화란 둘 다 평문을 암호문으로 암호문을 평문으로 둘 다 가능한 것을 양방향 암호화라고 합니다 자 단방향 암호화 같은 경우 암호문을 복호화해서 평문으로 얻지 못한다면 그것을 암호화하는 의미가 무엇인가 라고 할 수 있겠죠 그럼 지금부터 화면을 통해 직접 이 경우 어떻게 사용되고 어떻게 변환되는지 한번 확인해 보겠습니다 이 사이트는 MD5라는 이런 알고리즘을 실행시켜 주는 사이트인데 차후에 사용할 RSA라는 알고리즘을 사용하는 곳과 두 군데 제가 링크를 달아 드릴 테니까 꼭 확인해 보시기 바랍니다 먼저 여기다가 제가 math 수학이라는 걸 암호화해 보겠습니다 이렇게 math라는 글자를 encrypt 했을 때 hash 값이라고 해서 숫자와 문자가 무작위로 배열된 이러한 나열 값을 얻을 수가 있습니다 그럼 이렇게 나열된 값을 복사해서 decryption 칸에 들어가서 입력하게 되면 그럼 처음 입력했던 math 이런 평문을 다시 얻을 수가 있죠 지금 현재 보고 있는 사이트 내에서는 hash 값을 통해 평문을 다시 얻을 수 있었지만 실제로는 이 hash 값을 통해 평문을 얻을 수는 없습니다 이 해시값이란 건 MD5 알고리즘을 통해 평문이 변환되어 나오는 숫자와 문자로 된 암호문으로 내용이 조금이라도 다르다면 다른 해시값이 나오게 되고 그렇다면 반대로 이 해시값만 정확하게 일치하게 알고 있다면 아 이 사람은 평문에 대해서 알고 있구나 라고 판단을 할 수가 있습니다 이런 해시값이 언제 쓰일 수 있느냐 우리가 흔히 아는 인터넷 사이트에 로그인을 할 때 제일 처음 우리는 회원가입을 통해 비밀번호를 입력하게 되고 그 비밀번호는 해시값으로 변환되어 인터넷 사이트에 저장되게 됩니다 그럼 우리가 로그인을 할 때 비밀번호를 입력한다면 그것은 해시값으로 변환이 되고 인터넷 사이트에선 해시값을 확인하고 인증해줘서 로그인 절차를 진행시켜 주는 거죠 따라서 우리가 해시값을 입력하고 난 후에 공격자가 중간에 공격을 하게 된다면 이런 공격자는 해시값을 해킹하기 때문에 이것은 복호화가 불가능하고 비밀번호를 알 수 없는 상황이 오게 되는 거죠 따라서 이런 방식은 전자서명 아니면 인터넷 로그인 또는 가상화폐 이런 분야에서 유용하게 사용이 됩니다 단방향 암호화에 대해서 알아봤으니까 이제 양방향 암호화에 대해서 알아볼텐데 양방향 암호화는 두 가지 분류로 나눌 수 있습니다 먼저 조금 전에 봤던 암호체계의 평문 전달 과정에서 알고리즘을 사용하기 위해선 제가 키가 필요하다고 했었죠 이 키는 또 종류에 따라 암호화 알고리즘을 사용할 암호화 키 그리고 복호화 알고리즘을 사용할 복호화 키 이렇게 두 분류로 나눌 수 있으며 양방향 암호화는 또 두 가지로 나눌 수 있는데 첫 번째 대칭키라고 해서 이 암호화 키와 복호화 키가 둘 다 같은 걸 사용한다 이것을 대칭키라고 하며 이 경우 같은 키를 사용하기 때문에 사전에 서로 공유자끼리 이 키를 공유해야 하며 이 키는 비밀리에 유지해야 하기 때문에 비밀키 시크릿키라고 합니다 서로 이 키만 알고 있다면 다른 절차를 거치지 않아서 간편하다고 할 수도 있겠지만 반대로 생각하면 둘 중에 한쪽만 키가 노출되더라도 쉽게 공격자는 그 정보를 얻을 수가 있고 이 정보는 노출되게 되겠죠 이를 보완하기 위해 나온 것이 공개키 혹은 비대칭키라고 하는 것이며 이 경우 암호화 키와 복호화 키가 서로 다르게 됩니다 그렇다면 대칭키와 다르게 사전에 이 키를 공유할 필요가 없고 암호화 키를 공개키, 퍼블릭키로 두어 공개를 하고 복호화 키는 시크릿키, 비밀키로 두어 비밀에 유지합니다 이 방법을 어떻게 진행하느냐 이것도 제가 예시를 통해 보여드리도록 하겠습니다 먼저 A는 공개키와 개인키, 이 둘은 키페어라고 하는데 이 키페어를 생성해서 공개키만을 공개하게 됩니다. 그렇다면 B는 이제 이 키가 생겼으니까 알고리즘을 사용할 수 있게 되겠죠. 그러니까 공개키를 이용해서 암호화, 이 평문을 암호화하여 암호문으로 만들어줍니다. 그럼 이 암호문은 다시 A에게 전달되어 A는 개인 키를 이용해 또 복호화 알고리즘을 사용할 수 있겠죠 그러니까 복호화시켜 평문으로 바꾸어 B가 보낸 평문의 내용을 확인할 수 있게 됩니다 이 경우 A가 가지고 있는 키 중에 공개 키는 공개가 되었지만 공격자 역시 이 공개 키를 볼 수 있겠지만 개인 키가 없기 때문에 복호화를 할 수 없겠죠 그러니까 이 키 페어 쌍에 맞는 개인 키를 가진 A만이 이 정보를 복호화할 수 있게 됩니다 방금 MD5를 제가 보여드린 것처럼 이번엔 RSA를 활용할 수 있는 인터넷 사이트에서 제가 보여드릴 텐데 제일 먼저 A가 했던 게 키 페어를 생성하는 거였죠 키 페어를 생성하면 이렇게 Public Key와 Private Key 두 키 페어를 가지게 되고 Public Key만 공개를 하게 되겠죠 그러면 B 입장에서 이렇게 math라는 plaintext 평문을 보내고 싶다 근데 이 평문은 공개된 퍼블릭키로 암호화해줘야겠죠 이 Public Key로 만들고 싶어요 그러면 Encrypt 암호화해주면 이런 암호문이 생성되게 됩니다 이렇게 생성된 암호문을 다시 A에게 전송해주면 A는 나는 이 암호문을 복호화하고 싶어요 근데 복호화할 건데 나의 Private Key 개인 Key로 할 거예요 그러니까 Private Key를 복사해 주시고 Private Key를 입력하고 복호화하게 되면 처음 B가 전달하고자 했던 평문의 내용인 math를 얻을 수 있겠죠 이러한 방법이 있고 또 다른 방법이 있는데 다음 방법으로는 A가 이번에도 keypair, 공개키와 개인키 둘 다 생성한 상태인 거죠 근데 이번엔 자신의 개인 키를 통해 암호화 알고리즘을 사용하여 평문을 암호문으로 바꿨습니다 그리고 공개를 해줄텐데 이번엔 공개키 뿐만 아니라 방금 만들었던 암호문도 올리고 그리고 평문도 다 같이 공개해버립니다 그럼 B는 공개키, 평문, 암호문 모두를 알 수 있겠죠 그리고 이제 공개키를 이용해 암호문을 평문으로 복호화할 수 있게 됩니다 그렇다면 복호화된 평문의 내용이 A가 공개한 평문의 내용과 일치하는 것만 확인할 수 있다면 아 그럼 이 자료는 공개키에 맞는 개인키, 프라이빗키를 가지고 있는 A가 준 자료가 틀림이 없다 혹은 중간에 공격자의 침입이나 자료의 변화가 없었던 자료인 게 맞다 라고 확인할 수 있겠죠 이 경우를 RSA를 통해 확인해보면 먼저 똑같이 키 페어를 생성합니다 그리고 이번엔 자신의 개인키를 통해 평문 math를 자 이번엔 이거 key 타입을 바꿔줘야겠죠 개인키 private key로 만드는 거니까 private key로 encrypt 암호화하면 암호문이 생성되고 그러면 B는 이 암호문을 복호화할 건데 어떤 키로 복호화할 거냐 public key 공개된 공개키로 복호화해야겠죠 그러면 붙여넣기 해주시고 key 타입은 public key로 복호화할 거니깐 public key 그러면 decrypt 해주게 되면 math 아 정확히 math란 글자가 똑같이 나왔으니까 이 암호문은 개인 키를 가진 A가 보낸 것이 맞다 라고 확인할 수 있겠죠 즉 중간에서 공격자가 A인척 혹은 A의 자료를 도용해서 내가 A인척 보내더라도 공격자는 개인 키를 가지고 있지 않기 때문에 B가 복호화하여도 A가 처음 공개한 평문과 같은 내용이 안 나오게 되겠죠 그러니까 공격자의 침입에 대해서도 네가 A가 아니구나 라는 걸 바로 판단할 수 있습니다 지금처럼 단방향 혹은 양방향 이런 암호화를 제가 설명드렸는데 이런 암호가 어디에 쓰일 수 있느냐 먼저 첫째로 방금 제가 단방향 암호에서 설명했던 인터넷 로그인 이런 방식에서 인증을 할 수 있겠고 그리고 양방향 암호에서 설명했던 전자서명 아 이거 본인 맞아요 이거 내가 한 거예요 라고 전자서명을 할 수 있는 경우에 사용할 수 있겠죠 그리고 두 번째로 동형암호 동형암호란 암호화된 암호를 복호화하지 않은 상태의 암호문 상태에서도 사칙연산이나 기타 결합이나 계산을 하여도 복호화된 암호에서 한 결과와 똑같은 결과를 가질 수 있다는 걸로 지금 4세대 암호로서 굉장히 중요한 암호인 거죠 암호화폐와 블록체인 이 경우 우리가 흔히 아는 비트코인의 경우로 암호를 블록화하여 연결된 블록끼리 체인으로 연결된 형태로 공개 분산 거래 장부를 형성하게 되는 것이죠 그리고 디지털 포렌식 각종 요즘 디지털 범죄나 범죄 수사 이런 데 있어서 훼손 또는 변조된 디지털 범죄 증거를 복원하는 데 쓰일 수 있겠죠 자 이렇게 우리는 지금 암호의 기초적인 내용과 분류, 기능, 활용 정도를 이번 강의에서 배워봤습니다 꼭 한번씩 제가 링크해드린 링크를 따라 들어가서 방금 했던 활동들을 한번 따라해 보시는 걸 추천드리고요 오늘 강의는 여기서 마치도록 하겠습니다 감사합니다
