본문 바로가기
공부/보안

[보안] 대칭키, 비대칭키(공개키), 혼합

by 웅대 2023. 10. 28.
728x90
반응형

대칭키 방식

대칭키 방식이란 암호화와 복호화에 사용하는 키가 동일한 암호화 방식을 의미한다.

 

https://raonctf.com/essential/study/web/symmetric_key

이전 포스팅에서 DES에 대한 내용을 공부했었는데 이 DES가 대칭키를 사용한 암호화 방식이다.

https://growth-coder.tistory.com/252

 

[정보 보안] 블록 암호와 DES (feistel)

암호 기법은 평문을 처리하는 방법에 따라서 스트림 암호와 블록 암호로 나뉜다. 스트림 암호는 난수를 1비트 단위로 생성하고 평문과 xor 연산을 해서 암호화를 진행한다. 스트림 암호가 1비트

growth-coder.tistory.com

대칭키는 구조가 간단하기 때문에 연산이 빠르다는 장점이 있다.

 

하지만 암호화와 복호화에 같은 키를 사용하기 때문에 키가 유출되면 누구든 키를 가지고 암호화된 내용을 복호화 할 수 있다는 단점이 있다.

 

만약 대칭키를 사용한다면 대칭키를 안전하게 보관하고 안전하게 교환할 방법이 필요하다.

 

비대칭키(공개키) 방식

비대칭키 방식은 공개키와 달리 암호화와 복호화에 서로 다른 키를 사용한다.

 

https://raonctf.com/essential/study/web/asymmetric_key

위 그림에서 보다싶이 모두가 가지고 있는 공개키와 개인만 가지고 있는 개인키가 존재한다.

 

그리고 공개키로 암호화 한 암호문은 개인키로 복호화 할 수 있고 개인키로 암호화 한 암호문은 공개키로 복호화 할 수 있다.

 

즉 개인키와 공개키 중 하나로 암호화를 했다면 나머지 하나의 키로 복호화를 할 수 있다는 것이다.

 

암호 알고리즘과 암호화에 사용한 키를 알아도 복호화에 사용해야 하는 키를 계산 할 수가 없다.

 

또한 비대칭키 방식은 디지털 서명이 가능하다.

 

디지털 서명에 대해서 알기 위해 클라이언트와 서버가 비대칭키 방식을 사용하여 통신하는 과정을 생각해보자.

 

서버는 공개키와 개인키를 생성해서 개인키는 서버만 알고 있고 공개키는 모든 클라이언트가 가지고 있다고 생각해보자.

 

1. 클라이언트가 공개키를 사용해서 암호화

먼저 클라이언트가 서버에게 보낼 정보를 공개키를 사용해서 암호화 한 후 서버에게 보냈다고 해보자.

 

그리고 악의적인 사용자가 이 정보를 가로챘다고 해보자.

 

공개키는 공개되어 있기 때문에 악의적인 사용자도 공개키를 가지고 있다.

 

하지만 공개키로 암호화 한 내용은 개인키만 복호화 할 수 있다.

 

즉 악의적인 사용자가 공개키와 암호문을 가지고 있지만 이를 평문으로 복호화 할 수는 없다.

 

개인키는 서버만이 가지고 있고 공개 된 적이 없기 때문이다.

 

이렇게 사용자의 민감할 수 있는 정보는 서버만이 확인할 수 있다.

 

2. 서버가 개인키를 사용해서 암호화

이번에는 서버가 클라이언트에게 보낼 정보를 개인키를 사용해서 암호화 한 후 클라이언트에게 보냈다고 해보자.

 

개인키로 암호화 한 내용은 공개키로 복호화 할 수 있는데 이 공개키는 모두가 가지고 있기 때문에 누구든 이 내용을 열어볼 수 있다.

 

개인키로 암호화 한 내용은 숨길 수 없지만 개인키로 암호화 했다는 뜻은 디지털 서명을 했다는 뜻이랑 똑같다.

 

이 내용을 복호화 하는 모두는 이 내용이 반드시 서버가 보냈다는 것을 확신할 수 있다.

 

만약 악의적인 사용자가 서버가 보내는 내용을 가로채서 자신이 새로 만든 내용을 클라이언트에게 보냈다고 해보자.

 

그런데 암호문을 만들 때 사용한 키는 같을 수가 없다.

 

개인키는 공개되지 않았기 때문이다.

 

그래서 악의적인 사용자가 만든 내용은 공개키로 복호화 할 수 없고 이는 서버가 보내지 않았다는 것을 의미한다.

 

공개키로 복호화에 성공했다는 뜻은 개인키로 암호화 되었다는 뜻이고 이는 서버가 보냈다는 뜻이다.

 

비대칭키는 서명을 제공한다는 점에서 장점을 가지지만 속도가 느리다는 점이 단점이다.

 

정리를 하자면 대칭키는 기밀성을 제공하고 비대칭키는 기밀성과 서명을 제공한다.

 

비대칭키(공개키) 암호 모델 

위에서 설명한 방식은 서버가 개인키로 암호화해서 보낼 때 기밀성을 제공하지 못한다는 단점이 있다.

 

그렇다면 서버가 보낼 때도 기밀성을 제공하는 방법이 무엇이 있을까?

 

바로 공개키 - 개인키 쌍을 2개 사용하는 것이다.

위 그림처럼 두 쌍의 개인키-공개키를 사용한다면 클라이언트가 서버에게 보낼 때, 서버가 클라이언트에게 보낼 때 모두 기밀성과 서명을 제공할 수 있다.

 

하지만 위에서 비대칭키의 단점은 속도가 느리다고 했는데 위와 같은 암호 모델은 시간이 더욱 많이 걸린다.

 

그래서 일반적으로는 대칭키와 비대칭키를 혼합하여 사용한다.

 

대칭키 + 비대칭키

다시 대칭키와 비대칭키의 단점을 보자.

 

대칭키의 단점은 키의 보관이 어렵고 비대칭키는 시간이 오래 걸린다.

 

그래서 대칭키와 비대칭키 방식을 혼합하여 사용하면 이 둘의 단점을 보완할 수 있다.

 

  1. 대칭키를 생성한다.
  2. 1에서 생성한 대칭키를 사용하여 암호문을 생성한다.
  3. 1에서 생성한 대칭키를 서버의 공개키로 암호화한다.
  4. 이 두 암호문을 서버에게 보낸다.
  5. 서버의 개인키로 대칭키를 구한다.
  6. 이 대칭키를 사용하여 암호문을 평문으로 복호화한다.

이렇게 비대칭키 방식과 대칭키 방식을 혼합하여 사용하면 대칭키 공유 문제와 속도 문제를 보완할 수 있다.

 

실제 통신에서는 이렇게 한 번 사용한 대칭키를 세션이 종료되면 폐기하기 때문에 세션키라고도 한다.

 

 

 

 

 

728x90
반응형

댓글