본문 바로가기
기타/CS

HTTPS(with 공개키 암호화 방식)

by oneny 2023. 9. 9.

HTTPS

HTTPS는 웹 브라우저와 서버 간에 데이터를 전송하는데 사용되는 기본 프로토콜인 HTTP의 보안버전이다. HTTPS는 데이터 전송의 보안을 강화하기 위해 암호화된다. 이는 사용자가 은행 계좌, 이메일 서비스, 의료 보험 공급자에 로그인하는 등 중요한 데이터를 전송할 때 특히 중요하다.

그러면 HTTPS가 어떻게 작동하는지에 대해서 알아보기 위해 먼저 공개키 암호화 방식에 대해서 알아보자.

 

공개키 암호화 방식

최근 사용되는 대부분의 암호화 방식은 공개키 암호화 방식이다. 공개키 암호화 방식의 효시가 되는 DH 비밀키 교환 방식과 공개키 암호화 방식의 대표적인 예인 RSA 방식에 대해서 알아보자.

 

비밀키 암호화 방식의 문제

비밀키 암호화 방식은 암호화키를 여러 사람이 공유하기 때문에 암호화키가 유출될 가능성이 높다. 위 그림을 보면 사용자 A가 암호화키를 이용해서 암호화한 암호문을 사용자 B에게 보낸다고 가정해보자. 그러면 사용자 B는 같은 암호화키를 이용해서 암호문을 복호화할 수 있다. 만약 임의의 사용자 C에게 암호문과 암호화키가 유출되면 암호문이 해독되는 문제가 발생하게 된다.

이렇게 비밀키 암호화 방식은 암호키가 유출될 가능성이 높기 때문에 그 대안으로 공개키 암호화 방식이 나오게 되었다. 

 

공개키 암호화 방식

공개키 암호화 방식에서는 공개키와 비밀키 두 개의 키를 사용하는데, 공개키를 이용해서 암호화하고 비밀키를 이용해서 복호화한다. 암호문을 해독하려면 비밀키를 알아야 한다. 따라서 여러 사람이 공유하는 공개키가 유출되어도 아무런 문제가 없다.

위 사진을 보면 사용자 A는 사용자 B의 공개키를 이용해서 암호화한 암호문을 사용자 B에게 보낸다. 그러면 사용자 B는 자신의 비밀키를 이용해서 암호문을 복호화할 수 있다. 즉, 암호문을 해독하려면 비밀키를 알아야하기 때문에 여러 사람이 공유하는 공개키는 유출되어도 아무런 문제가 없다. 그래서 사용자 C에게 암호문과 공개키가 유출된다고 해도 사용자 B의 비밀키는 없으므로 암호문을 해독하지 못한다.

물론 사용자 B의 비밀키가 유출되면 문제가 생길 수 있지만 비밀키는 자신만이 간직하는 키이므로 공개키 보다는 유출될 가능성이 훨씬 희박하다.

 

DH 비밀키 교환 방식

스탠포드 대학의 디피(Diffe)와 헬만(Hellman)은 암호화와 복호화에 사용되는 키가 동일한 키라는 상식을 깨고자 했다. 읻르은 암호화에는 공개키(public key)를, 복호화에는 그와 다른 비밀키(private key)를 이용하자는 공개키 암호(PKC, Public Key Cryptography) 개념을 제안했다. 그리고 이들은 두 사용자들 사이에 만나는 번거로움없이 비밀키를 교환할 수 있는 방식을 개발했는데 이를 DH(Diffe-Hellman) 비밀키 교환 방식이라 한다. DH 비밀키 교환 방식은 공개키 암호화 방식의 효시가 되었다.

 

DH 비밀키 교환 방식의 동작 과정

다음 예시를 통해 사용자 A와 사용자 B가 DH 비밀키를 교환하는지에 대해서 살펴보자.

1. 사용자 A는 우선 DH 비밀키 교환 방식에 필요한 값을 정하는데 큰 소수 p, 베이스 g, 지수 x1 세 수를 선택한다. 계산을 쉽게 하기 위해 p는 43, g는 17, x1은 4로 한다. 이 중에 개인적인 값(x1)과 공개해도 좋은 값(p, g, y1)으로 나눈다.

 

 

2. 위 공식을 적용하여 y1을 생성한다. y1은 15가 된다. p, g, y1은 공개하는 값이고, x1은 노출하면 안되는 개인적인 값이다. 

y1 = g^(x1) mod p

 

3. 사용자 A는 p(43), g(17), y1(15)을 사용자 B에게 보낸다. 이 값은 제3자에게 누출될 가능성이 있다.

 

4. 사용자 B는 자신만의 지수 x2를 선택하는데, x2를 6이라 하자. 그리고 공개 DH 값과 자신만의 개인적인 값을 아래 공식을 적용하여 새로운 공개 DH값인 y2를 생성한다. y2는 35가 된다.

y2 = g^(x2) mod p

 

5. 사용자 B는 아래 공식을 적용하여 비밀키 s를 생성하는데, s는 11이 된다.

s = y1^(x2) mod p

 

6. 사용자 B는 y2(35)를 사용자 A에게 보낸다. 이 값은 누출될 가능성이 있다.

 

7. 사용자 B도 사용자 A에게 받은 공개 DH 값과 개인적인 값을 이용해 아래 공식을 적용하여 비밀키 s를 생성하는데, s는 11이 된다.

s = y2^(x1) mod p

 

8. 사용자 A와 사용자 B는 11이란 비밀키를 사용해 암호문을 만들고 해독하게 한다. 이 과정에서 사용자 A와 사용자 B가 주고받는 공개 DH값이 누출되어도 제3자가 암호화키를 생성할 수는 없다.

 

RSA 암호화 방식

디피와 헬만의 공개키 암호 개념을 기반으로 MIT 공대 연구팀 소속의 세 학자 리베트스(Revest), 셰미르(Shamir), 아델만(Adleman)은 공개키로 암호화하고, 그와 다른 비밀키로만 열 수 있는 암호화 알고리즘을 고안해내고자 했고, 현재 디지털 서명 시스템은 RSA 알고리즘에 상당 부분 의존하고 있다.

 

RSA 암호화 방식의 동작 원리

RSA 암호화 방식의 동작 원리에 대해 알아보자. RSA는 상당히 큰 두 소수의 곱을 소인수분해하는 것은 어렵다는 점을 이용해 만든 공개키 알고리즘으로 수학적 이해가 필요하다. RSA 암호화 방식의 공개키와 비밀키 생성 과정을 살펴보자.

 

1. 적당히 비슷하고 큰 소수 p, q를 선택한다. 쉬운 계산을 위해 간단한 소수 13(p)와 11(q)를 선택한다.

 

2. 아래 공식을 적용하여 공개키 n을 생성한다.

n = p * q -> 143 = 13 * 11

 

3. 아래 공식을 적용하여 ∅(n)을 구한다.

∅(n) = (p - 1) * (q - 1) -> 120 = 12 * 10

 

4. 다음 조건을 만족하는 e를 선택한다.

gcd(e, ∅(n)) = 1, 1<e<∅(n) -> gcd(e, 120) = 1과 1<e<120을 만족하는 23 선택
  • gcd(e, ∅(n)) = 1은 e와 ∅(n)이 최대공약수가 1이어야 한다는 것이다. 즉, e와 ∅(n)은 서로소이다.
  • 1<e<∅(n)은 1보다 크고, ∅(n)보다 작아야 한다. 
  • e=23은 주어진 조건을 만족시키는 유효한 값이다. 23 외에도 다른 e 값을 선택할 수 있으며, 이러한 선택은 RSA 암호화의 특징 설정에 따라 달라질 수 있다. 중요한 점은 e와 ∅(n)이 서로소이어야 하고, e는 1과 ∅(n) 사이에 있어야 한다.

 

5. 다음 조건을 만족하는 d를 구한다(수식 'e * d = 1 (mod ∅(n))'은 e*d를 ∅(n)로 나누었을 때 나머지가 1이 된다는 의미다).

e * d = 1 (mod ∅(n)), 1<d<∅(n)
  • 모듈러 역원 계산해서 d를 찾아간다는데 뭔지 잘몰라서 d를 찾아가는 과정 생략...ㅎㅎ
  • 모듈러 역원 계산을 통해 d가 47이 되는데 23 * 47 % 120 = 1이 된다.

 

6. {n, e}가 공개키고, {n, d}가 비밀키다. p, q, ∅(n)은 공개되지 않도록 해야한다. {143, 23}이 공개키가 되고, {143, 47}이 비밀키가 된다.

 

공개키와 비밀키를 생성하는 방법을 알았으니, 암호화하는 방법과 복호화하는 방법에 대해 알아보자. 평문 문자가 m일 때, 공개키 {n, e}를 이용해 암호 문자 c를 구하는 수식은 다음과 같다.

c = m^e mod n

 

그리고 암호 문자 c를 비밀키 {n, d}를 이용해 복호화하는 수식은 다음과 같다.

m = c^d mod n

 

위 동작 원리를 가지고 사용자 A가 문자 'J'를 암호화해서 사용자 B에게 보내면, 사용자 B가 어떤 과정으로 복호화하는지 살펴보자.

 

1. 문자 'J'의 아스키 코드 값은 1001010(74)이고, 사용자 B의 공개키 {n, e}는 {143, 23}이므로 철수는 암호화 수식에 대입하여 암호 문자 94를 구한다

74^23 mod 143 = 94

 

2. 사용자 A는 사용자 B에게 암호 문자 94를 보낸다.

 

3. 암호 문자 94를 받은 사용자 B는 자신의 비밀키 {n, d}가 {143, 47}이므로 복호화하는 수식에 대입하여 74를 구해 평문 문자 'J'를 얻게 된다. 제3자가 암호 문자 94를 가로챈다고 해도 사용자 A의 공개키인 {143, 23}만 가지고는 복호화할 수 없다.

94^47 mod 143 = 74

{143, 23} 공개키로 하는 경우에는 복호화가 되지 않는다.
94^23 mod 143 = 37 -> 전혀 다른 수가 나옴

 

HTTPS

HTTPS는 암호화 프로토콜을 사용하여 통신을 암호화한다. 이 프로토콜은 이전에는 보안 소켓 계층(SSL)으로 알려졌지만, 전송 계층 보안(TLS)라고 불린다. 이 프로토콜은 비대칭 공개키 인프라로 알려진 것을 사용하여 통신을 보호한다. 이 유형의 보안 시스템에는 두 개의 서로 다른 키를 사용하여 두 당사자 간의 통신을 암호화한다.

  • 개인키: 이 키는 웹 서버에서 관리하며, 비공개로 유지된다. 해당키로 암호화된 정보를 해독하는데 사용된다.
  • 공개키: 이 키는 안전한 방식으로 서버와 상호작용하고자 하는 모든 사람이 사용할 수 있다. 공개키로 암호화된 정보는 개인키로만 해독할 수 있다.

 

위 개인키 공개키를 이용한 비대칭키(공개키) 시스템은 대칭키의 한계를 보완하고자 위에서 봤듯이 1970년대에 수학자들에 의해 공개키 암호화 방식이 개발되었다. 이 비대칭키 시스템 덕분에 클라이언트가 로그인을 시도했을때 비밀번호를 공개키로 암호화해서 서버에 보낸다면 제3자가 가로채더라도 같은 공개키로는 암호문을 복호화할 수 없기 때문에 안전할 수 있다.

 

HTTPS 의 동작 원리

이제 위에서 배운 암호화 방식을 가지고 HTTPS가 네트워크 상에서 어떻게 암호화, 복호화가 이루어지는지에 대해서 자세히 살펴보자. HTTPS가 안전하기 위해서는 다음과 같은 특징을 가져야 한다.

 

  1. 내가 사이트에 보내는 정보들을 제3자가 못보게 한다.
  2. 접속한 사이트가 믿을 만한 곳인지를 알려준다.

 

1번 내가 사이트에 보내는 정보들을 제3자가 못보게 하는 것은 위 개인키와 공개키를 사용한 비대칭키 시스템으로 된다는 것을 확인했다. 그러면 해당 사이트가 믿을만한 곳인지는 어떻게 증명할 수 있을까?

 

서버에서 클라이언트에게 보내는 정보들은 그 일부가 서버의 비밀키로 암호화되어 있다. 그리고 클라이언트가 서버의 공개키로 풀어서 알아볼 수 있는 것은 해당 서버의 비밀키로 암호화된 정보들 뿐이다. 따라서 안전하지 않은 사이트에서 온 정보들은 원래 접속하려던 서버가 제공한 공개키로는 풀리지 않기 때문에 열어보려고 하면 오류가 발생한다. 신뢰할 수 있는 기관에서 우리에게 서버의 공개키만 검증해준다면 클라이언트는 이걸 기준으로 안전하게 해당 사이트를 이용할 수 있다. 이 서버가 클라이언트에게 뿌린 공개키가 정품인지를 확인하기 위해서 이를 인증해주는 공인된 민간기업을 CA(Certificate Authority)라 한다. 크롬, 사파리, 파이어폭스 등과 같은 브라우저가 CA를 통해 어떻게 인증된 공개키인지 다음 과정들을 살펴보며 알아보자.

 

클라이언트는 아직 서버를 신뢰하지 못하기 때문에 먼저 클라이언트와 서버는 일종의 탐색과정을 거치게 되는데 이걸 handshake라고 한다. 먼저, 클라이언트는 서버에 보낼 때 어떤 랜덤 데이터를 생성한다. 이걸 받은 서버도 무작위의 데이터를 생성하여 클라이언트에게 보내는데 이 때, 인증서를 함께 보낸다. 이제 그 둘은 연결이 됐다고 볼 수 있다.

 

그러면 클라이언트는 이 인증서가 진짜인지를 비대칭키 시스템으로 브라우저에 내장된 CA들의 정보를 통해 확인하게 된다. CA의 인증을 받은 인증서들은 해당 CA의 개인키로 암호화되어 있기 때문에 비대칭키 시스템을 사용해서 진짜인지를 확인하는데 해당 인증서를 복호화할 수 있는 것은 브라우저에 저장된 CA의 공개키뿐이기 때문이다. 만약 CA 리스트 중에 이 인증서가 해당하는 것이 없다면 브라우저 주소창에는 Not secure라는 안전하지 않다는 표시가 뜨게 된다. 성공적으로 복호화된 인증서에는 서버의 공개키가 포함되어 있다.

 

그러면 서버의 공개키로 메시지를 암호화해서 서버에서 복호화하는 비대칭키 방식으로 주고받을까? 아니다. 비대칭키 방식으로 메시지를 암호화 및 복호화하는 작업은 대칭키 방식으로 할 때보다 컴퓨터에 훨씬 큰 부담을 주기 때문에 이후에는 대칭키 방식과 비대칭키 방식이 함께 혼합되어 사용된다. 따라서 데이터는 대칭키로 암호화를 한다. 하지만 대칭키는 탈취당할 위험이 있기 때문에 대칭키를 공유할 때 비대칭키 방식을 사용한다. 아까 handshake할 때 생긴 두 무작위 데이터를 혼합해서 임시키로 만든다. 이 임시키는 서버의 공개키로 암호화해서 서버로 보내진 다음 양쪽에서 일련의 과정을 거쳐 동일한 대칭키가 만들어진다. 이 대칭키는 서버와 클라이언트 둘만 갖고 있기 때문에 이후 서로 주고받아지는 메시지들은 제3자가 알아볼 걱정은 없어진다.

 

 

 

출처

소프트웨어 세상을 여는 컴퓨터 과학

HTTPS란 무엇입니까?

HTTPS가 뭐고 왜 쓰나요?(Feat. 대칭키 vs 비대칭키)