티스토리 뷰
암호학의 간략한 역사
태초에 DES(Data Encryption Standard)가 있었다. DES는 Confusion(혼돈, 원문의 내용을 짐작하기 어렵게 함.)과 Diffusion(확산, 알고리즘의 패턴을 짐작하기 어렵게 함.)을 높이기 위해 여러 번의 round를 반복하는 파이스텔 구조(Substitution과 Permutation을 번갈아 수행하는 구조)로 되어 있었다.
하지만 DES는 대칭키 알고리즘을 이용한 암호화 방식이었으므로 대칭키를 이용하여 암호화하기 위해서는 수신자와 송신자가 서로 같은 키를 가지고 있어야 하지만 이때 key를 안전하게 주고 받을 수 없는 문제점이 있었고 이 문제를 해결하기 위해 DH key exchange (Diffie-Hellman) 방식이 탄생하게 되었다.
DH 알고리즘이 해결하고자 한 문제는 이전까지의 대칭키 알고리즘에서 존재하는 key의 confidentiality 문제였다. 이는 secure하지 않은 channel을 통해 key를 주고 받은 경우 송신자와 수신자가 key에 대해 신용할 수 없다는 문제점을 의미하며 디피와 헬만은 이를 이산 대수의 난해함을 이용하여 해결하였다.
하지만 DH 알고리즘이 confidentiality 문제는 해결하였지만 authentication 문제는 아직 남아있었다. 중간자가 MITM(Man-In-The-Middle) 공격을 통해 shared key를 직접 생성하여 authentication을 시도할 수 있었으므로 이 문제를 해결하기 위해 RSA 알고리즘이 탄생하게 된다.
RSA 알고리즘 이전까지는 대칭키 알고리즘과 그때 사용될 키를 어떻게 안전하게 옮길지에 대한 문제를 해결하기 위해서였다면 RSA는 2개의 키를 생성하여 하나의 key는 public으로 완전히 공개하고 다른 하나의 키를 private하게 보관하여 하나의 키로 암호화된 정보를 다른 키를 이용하여 복호화 할 수 있는 구조로 만들어 confidentiality와 authentication 둘 다 해결할 수 있었다.
RSA 알고리즘은 소인수분해의 난해함을 이용한 trapdoor function(한 쪽으로의 연산은 간단하지만 그 반대로의 연산은 key없이는 엄청난 연산을 필요로 함)으로 문제를 해결하였다.
RSA의 등장으로 그전까지 존재하던 문제는 전부 해결된 것처럼 보였지만 WWW가 발명되고 웹이 엄청난 속도로 발전함에 따라 생긴 문제, 클라이언트에서 서버를 믿을 수 없는, 가 발생했다. 이를 해결하기 위해 등장하게 되는 것이 PKI(Public Key Infrastructure)이다.
또 RSA는 기본적으로 많은 연산량을 필요로 하여 속도가 느리다는 단점이 있었는데 이를 해결하기 위해 ECDSA(Elliptic Curve Digital Signature Algorithm), AES(Advanced Encryption Standard) 등이 등장하게 된다.
ECDSA는 비대칭키 알고리즘으로 타원곡선에서의 이산로그의 난해함을 이용한 암호화 방식으로 RSA와 마찬가지로 공개키 암호화 구조를 가지며 RSA에 비해 같은 암호화 수준을 갖기 위해서 훨씬 더 적은 bit의 key를 요구한다는 장점이 있다. key의 길이가 짧아짐에 따라 요구하는 연산량이 줄어들고 결과적으로 더 빠른 암호화 속도를 가질 수 있게 되었다.
AES는 DES가 가지는 여러가지 문제점(S-box의 존재, 짧은 key 길이 등)으로 인해 제 3자에 의해 쉽게 복호화되는 문제점을 가지고 있었고 이를 해결하기 위해 DES를 3번 시행하는 3DES로 사용하고 있었지만 이에 따른 연산량의 증가로 성능 문제가 생기고 이를 해결하기 위해 AES가 발명되게 되었다.
이때 미국의 NSA에서 DES를 대체하기 위해 대회를 열었고 Rijndael 알고리즘의 높은 성적(보안성, 쉬운 구현, 성능, 소프트웨어 디자인 등)으로 인해 해당 알고리즘이 AES로 선정되게 된다.
AES는 RSA의 문제를 직접적으로 해결하기 보다 RSA, ECDHE 등의 알고리즘으로 key를 교환하고 이 key를 기반으로 빠르고 안전하게 실제 data를 암호화하는데 사용되게 된다.
PKI는 모두가 믿을 수 있다고 합의한 어떤 최상위 entity(root CA)를 두고 그 최상위 entity가 신용을 보장하는 하위 entity(intermediate CA)들을 두면서 RSA, ECDSA 등의 비대칭키 알고리즘으로 인증서를 발급하는 hierarchy 구조를 가지게 된다.
root CA를 믿을 수 있다고 가정하였으므로 적절한 방법에 따라 인증한 하위 CA들도 믿을 수 있고 이를 통해 Chain of Trust 구조를 가질 수 있게 되었다.
이를 통해 서버의 authentication 문제는 해결되었지만 아직 다른 문제가 남아있었는데 웹이 발전됨에 따라 E-Commerce 시장도 발전되었고 이때 클라이언트와 서버간에 결재 정보와 같은 민감한 정보를 주고 받을때 평문으로 주고받고 있었는데 이런 문제를 해결하기 위해 SSL(Secure Socker Layer)이 발명되게 되었다.
SSL(TLS)은 위에서 등장한 DH, RSA, PKI, AES, ECDSA, ECDHE 등의 모든 기술이 이용되어 구성된 protocol로 client와 server간에 nonce(random number)를 주고 받고 nonce를 통해 key를 생성하여 연결을 수립하고 대칭키를 이용하여 HTTP 컨텐츠를 암호화하여 주고받는 수순으로 구성된다.
이때 기존의 RSA를 이용한 SSL 구조에서는
1. 클라이언트에서 Cipher Suite과 함께 client random을 전송하고
2. 서버에서 SSL 인증서, server random을 전송
3. SSL 인증서의 public key로 premaster secret 암호화
4. server에서 private key를 이용하여 복호화.
5. 양측이 전부 갖고 있는 client random, server random, premaster secret를 이용하여 session key 생성
의 구조를 가지게 되는데 이때 private key가 4번에서 한번만 사용된다는 점을 이용한 Keyless SSL이 등장하게 된다.
Keyless SSL에서는 EDH(Ephemeral Diffie-Hellman)를 이용하게 되는데 단 한 번만 사용되는 DH parameter라는 것을 추가로 주고 받아 RSA를 이용한 복잡한 연산없이 모듈러 연산을 사용하는 DH 알고리즘을 이용하여 session key를 생성할 수 있게 되었고 여기에 모듈러 연산 대신 ECC(타원곡선을 이용한 암호화)를 사용하는 ECDHE 알고리즘이 탄생하게 되었다.
여기에 더해 ephemeral한 DH parameter와 ECDHE의 낮은 연산량 덕분에 PFS(Perfect Forward Secrecy)가 탄생하게 되는데 연결되는 내내 일정 주기에 따라 session key를 생성해서 새로 연결을 수립하는 방법으로 공격자에 의해 session key가 노출되어도 해당 session 동안에서만 문제가 발생하고 그 이후로 새로운 session key를 생성하므로 key를 사용하지 않으면서 더 안전한 연결 과정을 수립할 수 있게 되었다.
잘못된 정보가 있을시 댓글 부탁드립니다!
레퍼런스
https://www.cloudflare.com/learning/ssl/keyless-ssl/
'CS' 카테고리의 다른 글
CRDT의 기본 개념과 원리 그리고 구현체인 Yjs의 원리 (0) | 2023.01.06 |
---|---|
Base64 인코딩 (0) | 2022.11.03 |
Stub, Fake, Mock, Dummy, Spy (2) | 2022.09.19 |
직렬화(Serialization) (0) | 2022.08.26 |
URI, URL, URN의 차이점 (0) | 2022.08.25 |
- Total
- Today
- Yesterday
- lunarvim
- neovim
- RequestParam
- ModelAttribute
- 아키텍처
- 도커
- IDE
- 배포
- JavaScript
- Dap
- 루나빔
- RequestBody
- RequestPart
- vim
- 레디스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |