대칭키, 비대칭키

암호학의 기본! 대칭키와 비대칭키에 대해서 알아보자

written by tiaz0128

정보보안의 3요소


기본적으로 암호를 이해하기 위해서는 통칭 ‘CIA’라고 하는 ‘정보보안의 3요소’를 알아야 합니다.

암호의 목적은 데이터의 암호화를 통한 ‘기밀성’을 보장하는 것이며, 부가적으로 데이터 변경에 대한 보장을 해주는 ‘무결성’에 그 목적이 있습니다.

암호화와 복호화


‘암호의 목적은 데이터의 암호화’라고 했습니다. 그렇다면 암호화란 무엇일까요?

암호화 복호화

> 암호화와 복호화

‘암호화(Encryption)’란 일반적인 메세지를 뜻하는 평문(plaintext)을 암호화 알고리즘을 이용하여 코드화된 메시지로 만들어 이해할 수 없도록 암호문(ciphertext)으로 만드는 것을 의미합니다.

이와 반대로 ‘복호화(Decryption)’ 란 암호문을 다시 평문으로 만드는 것을 의미합니다.

암호의 분류


암호는 크게 ‘양방향 암호’와 ‘일방향 암호’로 구분 할 수 있습니다. 여기서 방향은 암호화와 복호화의 방향에 따른 분류입니다. 양방향은 암호화와 복호화가 모두 가능하며 일방향 암호는 암호화만을 가능한 것을 의미합니다.

암호의 분류

> 대칭키와 비대칭키는 양방향 암호이다.

혼돈과 확산


모든 암호화에 사용되는 기초 기법은 크게 ‘혼돈’과 ‘확산’으로 나눌수 있습니다.

Caesar 암호, Scytale 암호

> Caesar 암호, Scytale 암호

혼돈(Confusion)

혼돈(Confusion)이란 평문의 문자들을 다른 문자, 숫자, 기호 또는 심벌로 바꾸는 것을 의미합니다. 대표적으로 Caesar 기법이 있습니다.

로마의 황제였던 줄리어스 시저가 사용한 이 방법은 A는 D로, B는 E로 바꿔 쓰고, 읽는 방식으로 문자를 문자 3개씩 앞뒤로 당겨서 읽으면 원래의 평문을 얻을 수 방법입니다.

확산(Diffusion)

확산(Diffusion)이란 글자의 위치를 변경하는 기법입니다. 대표적으로 Scytale 기법이 있습니다.

특정 지름을 갖는 막대에 종이를 감고 평문을 횡으로 쓴 다음 종이를 풀면 평문의 각 문자는 재배치되어 정보를 인식할 수 없게 됩니다. 이를 지름이 같은 막대에 다시 감으면 평문을 읽을 수 있는 방법입니다.

키의 관리


이것들은 해당 암호문를 다시 평문으로 만들기 위해 필요한 열쇠(Key) 입니다.

암호화에서 가장 중요한 핵심은 ‘강력한 알고리즘을 만드는것’이라 할 수 있습니다. 하지만 아무리 강력한 암호화 알고리즘이라 할지라도, 해당 암호화에 사용한 키값을 알고 있다면 이는 무용지물이겠죠.

따라서 암호화에 사용한 ‘키를 어떻게 안전하게 관리 할 것인가’ 또한 암호화의 핵심이라해도 무방합니다.

대칭키 암호화(Symmetric-key Cryptography)


일반적인 암호는 평문을 키값을 이용하여 암호화 하고, 암호문을 같은 키값을 이용하여 복호화가 가능한 ‘대칭키’를 의미합니다. 여기서 ‘대칭키’란 암호화와 복호화에 사용하는 키값이 같은 것을 의미합니다.

대칭키 암호화

> 대칭키: 암호화에 사용한 검은색 키를 다시 사용해 복호화를 수행

일반적으로 암호에서 사용하는 용어로 ‘송신자 A’ = 엘리스(Alice) / ‘수신자 B’ = 밥(Bob)으로 지칭하겠습니다.

두 사람이 같은 키를 이용한 암호화 통신을 한다고 생각해봅시다. 엘리스는 키로 평문을 암호화하여 보내고, 밥은 동일한 키로 암호문을 복호화하여 안전하게 통신을 할 수 있습니다.

하지만 여기서 두 사람이 암호화 통신을 하기 위한 기본 전제 조건이 있습니다.

‘송신자와 수신자는 암호화 통신을 하기 위해서는 같은 키값을 공유하고 있어야 한다.’

문제는 여기서 발생합니다.

키의 공유


키 배송 문제

> 도청으로 Key 탈취의 위험 (키 배송 문제)

엘리스가 키를 밥에게 보내지 않으면 밥은 엘리스에게 암호문을 받아도 해당 암호문을 평문으로 복호화 할 수 없습니다. 하지만 키를 보내려해도 이를 노린 해커가 키를 탈취해 암호문을 복호화 할 수도 있습니다.

이러한 문제점은 암호의 가장 중요한 ‘기밀성’에 치명적입니다. “키를 공유 해야하는데 키를 보내지도 못한다.” 이것을 ‘키 배송 문제(key distribution problem)’라 합니다.

그렇다고 모든 통신채널을 100% 안전하게 만들 수도 없습니다. 그렇다면 어떻게 키값을 ‘불안정한(insecure) 통신채널’을 이용해서 안전하게 공유 할수 있을까요?

비대칭키 암호화 (Asymmetric-key Cryptography)


‘키 배송 문제’를 해결하는 방법에는 몇가지 방법이 있습니다. 그 중에서 가장 대표적인 방법이 ‘비대칭키 암호화’ 방식입니다.

암호화에 사용하는 키 따로, 복호화에 사용하는 키 따로 존재하는 방식 입니다. 암호화/복호화에 사용하는 키가 다르기 때문에 ‘비대칭키’라고 합니다. 두 개의 키는 아래와 같습니다.

한가지 더 기억해야 하는 중요한 내용이 있습니다. 개인키 또는 공개키로 암호화한 내용은 나머지 다른 키로만 복호화 가능합니다.

즉 두 가지 키 모두 암호화/복호화에 사용 가능하며, 반대쪽 키로만 암호화/복호화가 가능합니다.

비대칭키 암호화

> 비대칭키 : 두 개의 키를 사용하여 암호화와 복호화를 하는 방법

기본적인 흐름은 다음과 같습니다.

  1. 엘리스는 평문을 ‘암호화’하기 위해서 ‘밥의 공개키(public-key)’를 사용.
  2. 밥은 수신한 암호문을 ‘밥의 개인키(private-key)’를 이용하여 ‘복호화’.

여기서 나온 공개키라는 개념때문에 ‘공개키 암호화(public-key cryptography)’ 방식이라고 부르기도 합니다.

대칭키와 비대칭키의 쓰임


그렇다면 우리가 사용하는 암호화는 전부 비대칭키만 쓸까요? 반은 맞고 반은 틀렸습니다.

비대칭키는 복잡한 연산인 ‘소인수 분해’를 기반해서 동작합니다. 때문에 많은 양의 데이터를 암호화 하기에는 적절하지 않습니다. 반면, 대칭키는 암호화와 복호화 속도가 훨씬 빠릅니다.

“엥? 그럼 데이터 암호화에 안쓰면 뭐에 쓴다는겨?”

물론 비대칭키만 쓰이는 경우도 많이 있습니다. 데이터 암호화가 목적이 아니라면 충분히 좋은 방법이고 이미 많은 기술에서 쓰이고 있습니다. 대표적인 경우가 ‘전자서명’ 입니다. 데이터를 암호화하는 것이 목적이 아니라 무결성(변조 여부) 검증이 주 목적 입니다.

대칭키를 위한 비대칭키의 쓰임


대칭키와 비대칭키의 장단점을 다시 한번 정리해봅시다.

  장점 단점
대칭키 빠르고 효율적 키 공유가 어려움
비대칭키 안전한 키 공유 연산 비용이 높음

이놈도 저놈도 사용하려니 뭔가 부족해 보입니다. 그래서 실제로는 두 방식을 혼합해서 사용하는 경우가 많습니다.

예시 : GitHub SSH 설정


:memo:
'GitHub에 SSH 설정법'을 잘 모르시면 "SSH 로 GitHub 연결"   글을 확인 해주세요!

GitHub에 SSH 설정하는 과정을 한번 생각해 봅시다. 사용자가 직접 비대칭키를 만들어서 개인키는 보관하고, 공개키를 GitHub에 등록 합니다.

GitHub 공개키 설정

> 사용자가 GitHub에 등록한 공개키는 누구나 확인 가능하다

초기 연결 설정 (비대칭키 사용)

  1. 사용자는 비대칭키를 생성하여 개인키는 보관하고 GitHub에 공개키를 등록
  2. 사용자는 SSH에서 사용할 임시 대칭키(세션 키)를 생성
  3. 사용자는 이 세션 키를 개인키로 암호화하여 GitHub 서버에 전송
  4. GitHub 서버는 공개키로 암호화된 세션 키를 복호화

비대칭 키

> 대칭키를 비대칭키로 암호화해서 안전하게 배송한다.

만약 GitHub에 등록된 공개키의 짝인 개인키가 아니면 사용자는 인증에 실패하게 됩니다. 올바른 개인키를 가진 사람만 인증을 통과 할 수 있겠죠?

이후 통신 (대칭키 사용)

양쪽 모두 동일한 세션 키를 공유하게 되었으므로, 이후의 모든 통신은 이 대칭키를 사용하여 안전하게 데이터를 암호화/복호화 할 수 있게 됩니다. 이런 방식은 SSH뿐만 아니라 HTTPS 등 많은 보안 프로토콜에서 사용되는 일반적인 패턴입니다.

대칭키 사용

마무리


여기까지 대칭키와 비대칭키에 대해서 알아봤습니다. 정리 하겠습니다. 😊

참조


아래의 영상에서 공개키의 기본 원리와 ‘소인수 분해’로 동작하는 원리를 잘 설명해주고 있으니 한번 보시는 것을 추천드립니다!

암호학 대칭키 비대칭키

tiaz0128

Eat Sleep Coding.

Never Never Giveup.

Security  |  BackEnd  |  Multi Cloud