암호 알고리즘 총괄

개요

이 문서는 각종 암호 알고리즘들을 총망라해서 정리한 문서이다.
PKI 문서를 정리하다가 파생됐기에 어느 정도 종속성이 있을 수 있다.
각 알고리즘의 정확한 원리보다는 간단하게 어떤 특징을 가지는지 위주로 정리했다.

정의

암호화는 기본적으로 일반 텍스트를 제 3자가 알아볼 수 없도록 다른 텍스트로 변환하는 과정을 말한다.
이 변환은 기존 텍스트와의 최소한의 연관성이 있어야 한다.
달리 말해 abc라는 텍스트를 변환하는데 어제는 132, 오늘은 432 이런 식으로 무작위로 나오면 안 된다는 뜻이다.
암호화에는 변환에 쓰이는 암호 알고리즘이 있다.

참고로 미리 알아둘 건, 암호화라는 건 결국 모두 함수이다.
x에 어떤 연산을 하면 y가 나오는 그 함수가 맞다.

분류

현대에서 분류되는 암호 알고리즘은 크게 3가지로 분류된다.
실습을 하면서 볼 것이기에 이 사이트를 많이 활용하게 될 것이다.

용어에 대해

어디에서는 공유 비밀키, 어디에서는 무슨 키, 이론이 오래 되고 많은 연구가 이뤄져서 그런 건지, 활용되는 분야가 많아서 그런 건지 하나를 가리키는 데에 여러 표현들이 존재한다.
나는 내가 가장 친숙한 용어를 선택하여 설명하고자 한다.

다양한 알고리즘들을 살펴볼 건데, 각 알고리즘 자체를 이해하기 보다는 각 분류에 이런 이름의 알고리즘이 있다 정도만 알고 넘어가도 크게 문제 없다.

대칭키

대칭키 알고리즘은 암호화를 하는데 쓰이는 키가 복호화를 하는데 쓰이는 키와 같은 알고리즘들을 말한다.
대칭키를 이용한 암호화는 함수 연산이 적어서 암호화, 복호화간 속도가 빠르다는 장점이 있다.
그래서 서버와 클라 간에 이 대칭키가 안전하게 서로 공유만 될 수 있다면, 대칭키를 이용하는 것이 가장 좋다.

DES


Data Encryption Standard는 대표적인 대칭키 알고리즘이다.
뭔가 복잡해보이는데 막상 까보면 별거 없다.
자세한 알고리즘은 이 글[1]이 정말 설명 잘 해뒀으니 참고.
간단하게만 말하자면, 암호화를 위해 몇 가지 단계를 거친다.
중간에 반복되는 구간 각각을 라운드 함수라고 부르는데, 여기에 f 연산에서 키가 쓰인다.
56bit짜리 키는 키 생성키를 통해 48비트짜리 16개의 키로 분화되고, 이 키를 이용해서 XOR 연산을 한다.
XOR도 하고, 문자를 반으로 쪼개서 위치도 바꾸고, 비트 값을 행렬의 인덱스로 사용하는 등 각종 비선형 함수들을 통해 암호화를 한다.
복호화할 때는 이 순서를 그냥 반대로만 해주면 된다.
이 암호화의 취약점은 키가 56bit라는 것이다.
그래서 브루트 포스 공격에 취약하고, 이 대안으로 이 과정을 3번 더하는 3DES가 나왔다.
(근데 그래도 사실 소용없다.)

AES

Advanced Encryption Standard는 그 다음으로 나온 대칭키 알고리즘으로, 요즘 흔히 쓰이는 알고리즘이다.
말 그대로 조금 더 발전된 형태인데, 일단 128,192,259 비트의 키를 지원하기에 브루트 포스가 훨씬 어렵다.

전체 플로우는 비슷하지만, 중간 연산에서 훨씬 더 역산이 어려운 행렬 연산들을 사용한다.[2]
image.png
이건 간단하게 실습해볼 수 있다.
문자의 길이가 일정 비트를 넘어갈 때마다 암호문의 길이도 커진다.
image.png
설정에서 key type을 커스텀하면 내 임의의 대칭키를 넣어보는 것도 가능하다.
image.png
utf8에서 숫자와 영어는 1바이트(8비트)이므로, 256비트를 넣기 위해 32 문자를 넣어주고, IV 키는 128 비트여야 해서 16 문자를 넣었다.
image.png

비대칭키

비대칭키 알고리즘은 암호화를 하는 키와 복호화를 하는 키가 다른 암호 알고리즘을 말한다. 이 둘은 개인키, 공개키라고도 부르는데, 이는 용도에 따라 부르는 명칭일 뿐, 둘 간의 다른 특징이 있는 것은 아니다. 키가 2개 필요하고, 이 두 키는 같지 않기 때문에 비대칭키라고 부른다. > [!NOTE] 공개키 알고리즘 > 키의 특성을 기준으로 부를 때 비대칭키라고 하지만, **용도 관점에서는 공개키 알고리즘**이라고 부른다. > 공개키 알고리즘이란 표현이 훨씬 많이 쓰이고, 이 문서의 내용인 Public Key Infrastructure도 공개키를 명칭으로 삼는다. > 그래서 이 단락에서는 비대칭키라고 하나, 앞으로는 공개키라고 부르는 경우가 훨씬 많을 것이다.

비대칭키는 연산 과정이 조금 더 복잡하기에 대칭키에 비해 연산이 조금 더 오래 걸린다.
그래서 비대칭키는 서버와 클라 간에 사용할 대칭키를 안전하게 교환하는 방법으로서 주로 활용된다.

비대칭키 알고리즘의 특징은 말 그대로 공개키를 가진 사람은 개인키로 암호화된 텍스트를 읽을 수 있다는 것이다.
반대로, 공개키로 암호화한 텍스트는 개인키를 가진 자만이 읽을 수 있다.

비대칭키 알고리즘은 현재 크게 두 가지가 있는데, 이들 자체보다는 어떻게 서로만의 비대칭키를 가질 수 있는가, 혹은 비대칭키를 활용해 어떻게 대칭키를 안전하게 교환할 수 있는가에 대해서 종류가 나뉜다.

ECDSA

Elliptic Curve Digital Signature Algorithm[3], 즉 타원곡선 디지털 서명 알고리즘은 타원곡선 암호기술(Elliptic-curve cryptography, ECC)에 기반한 디지털 서명 알고리즘이다.[4]
해당 암호 실습 사이트에는 이것만 있기 때문에 이것으로 정리했는데, ECC를 이용해서 비대칭키를 아예 만들어 통신하는 것도 가능하다.
꽤나 최신(무려 2021년)에 본격적으로 사용되고 있는데, 아래의 RSA와 비교해서 키의 크기가 매우 작고, 검증 속도가 빠르다는 장점이 있어 모바일 환경에서 주로 사용된다고 한다.
image.png
암호 예제 사이트에서는 먼저 키 생성을 할 수 있다.

-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgvTelR0DDyqfOPhIAWgwN
RX8ITeQt595MtgviPnDTjI6hRANCAAQ8rCa4lopTqgc3z7QePTsQsp9fTu2s59yh
xynvk1LhGnqnju4YtFfdKIRx99P+Wb9iwntAtNe6bL8gvDp4Q1c9
-----END PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPKwmuJaKU6oHN8+0Hj07ELKfX07trOfc
occp75NS4Rp6p47uGLRX3SiEcffT/lm/YsJ7QLTXumy/ILw6eENXPQ==
-----END PUBLIC KEY-----

image.png
그 다음 메시지 서명 시 개인키를 넣어주면, 서명을 확인할 때 사용되는 값이 나오게 된다.

304402202d022ceec6ae3b68f0d5291177361503a579395d528c6467570fe1c7507b991e02204261b5cce821a518ef7bda0faec2d467b63a2e9547e417de3aa6d255d5e0109f

image.png
그러면 이제 어떤 텍스트가 왔을 때 이 텍스트가 어떤 서버로부터 왔는지를 알 수 있게 된다.
클라는 서버로부터 어떤 데이터를 받을 때, 텍스트와 서버의 공개키, 그리고 이에 대한 서명된 값을 받게 될 것이다.
이 중간에 악의적인 누군가가 끼어 데이터를 변조하려고 하더라도, 서명된 값을 그대로 재현할 방법은 없다.
그러니 클라는 자신이 받은 데이터가 서버가 보낸 것이고, 변조되지 않았다는 것을 확인할 수 있게 된다.

추가 궁금점

여기에서 공개키가 서버의 공개키가 맞는지, 악의적 사용자가 자신의 공개키를 만들어서 뿌린 게 아닌지를 어떻게 검증할 수 있는지 추가 의문이 생길 수 있다.
이 내용은 아래에서 본격적으로 다룰 것이기에 그냥 이런 게 있는 갑다 생각만 하자.

RSA

보통 공개키 알고리즘이라 하면, 이 RSA를 이야기하는 경우가 많다.
TLS 인증에서는 이 방식을 주로 사용하기에 이것과 관련한 요소들을 많이 보게 될 것이고, 이 문서에서도 내용을 진행하며 이 알고리즘에 기반한 내용들을 다룰 것이다.

이 방식은 정수론의 증명된 법칙을 활용한다.
이 개인키와 공개키를 구하는 과정, 이 둘의 암복호화가 서로 동일하다는 것을 증명하는 과정은 매번 보고 매번 이해하고 매번 까먹어서(..) 이제 정리하지 않으려고 한다.
궁금하다면 그냥 꺼무위키[^5]를 참고하자.
image.png
RSA도 일단 각 키를 만드는 것으로 시작된다.

-----BEGIN PRIVATE KEY-----
MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAMXa0RD3mOhvYai8
o0fFPyGSrgjA3+MlAU4d9a5vLSFBkkIQRJ3ctdiFl7kxUZtxFph1+B2xHjiMH8ic
qlXIKfw2//U6JjPNhYxWkWG72v92wDpx894pTuNkp5cs6bVV6oh26598ZTSD6Jwl
eCQC/l9p+9e8rEpTN2GzHIHF6amzAgMBAAECgYEAnds3cpIZLVmwUTAwFdMJy397
2wAHoPKlV+4PVlzdZOssBgl0tX6il13+74Kp2ZsgrANzMj1eHz+tHCHixQ4ub+Ug
4npUPiHiOcoJ4eglmI4UX+e3RVGPlNPgo0d68D9bHZoKpYHL4L2vLDogRZkBm12t
co/AvJPnnKTrU4T7pgECQQDohsjW59AnRTwmD5VhXlSdVbD31nSBjPob27bDXG/t
2BIJOA/JaXLjr91mnR4sUD5lkAWD3CBQE+nXKZF2WZ7lAkEA2dQBU58/qdpXfjKe
/MLaOWRbv5AwRUQSyQEwHjOyKfmRHZou0NKKHhtmLlgMI2ngoQx8YUvfpjZYJnw4
JI+EtwJBAJuph5AetcFkXwTXz9fUD28Ya5UukuYbW2AE8U/NdPzTdheH2UGrfwcf
t2a3bfiaa3sQNDD2zwbsndG1eTSygGUCQQCltjwgIpkrHVjMP7Rls9KSML//lrCy
MRxdYBL8FvXmKt7z9zTAVjsOtmdgwEjTtBtYSYhh+He3Gcar2HpZjfk3AkEAy1VV
/yjT41H0eDaUdLayxLlL9m41FerfXHe9+b2SnqkvYhGy+DU9cZVi9ScAgbyapqHk
3rQBOF6bbTlgR2JHZg==
-----END PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDF2tEQ95job2GovKNHxT8hkq4I
wN/jJQFOHfWuby0hQZJCEESd3LXYhZe5MVGbcRaYdfgdsR44jB/InKpVyCn8Nv/1
OiYzzYWMVpFhu9r/dsA6cfPeKU7jZKeXLOm1VeqIduuffGU0g+icJXgkAv5fafvX
vKxKUzdhsxyBxempswIDAQAB
-----END PUBLIC KEY-----

image.png
서명을 하는 방법도 사이트에 나와 있지만, 일단 기본적인 방식만 확인하기 위해 암호화 복호화만 해본다.

8421fbf540c3e4e136ff9982e84df7cca87f9704c27941f936feda79ba2e9c000c562233c2cf048e5c6180543dc086e6144f26fc72f9c8f60a3706415820390e7405f0bb700491a3c2a52ef176040868c23c2c54a842d475d84a37b57f508d114b42c17ad3f2e8688972a6611bc08d42fbc82fcaa9fa445791aab01927346542

이것은 공개키를 이용해 암호화된 내용이다.
image.png
이 내용은 개인키를 가지고 있는 서버만이 해독을 할 수 있다.

해시

해시 함수는 위의 다른 암호화 방식과 다르게, 암호화 이후에 복호화가 불가능한 함수이다. 기본적으로 복호화가 불가능한 이유는 암호화 과정에서 기존 텍스트의 정보를 많이 버리면서, 일대일 대응 함수가 아니기 때문이다. 가령 x의 제곱이 4라고 한다면, 여기에서 x는 -2일 수도 있기에 2라고 단정지을 수가 없다. 결국 암호화된 출력값(digest라고도 함)을 아무리 뜯어봐도, 원래 텍스트가 무엇이었는지는 알 수 없게 된다. 그래서 이 놈은 좀 암호화라고 표현하기 보다는, 그냥 해싱했다, 해시 연산을 거쳤다고 말하는 게 조금 더 어감이 와닿는다.

해시 알고리즘은 다음의 중요한 특징을 가지며, 이 특징을 가져야만 의미가 있다.

이 특징들로 인해 해시 알고리즘은 매우 중요한 의미를 가지게 되며, 암호화폐에서도 활용된다.
주로 활용되는 방식은 데이터 무결성 검증이다.
서버는 클라이언트에게 자신의 평문과 다이제스트를 같이 보낸다.
그러면 클라는 평문을 같은 해시 함수로 돌려서 다이제스트가 같은지 비교하여 데이터가 변조되지 않았는지 검증할 수 있다.

참고로, 출력값의 길이가 정해졌다는 뜻은 비둘기 집의 원리(n개의 집에 무작위로 n+1마리의 비둘기가 들어가면 최소한 한 집에는 두 마리의 비둘기가 들어가있다)가 적용된다는 뜻이기도 하다.
그래서 해시 충돌(다른 입력값, 같은 결과)이 일어나기도 하는데, 이를 해소하기 위해 해시 체이닝 등의 기법이 존재한다.

레인보우 테이블이라 하여, 나올 수 있는 모든 해시값을 테이블로 정리해두는 공격 방법이 존재한다.
해시 함수는 기본적으로는 키라는 개념이 없다.
그래서 어떤 해시 함수에 대해 가능한 모든 입력값을 넣어보고 테이블화시켜두는 것이다.
그러면 한 입력값은 한 출력값만 가지기에, 한 출력값을 보고 입력값을 유추해낼 수 있게 된다.

MD5


(어차피 알고리즘을 깊게 뜯어볼 게 아니라 한꺼번에 있는 사진을 사용한다.[5])
Message-Digest 5는 128비트의 출력값을 내는 알고리즘이다.
계산이 단순해서 빠르게 값을 꺼낼 수 있다.
그러나 2의 128승 만큼의 출력값이 가능한 건데, 현대에 이르러 해시 충돌이 자주 목격되고 있어서 핵심적인 알고리즘은 되지 못한다.
대신 대용량 파일 무결성을 빠르게 체크할 때 정도로는 쓰인다고 한다.
image.png

SHA 256

Secure Hash Algorithm은 관련된 암호학적 해시 함수들의 모임이다.[6]
image.png
SHA 1, SHA 2 등 다양한 버전과 비트 변형이 존재한다.
대체로 많이 알려진 것은 SHA 2에 속하는 SHA-256 정도인 것 같다.
해시 함수라 하면 보통 SHA 함수군을 이야기하는 경우가 많다.

결론

아주 간단하게 특징만 정리한다면 각 분류는 이렇게 정리될 수 있다.

이러한 특징들을 가지고 있기에, 각종 알고리즘을 혼합하여 보안을 신경쓰는 프로토콜이 다수 생겨났다.

관련 문서

이름 noteType created
SSH 터널링 - 2024-07-12
Amazon Cognito knowledge 2024-07-04
AWS Web Application Firewall knowledge 2024-07-04
SSH knowledge 2024-07-13
SockS knowledge 2024-07-13
쿠버 RBAC knowledge 2024-09-02
code reuse attack knowledge 2024-06-20
buffer overflow knowledge 2024-06-13
TLS downgrade attack knowledge 2024-06-20
sudo knowledge 2024-06-13
Secret knowledge 2025-01-12
파드 시큐리티 스탠다드 knowledge 2025-01-13
ServiceAccount knowledge 2025-01-13
API 접근 제어 우회 knowledge 2025-01-13
멀티 테넌시 knowledge 2025-01-13
Authentication knowledge 2025-01-13
OIDC knowledge 2025-01-13
리눅스 커널 보안 제약 knowledge 2025-01-14
보안 체크리스트 knowledge 2025-01-14
openssl knowledge 2025-01-18
Authorization knowledge 2025-01-19
RBAC knowledge 2025-01-19
Admission Control knowledge 2025-01-20
Admission Webhook knowledge 2025-01-20
cfssl knowledge 2025-01-23
Keycloak knowledge 2025-01-27
AWS Identity and Access Management knowledge 2025-01-31
PKI knowledge 2025-03-10
Audit knowledge 2025-03-12
암호 알고리즘 총괄 knowledge 2025-03-15
Cert Manager knowledge 2025-03-15
Validation Admission Policy knowledge 2025-03-17
Security knowledge 2025-04-11
Shamir Secret Sharing knowledge 2025-04-11
볼트 in 쿠버네티스 knowledge 2025-04-14
Vault Secret Operator knowledge 2025-04-14
TLS knowledge 2025-04-16
Istio PeerAuthentication knowledge 2025-05-04
SPIFFE knowledge 2025-05-04
Istio RequestAuthentication knowledge 2025-05-04
Istio AuthorizationPolicy knowledge 2025-05-04
JWT knowledge 2025-05-05
OAuth knowledge 2025-05-09
나스 초기 세팅 project 2024-12-11
6W - PKI 구조, CSR 리소스를 통한 api 서버 조회 published 2025-03-15
6W - api 구조와 보안 1 - 인증 published 2025-03-15
6W - api 보안 2 - 인가, 어드미션 제어 published 2025-03-16
3W - Public Key Infrastructure published 2025-03-21
5W - 이스티오 mTLS와 SPIFFE published 2025-05-11
5W - 이스티오 JWT 인증 published 2025-05-11
5W - 이스티오 인가 정책 설정 published 2025-05-11
E-로컬 ssh 서버 세팅 topic/explain 2024-07-13
E-쿠버네티스 인증 실습 topic/explain 2025-01-21
E-Kyverno 기본 실습 topic/explain 2025-03-17
E-openssl을 이용한 인증서 생성 실습 topic/explain 2025-03-22
T-각 네임스페이스 서비스 어카운트에 권한 바인딩 topic/temp 2025-03-16
T-서비스 어카운트 토큰은 어떻게 인증되는가 topic/temp 2025-03-16

참고


  1. https://m.blog.naver.com/errorsoft666/221513722574 ↩︎

  2. https://www.appsealing.com/kr/imprortance-of-applying-aes-algorithm/ ↩︎

  3. https://blog.humminglab.io/posts/tls-cryptography-11-ecc/ ↩︎

  4. http://cryptostudy.xyz/crypto/article/3-ECC-타원곡선암호 ↩︎

  5. https://velog.io/@ragi/Back-end-MD5와-SHA의-차이 ↩︎

  6. https://ko.wikipedia.org/wiki/SHA ↩︎