암호화 키에는 여러 종류가 있고, 용어와 개념을 정리할 필요가 있다!
키(Key)란 무엇인가?
- 중요한 고객의 정보를 암호화 알고리즘을 통해 암호화를 한다고 가정하자
- 암호화 알고리즘에 ‘키’를 매개 변수로 줘서 매번 다른 결과의 암호문이 나올 수 있도록 해준다.
- 이러한 키는 복잡도가 높고, 길이가 길수록 훨씬 더 안전한 키가 된다!
대칭키
- 대칭키는 말 그대로 암호문을 암호화 하고 복호화 할 때 서로 같은 키를 사용하는 방법
그런데..
대칭키의 큰 문제는 암호화와 복호화가 동일한 키를 사용하기 때문에, 사전에 키를 공유해야 한다는 단점이 있다.
- 키를 공유하는 과정에 키가 탈취될 수도 있고, 키를 보관하고 있을 때도 안전한 방법으로 보관하고 있지 않다면 탈취당할 수 있다.
- 이를 방지하기 위해 직접 만나서 교환하는 방법(…)이나 키 배포 센터를 이용하면 된다.
- 키를 탈취당할 위험성이 존재하기 때문에 대칭키 암호화는 ‘부인 방지’가 불가하다.
- 부인 방지란, 데이터 교환 과정에서 발생한 동작, 행위 수행한 사람이 그 행위를 부인하지 못하도록 하는 기법
- 쉽게 말해, 당근 마켓에서 물건을 샀고, 분명 돈도 보냈는데, 판매자 쪽에서 “아직 돈이 안 들어왔어요!” 혹은 “방금 제 키가 탈취당했어요ㅠ 돈을 다른 곳으로 잘못 보내셨어요..”라고 해버리면 대칭키 암호화에서는 그 말이 사실인지 검증할 방법이 없다..
여러명의 사용자와 암호화 통신을 하기 위해서는 수많은 키가 필요하다.
- 예를 들어 5명의 사람들과 개인톡을 암호화 통신으로 주고받는다고 했을 때, 아래 그림과 같은 키 교환 개수가 나올 것이고, 만약 100명이라면..? (100 x 99) / 2 의 계산을 통해서 4950번의 키교환이 필요하고, 4950개의 키가 필요할 것이다.
- 이는 사람이 늘수록 기하급수적으로 증가할 것이며, 비효율적이다.
키 교환의 개수를 직관적으로 잘 나타내주는 그림이다.
그렇게 나온 비대칭키(공개키) 암호화
대칭키는 하나의 키로 암호화 복호화를 했다면, 비대칭키는 ‘공개키’와 ‘개인키’가 존재하여 두 키를 통해 암복호화가 이뤄진다.
공개키 암호화 원리
- 위 수식에서 x가 2일 때 y의 값은 4가 된다.
- y가 8일 때 x의 값 또한 4로 구하기 쉽다.
y=axmodb
- mod 연산은 대부분의 프로그래밍 언어에서 % 연산자다.
- a=3, b=5, x=2 일 때, y는 4가 된다.
- 그렇다면, a=3, b=5, y=4 일 때 x를 쉽게 구할 수 있는가?
- 이는 이산 대수 문제 라고 불리며 아직까지 이를 효율적으로 계산하는 방법은 수학적으로 알려져 있지 않다. 즉, 하나하나 대입해보는 수밖에 없다.
- 위의 특성을 이용한 암호화 통신이 바로 공개키 암호화다.
- 조금더 복잡한 수학적 원리는 아래 동영상 링크를 참고하자.
(수학적 원리를 자세하게 아는 것도 중요하지만.. 개발자의 입장에서는 가져다 쓰는 것이 더 중요하겠다.)
정수론 18강: 공개키 암호 예제 [쑤튜브]
공개키
- 공개키는 공개키 암호화 과정에서 키쌍으로 생성되는 키 중 누구에게나 공개 가능한 키로, 누구나 이 키에 접근할 수 있다.
개인키
- 개인키는 공개키 암호화 과정에서 키쌍으로 생성되는 키 중 개인의 비밀키로, 절대 노출되어서는 안되며, 안전하게 보관되어야 하는 키다.
💡 비대칭키 암호화는 두 가지 경우가 있다!
1. 공개키로 암호화 → 개인키로 복호화 ⇒ 데이터 보안
2. 개인키로 암호화 → 공개키로 복호화 ⇒ 전자 서명
서로 암호화 복호화가 가능하다.
- 아래 시나리오는 공개키로 평문을 암호화 하고, 암호문을 다시 개인키로 복호화 하는 과정이다. 위 1번의 시나리오(데이터 보안)
- 아래 시나리오는 개인키로 해시값을 암호화 하고, 암호화 된 해시값을 개인키로 복호화 하는 과정이다. 위 2번의 시나리오(전자 서명)
전자 서명
위 2번의 시나리오에서는 해시값을 개인키로 암호화를 하고, 공개키로 복호화한다. 그렇다는 것은 모든 사람들이 나의 공개키로 복호화를 할 수 있다는 것인데 암호문을 모두가 복호화 한다면 무슨 이점이 있을까?
- 이전에 대칭키를 설명할 때 문제점으로 나왔던 ‘부인’을 방지할 수 있다!
- 나의 개인키로 암호화 한 암호문은 모든 사람들이 나의 공개키로 복호화를 할 수 있지만, 중요한 것은 나의 개인키로 암호화 했기 때문에 나의 공개키로만 복호화가 가능하다.
- 다시 말하면 암호문을 본인이 암호화 했다는 것을 증명할 수 있는 것이다.
하지만
- 하지만 완벽해보이는 이 비대칭키 암호화에도 단점은 존재한다.
- 바로 대칭키에 비해 연산 비용이나 속도 측면에서는 많이 떨어진다.
하이브리드 암호화
💡 대칭키의 속도가 빠르다는 점과 비대칭키의 안전함을 모두 챙긴, 보안성과 효율성을 동시에 제공하는 암호화 방식이다.
- 대칭키 암호화는 데이터의 암호화 및 복호화에 용이하고 빠르지만, 키 교환과 인증의 문제가 있다.
- 비대칭키 암호화는 키 교환과 인증(전자 서명)을 위해 사용되지만, 계산 비용이 높고 암호화 및 복호화가 느리다는 단점이 있다.
- 대칭키는 긴 평문의 내용, 즉 우리가 상대방에게 보낼 메세지를 암호화(A) 한다. 그리고 대칭키를 비대칭키로 한 번 더 암호화(B) 하여 A+B를 상대방에게 보내는 형식이다.
- 긴 평문을 비대칭키로 암호화 한다면 시간이 오래 걸리기 때문에 효율적인 대칭키로 암호화 하고, 중요한 대칭키는 비대칭키로 한 번 더 암호화 하는 것이다.
HTTPS (SSL / TLS)
- 우리가 웹 사이트에 접속할 때 사용하는 프로토콜인 HTTP에 보안 프로토콜을 추가한 것이 바로SSL/TLS 프로토콜이다.
- SSL/TLS은 하이브리드 암호화 체계를 사용하고 있으며, 핸드셰이크 단계에서 비대칭키로 암호화 된 대칭키를 주고받는다.
- 이 암호화 된 대칭키를 통해서 우리는 암호화된 데이터(정확히는 http Body)를 주고받을 수 있다!