암호 알고리즘 총괄
개요
이 문서는 각종 암호 알고리즘들을 총망라해서 정리한 문서이다.
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]
이건 간단하게 실습해볼 수 있다.
문자의 길이가 일정 비트를 넘어갈 때마다 암호문의 길이도 커진다.
설정에서 key type을 커스텀하면 내 임의의 대칭키를 넣어보는 것도 가능하다.
utf8에서 숫자와 영어는 1바이트(8비트)이므로, 256비트를 넣기 위해 32 문자를 넣어주고, IV 키는 128 비트여야 해서 16 문자를 넣었다.
비대칭키
비대칭키 알고리즘은 암호화를 하는 키와 복호화를 하는 키가 다른 암호 알고리즘을 말한다. 이 둘은 개인키, 공개키라고도 부르는데, 이는 용도에 따라 부르는 명칭일 뿐, 둘 간의 다른 특징이 있는 것은 아니다. 키가 2개 필요하고, 이 두 키는 같지 않기 때문에 비대칭키라고 부른다. > [!NOTE] 공개키 알고리즘 > 키의 특성을 기준으로 부를 때 비대칭키라고 하지만, **용도 관점에서는 공개키 알고리즘**이라고 부른다. > 공개키 알고리즘이란 표현이 훨씬 많이 쓰이고, 이 문서의 내용인 Public Key Infrastructure도 공개키를 명칭으로 삼는다. > 그래서 이 단락에서는 비대칭키라고 하나, 앞으로는 공개키라고 부르는 경우가 훨씬 많을 것이다.비대칭키는 연산 과정이 조금 더 복잡하기에 대칭키에 비해 연산이 조금 더 오래 걸린다.
그래서 비대칭키는 서버와 클라 간에 사용할 대칭키를 안전하게 교환하는 방법으로서 주로 활용된다.
비대칭키 알고리즘의 특징은 말 그대로 공개키를 가진 사람은 개인키로 암호화된 텍스트를 읽을 수 있다는 것이다.
반대로, 공개키로 암호화한 텍스트는 개인키를 가진 자만이 읽을 수 있다.
- 클라는 서버의 공개키로 복호화가 가능한 암호문만이 서버의 암호문이라고 검증할 수 있다.
- 어떤 텍스트가 누구에 의해 쓰여졌는지 확인할 수 있게 되기에, 일종의 사인(서명) 효과를 가질 수 있다.
- 그래서 이를 활용하는 것을 디지털 서명(Digital Signature)라고 부른다.
- 또한 클라가 공개키를 이용해 암호화한 내용은 서버만이 읽을 수 있다.
- 클라의 텍스트가 악의적인 사용자가 가져가는 것을 방지할 수 있다.
비대칭키 알고리즘은 현재 크게 두 가지가 있는데, 이들 자체보다는 어떻게 서로만의 비대칭키를 가질 수 있는가, 혹은 비대칭키를 활용해 어떻게 대칭키를 안전하게 교환할 수 있는가에 대해서 종류가 나뉜다.
ECDSA
Elliptic Curve Digital Signature Algorithm[3], 즉 타원곡선 디지털 서명 알고리즘은 타원곡선 암호기술(Elliptic-curve cryptography, ECC)에 기반한 디지털 서명 알고리즘이다.[4]
해당 암호 실습 사이트에는 이것만 있기 때문에 이것으로 정리했는데, ECC를 이용해서 비대칭키를 아예 만들어 통신하는 것도 가능하다.
꽤나 최신(무려 2021년)에 본격적으로 사용되고 있는데, 아래의 RSA와 비교해서 키의 크기가 매우 작고, 검증 속도가 빠르다는 장점이 있어 모바일 환경에서 주로 사용된다고 한다.
암호 예제 사이트에서는 먼저 키 생성을 할 수 있다.
-----BEGIN PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgvTelR0DDyqfOPhIAWgwN
RX8ITeQt595MtgviPnDTjI6hRANCAAQ8rCa4lopTqgc3z7QePTsQsp9fTu2s59yh
xynvk1LhGnqnju4YtFfdKIRx99P+Wb9iwntAtNe6bL8gvDp4Q1c9
-----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEPKwmuJaKU6oHN8+0Hj07ELKfX07trOfc
occp75NS4Rp6p47uGLRX3SiEcffT/lm/YsJ7QLTXumy/ILw6eENXPQ==
-----END PUBLIC KEY-----
그 다음 메시지 서명 시 개인키를 넣어주면, 서명을 확인할 때 사용되는 값이 나오게 된다.
304402202d022ceec6ae3b68f0d5291177361503a579395d528c6467570fe1c7507b991e02204261b5cce821a518ef7bda0faec2d467b63a2e9547e417de3aa6d255d5e0109f
그러면 이제 어떤 텍스트가 왔을 때 이 텍스트가 어떤 서버로부터 왔는지를 알 수 있게 된다.
클라는 서버로부터 어떤 데이터를 받을 때, 텍스트와 서버의 공개키, 그리고 이에 대한 서명된 값을 받게 될 것이다.
이 중간에 악의적인 누군가가 끼어 데이터를 변조하려고 하더라도, 서명된 값을 그대로 재현할 방법은 없다.
그러니 클라는 자신이 받은 데이터가 서버가 보낸 것이고, 변조되지 않았다는 것을 확인할 수 있게 된다.
여기에서 공개키가 서버의 공개키가 맞는지, 악의적 사용자가 자신의 공개키를 만들어서 뿌린 게 아닌지를 어떻게 검증할 수 있는지 추가 의문이 생길 수 있다.
이 내용은 아래에서 본격적으로 다룰 것이기에 그냥 이런 게 있는 갑다 생각만 하자.
RSA
보통 공개키 알고리즘이라 하면, 이 RSA를 이야기하는 경우가 많다.
TLS 인증에서는 이 방식을 주로 사용하기에 이것과 관련한 요소들을 많이 보게 될 것이고, 이 문서에서도 내용을 진행하며 이 알고리즘에 기반한 내용들을 다룰 것이다.
이 방식은 정수론의 증명된 법칙을 활용한다.
이 개인키와 공개키를 구하는 과정, 이 둘의 암복호화가 서로 동일하다는 것을 증명하는 과정은 매번 보고 매번 이해하고 매번 까먹어서(..) 이제 정리하지 않으려고 한다.
궁금하다면 그냥 꺼무위키[^5]를 참고하자.
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-----
서명을 하는 방법도 사이트에 나와 있지만, 일단 기본적인 방식만 확인하기 위해 암호화 복호화만 해본다.
8421fbf540c3e4e136ff9982e84df7cca87f9704c27941f936feda79ba2e9c000c562233c2cf048e5c6180543dc086e6144f26fc72f9c8f60a3706415820390e7405f0bb700491a3c2a52ef176040868c23c2c54a842d475d84a37b57f508d114b42c17ad3f2e8688972a6611bc08d42fbc82fcaa9fa445791aab01927346542
이것은 공개키를 이용해 암호화된 내용이다.
이 내용은 개인키를 가지고 있는 서버만이 해독을 할 수 있다.
해시
해시 함수는 위의 다른 암호화 방식과 다르게, 암호화 이후에 복호화가 불가능한 함수이다. 기본적으로 복호화가 불가능한 이유는 암호화 과정에서 기존 텍스트의 정보를 많이 버리면서, 일대일 대응 함수가 아니기 때문이다. 가령 x의 제곱이 4라고 한다면, 여기에서 x는 -2일 수도 있기에 2라고 단정지을 수가 없다. 결국 암호화된 출력값(digest라고도 함)을 아무리 뜯어봐도, 원래 텍스트가 무엇이었는지는 알 수 없게 된다. 그래서 이 놈은 좀 암호화라고 표현하기 보다는, 그냥 해싱했다, 해시 연산을 거쳤다고 말하는 게 조금 더 어감이 와닿는다.해시 알고리즘은 다음의 중요한 특징을 가지며, 이 특징을 가져야만 의미가 있다.
- 어떤 텍스트가 들어가도 나오는 출력값은 저마다 고유해야 한다.
- 그래서 입력값이 뭐였는지는 몰라도, 두 출력값을 보고 두 입력값이 같은지 다른지 알 수 있다.
- 텍스트 간 단 한 글자만 달라도 출력값은 완전히 다른 모양을 가지고 있다.
- 이로부터 패턴을 찾아내는 것이 불가능하며, 출력값으로부터 입력값을 알 수 없다.
- 들어간 텍스트의 길이에 상관없이 무조건 일정한 길이로 출력된다.
- 나머지 연산 같은 압축되는 과정이 들어가기 때문
이 특징들로 인해 해시 알고리즘은 매우 중요한 의미를 가지게 되며, 암호화폐에서도 활용된다.
주로 활용되는 방식은 데이터 무결성 검증이다.
서버는 클라이언트에게 자신의 평문과 다이제스트를 같이 보낸다.
그러면 클라는 평문을 같은 해시 함수로 돌려서 다이제스트가 같은지 비교하여 데이터가 변조되지 않았는지 검증할 수 있다.
참고로, 출력값의 길이가 정해졌다는 뜻은 비둘기 집의 원리(n개의 집에 무작위로 n+1마리의 비둘기가 들어가면 최소한 한 집에는 두 마리의 비둘기가 들어가있다)가 적용된다는 뜻이기도 하다.
그래서 해시 충돌(다른 입력값, 같은 결과)이 일어나기도 하는데, 이를 해소하기 위해 해시 체이닝 등의 기법이 존재한다.
레인보우 테이블이라 하여, 나올 수 있는 모든 해시값을 테이블로 정리해두는 공격 방법이 존재한다.
해시 함수는 기본적으로는 키라는 개념이 없다.
그래서 어떤 해시 함수에 대해 가능한 모든 입력값을 넣어보고 테이블화시켜두는 것이다.
그러면 한 입력값은 한 출력값만 가지기에, 한 출력값을 보고 입력값을 유추해낼 수 있게 된다.
MD5
(어차피 알고리즘을 깊게 뜯어볼 게 아니라 한꺼번에 있는 사진을 사용한다.[5])
Message-Digest 5는 128비트의 출력값을 내는 알고리즘이다.
계산이 단순해서 빠르게 값을 꺼낼 수 있다.
그러나 2의 128승 만큼의 출력값이 가능한 건데, 현대에 이르러 해시 충돌이 자주 목격되고 있어서 핵심적인 알고리즘은 되지 못한다.
대신 대용량 파일 무결성을 빠르게 체크할 때 정도로는 쓰인다고 한다.
SHA 256
Secure Hash Algorithm은 관련된 암호학적 해시 함수들의 모임이다.[6]
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 |