코드프레소 백엔드 개발자 양성 과정

암호학 개론

보안의 기반이 되는 암호학에 대해 알아본다.

H Lee

--

Photo by Artem Bryzgalov on Unsplash

정보의 본래 뜻을 알 수 없게 하여 보안을 구현하는 과학적인 방법에 대해 알아보자.

고전 암호학

고전 암호학은 오래 전에 쓰여 지금 보아선 간단한 암호 체계를 다룬다. 더 이상 보안용으로 사용되진 않지만 개념을 소개할 겸 알아보도록 한다.

치환 암호 (Substitution cipher)

치환 암호는 평문(plaintext)을 일정 기준에 의해 치환 또는 대체하여 표현하는 알고리즘을 가리킨다. 예를 들어, 영어 자모를 숫자 1부터 순서대로 대응한다면 A는 1, B는 2, C는 3과 같이 나타낼 수 있다. Hello, world!라는 문구는 8 5 12 12 15, 23 15 18 12 4!로 치환된다.

얼핏 보기에는 글자가 아니라 당황스러울 수 있으나, 치환 암호는 손쉽게 해독할 수 있다. 영어 평문을 기준으로 사용되는 숫자가 26 개를 벗어나지 않으며, Hello의 두 L처럼 같은 글자는 매번 같은 숫자에 대응되는 취약점을 가지고 있기 때문이다. 이는 평문에 사용된 언어에 대한 문법적 특징이나 각 글자의 사용 빈도를 알면 비교적 쉽게 해독된다.

카이사르 암호 (Caesar cipher)

치환 암호를 조금 더 발전시킨 카이사르 암호는 순환 암호(Rotational cipher)의 일종으로, 평문을 치환할 뿐만 아니라 순환하여 표현하는 알고리즘이다. 실제로 율리우스 카이사르가 아군과 비밀리에 소통하기 위해 사용했다고 한다.

카이사르 암호를 영어 자모로 예를 들면, 첫 글자 A를 숫자 1에 대응하지 않고 3에 대응하도록 설정한 후, 자모가 두 칸씩 밀렸다는 점을 감추기 위해 마지막 Y와 Z를 각각 27과 28에 대응하지 않고 마저 1과 2로 돌아온다. 이 부분이 순환에 해당한다. 그러면 암호문을 손에 넣은 사람은 여전히 1부터 26까지의 숫자를 보지만, 단순히 A는 1, B는 2에 대응할 것이라 확신할 수 없다.

하지만 카이사르 암호에도 마찬가지로 사용되는 숫자가 26 개라는 점, 같은 글자는 매번 같은 숫자에 대응된다는 점, 빈도 분석이 통한다는 취약점이 존재한다.

비즈네르 암호 (Vigenère cipher)

카이사르 암호를 발전시킨 비즈네르 암호는 평문을 키워드와 섞어 암호화하는 방법이다. 다음과 같은 비즈네르 표를 참조하여 키워드의 각 글자를 반복하여 평문의 각 글자를 암호화 및 복호화한다.

비즈네르 표

예시를 들기 위해 hello, world라는 문구를 key라는 키워드로 암호화해 본다. key라는 키워드의 각 글자를 평문의 각 글자에 대응한 값을 비즈네르 표에서 찾아 결과를 정리하면 rijvs, uyvjn이 나온다.

비즈네르 암호는 카이사르 암호와 비슷한 원리로 자모를 몇 칸씩 밀어 순환하는 구조인데 각 글자마다 밀리는 정도가 다르며, 키워드의 제한이 없어 가능성이 무궁무진하다는 장점이 있다. 보다시피 같은 글자 L이라도 다른 글자로 암호화될 수가 있고 글자 빈도 분석을 적용할 수 없어 한동안 수학자들과 암호학자들의 골치를 썩이기도 했다.

하지만 모든 고전 암호학은 근본적으로 키워드 자체를 제 3자에게 들키지 않고 전달해야 하는 어려움이 따르며, 이미 1800년대에 키워드를 통하지 않고 비즈네르 암호를 해독하는 법칙이 발견되었다.

현대 암호학

오늘날의 암호학은 더 이상 글자 단위로 정보를 감추는 데에 중점을 두지 않는다. 대신 해시 함수(hash function)라는 것을 사용한다. 해시 함수란 길이와 내용이 자유로운 데이터를 고정된 길이와 형태로 대응시키는 함수이다. 이상적인 해시 함수의 특징은 다음과 같다.

  • 일반적으로 되돌릴 수 없다. 대부분의 웹사이트에서 비밀 번호 찾기 기능을 사용할 때, 비밀 번호를 직접 알려주는 대신 새로 설정하는 링크를 보내주는 것이 바로 이 때문이다. 보안을 철저히 하는 회사라면 사용자의 민감한 정보를 직접 저장하지 않고 되돌릴 수 없는 해시값을 저장하여 본인들도 모르게 한다.
  • 주어진 데이터만 온전히 사용하여 해시값을 생성한다. 임의로 추가하거나 데이터의 일부만으로 해시값을 도출하지 않는다.
  • 결정론적으로 작동한다. 같은 입력을 넣었을 때 다른 출력이 나올 수 없다는 뜻이다.
  • 고루 분포되게 해싱한다. 예를 들어, 해시값이 문자와 숫자의 조합으로 나와야 하는 함수라면 결과가 충분히 무작위하게 나와야 한다 (ABC1, ABC2, ABC3 대신 O4YK1, U8IB9, 3N7M6).
  • 비슷한 데이터로 극히 상이한 해시값을 생성한다. 이를 쇄도 효과라고 한다. Apple이라는 문자열과 Apples라는 문자열을 해싱했을 때, 원문이 거의 일치한다고 해서 해시값 또한 거의 일치하게 나와선 안 된다.
  • 해시 충돌을 유발하지 않는다. 해시 충돌이란 다른 데이터를 해싱했을 때 동일한 해시값이 나오는 경우를 일컫는다.

SHA-1

암호화 해시 함수 (cryptographic hash function, CHF) 중엔 대표적으로 미국 국가안보국이 만든 SHA-1(Secure Hash Algorithm 1)이라는 알고리즘이 있다. SHA-1은 160 비트 해시값을 반환하며 이는 40 자리 16진수 숫자로 표시된다.

SHA-1을 통해 도출될 수 있는 해시값의 종류는 무려 2¹⁶⁰개이다. 서로 다른 값을 입력해 같은 해시값이 나올 확률은 지구 상에서 특정한 모래알 하나를 찾을 수 있는 확률보다도 훨씬 낮다고 한다.

하지만 연구자들이 2017년에 고의로 해시 충돌을 유발하는 데 이미 성공한 바 있어 이런 SHA-1도 전산 자원이 풍부한 적을 상대로는 더 이상 안전하지 않다는 것이 공식적인 견해이다. 물론 이를 향상시키고 대체하는 SHA-2, SHA-3나 MD5, MD6라는 다른 알고리즘도 개발되었다.

이 외에도 디지털 서명, 공개 키 암호화, 블록체인 등 가상 환경에서 인증과 보안을 이뤄내는 방법이 많고 배울 것도 많다. 차근차근 알아봐야겠다.

--

--