암호화 알고리즘
암호화 알고리즘은 말 그대로 어떤 데이터를 특정 알고리즘을 사용하여 암호화시켜 보안을 높이는 것으로 개발을 공부하면서 중요하다고 생각되는 부분이다.
요즘 거의 대부분의 업무나 연락은 PC 혹은 스마트폰으로 처리하게 된다. 중요하지 않은 내용도 주고받지만 공개되서는 안 되는 중요한 내용이나 문서, 파일 등을 다른 사람이나 시스템으로 보내는 일이 자주 생기게 된다.
이때 필요한 것이 데이터 암호화로 악의적인 목적을 가진 사람이 정보를 탈취하거나 몰래 훔쳐보는 등의 공격을 방지할 수 있게 해 준다.
본격적인 암호화 알고리즘에 대해서 알아보기 전에 간단히 용어를 먼저 살펴보고 정리해 보자.
- 평문(Plaintext): 평문은 해독이 가능한 형태의 데이터 즉, 암호화를 하기 전 원본 데이터를 의미한다.
- 키(Key): 평문을 암호화하여 암호문으로 만들거나, 암호문을 복호화하여 평문으로 만들 때 사용된다.
- 암호문(Cipertext): 데이터를 암호화하여 해독이 불가능하게 만든 메시지를 의미한다.
- 암호화(Encryption): 평문을 암호문으로 변환하는 과정이다.
- 복호화(Decryption): 암호문을 평문으로 변환하는 과정이다.
- 전자서명: 송신자의 개인키로 데이터에 서명하여 전달해 주고, 수신자 측에서는 송신자의 공개키를 이용하여 서명 값을 검증한다.
양방향 암호화
양방향 암호화는 키에 따라서 대칭키인지, 비대칭키인지 구분된다.
평문을 암호화하거나 암호문을 복호화할 때 사용되는 키가 똑같은 것을 대칭키라고 하며, 이와 반대로 서로 다른 키를 가지는 것을 비대칭키라고 한다.
- 대칭키 암호화 방식(Symmetric encryption)
대칭키 암호화 방식은 데이터를 암호화 및 복호화에 동일한 키가 사용되는 것을 의미한다.
예를 들어보면 위의 그림과 같이 B라는 친구가 우리 집에 놀러 온다고 생각해 보자.
B라는 친구가 현재 내가 거주하고 있는 집에 들어오기 위해서는 우리 집 비밀번호를 알아야 한다.
그래서 친구 B에게 우리 집 비밀번호인 20000101을 알려주게 되면 해당 친구는 비밀번호를 입력하여 집에 들어올 수 있다.
여기서 알 수 있는 부분은 비밀번호가 한 개인 것과 친구에게 비밀번호를 공유했다는 점이다.
하나의 비밀번호를 통해 우리 집을 암호화하였고, 친구 B는 해당 비밀번호를 가지고 집에 들어올 수 있었다.
하지만 이러한 대칭키 암호화 방식에서는 문제가 있는데 키를 교환하는 과정과 키를 관리하는 부분에서 발생한다.
먼저 키를 교환할 때 발생하는 문제를 살펴보자.
C라는 친구는 예전부터 손버릇이 아주 안 좋은 친구였다고 가정해 보자.
나는 친한 친구인 B에게 우리 집 비밀번호를 알려줬는데 친구 C가 중간에서 비밀번호를 알게 돼버렸다. 이렇게 되면 친구 C는 내가 가진 중요한 물건 등을 훔치기 위해 우리 집에 들어올 수 있는 문제가 발생한다.
다른 문제점인 키 관리를 살펴보자.
B라는 친구는 예전부터 상당히 인기가 많은 친구였다. 그래서 여러 친구들이 자기 집에 와서 같이 놀자고 비밀번호를 보내주었다.
각각의 아파트에 살고 있는 친구들은 친구 B와 1:1로 연락하여 비밀번호를 공유한 것처럼 보이지만, 실제로 친구 B는 A, B, C, D 아파트에 거주하고 있는 친구들의 비밀번호를 다 알고 있게 된다.
만약 인기가 더 많아져서 훨씬 더 많은 사람들이 자기 집에 놀러 오라고 비밀번호를 알려준다면 친구 B는 어떤 비밀번호가 어떤 아파트에 살고 있는 친구인지 관리하기가 너무 어렵게 된다.
여기까지 대칭키에 대해서 알아봤는데 보안도 부실해 보이고, 관리도 어려운 것 같은데 왜 대칭키를 사용하는 것일까?
여러 문제점이 있어도 대칭키 암호화를 사용하는 이유가 있다면 바로 평문을 전달하는 데 있어 빠르다는 점이다.
중간에 복잡한 과정 없이 그냥 암호화된 문서와 사용했던 키를 전송해 주면 받는 쪽에서는 키를 가지고 복호화만 하면 되기 때문에 다른 암호화 방식보다 빠르다.
하지만 암호화를 하는 이유는 보안이 중요해서이지 성능을 위해서는 아니기 때문에 대칭키 방식에서 문제가 되는 부분을 여러 방법을 통해서 개선할 수 있다.
어떤 방법이 있는지 간단하게 살펴보면 4가지 방법이 있다.
- 키를 사전에 공유하기: 이전에 문제가 되었던 부분은 암호문을 전송할 때 키를 같이 전송하는 것이 문제였다. 따라서 평문과 같이 전송하는 것이 아닌 키 관리기관에 먼저 복호화 키를 전달하는 방법이다.
- 키 배포 센터 활용: 키 배포 센터(KDC)에서 복호화 키를 관리하고 필요할 때마다 키 배포센터에서 받아오는 방법이다.
- diffie-hellman 방식 활용: 공개키 암호화 방식을 활용한 키 교환 방식이다.
- 공개키 암호화 방식을 활용: 대칭되는 키를 사용하는 것이 아닌 암호화와 복호화에 사용되는 키를 다르게 구분하는 방법이다.
마지막으로 이러한 대칭키 암호화에 사용되는 알고리즘으로는 대표적으로 DES, AES, SEED, ARIA 등이 있다.
비대칭키 암호화 방식(Asymmetric Encrytion)
비대칭키 암호화 방식은 대칭키에서 키 교환 문제를 해결하기 위해 등장한 암호화 방식으로 데이터를 암호화 및 복호화에 서로 다른 키를 사용하는 것이다.
비대칭키 암호화 방식에서는 암호문을 생성할 때 사용하는 키를 공개키라고 하며 평문으로 바꾸는 데 사용하는 키를 비밀키 또는 개인키라고 한다. 따라서 비대칭키 암호화 방식을 공개키 암호화라고도 부른다.
공개키는 모든 사람들이 알 수 있도록 공개하기 때문에 공개키라고 하며 비밀키는 수신자 혼자만 알고 있어야 하는 키로 비밀 키라고 한다.
이름 그대로 키가 공개되어 있기 때문에 키를 교환할 필요가 없으며 모든 사람이 접근 가능하다. 반면에 문서를 복호화할 수 있는 개인키는 각 사용자만이 가지고 있는 특징이 있다.
간단한 예시로 공개키 암호화를 이해해 보자.
만약 A 아파트에서 쿠팡 배달을 시켰다고 가정해 보자.
배달원이 물건을 전달하기 위해서 알아야 하는 정보는 무엇일까? 내가 살고 있는 동, 호수도 있지만 가장 중요한 것은 비밀번호를 알아야 한다.
그러면 우리 집 비밀번호를 알려줘야 하는 것인지 생각해 보면 거의 모든 사람들은 알려주지 않을 것이다.
쿠팡을 실제로 사용해 봤다면 배달원에게 알려주는 비밀번호는 거주하고 있는 집의 비밀번호가 아닌 현관문 비밀번호를 알려줄 것이다.
현관문 비밀번호를 알려주면 배달원이 A 아파트로 들어와 실제 거주하고 있는 집 앞에 물건을 놓고 돌아간다.
여기서 배달원은 현관문 비밀번호를 알고 있지만 물건을 받는 사람의 집 비밀번호는 모르기 때문에 들어갈 수 없고 그냥 문 앞에 두고 간다.
여기서 알 수 있는 것은 현관문 비밀번호는 다른 사람에게 공개되는 공개 키고, 실제 내가 거주하고 있는 집의 비밀번호는 개인키가 된다.
예제를 통해서 알아본 공개키 암호화 방식의 장점은 중간에 공격자가 공개키를 얻는다고 해도 해당 사용자의 개인키로만 복호화가 가능하기 때문에 기밀성을 제공하며 개인키를 가지고 있는 수신자만이 암호화된 데이터를 복호화할 수 있으므로 일종의 인증기능도 제공한다는 장점이 있다.
다시 말해보자면 공개키로 공개된 현관문 비밀번호는 누구나 알 수 있어 A 아파트에 들어올 수 있지만 실제 내가 거주하고 있는 집의 비밀번호는 오직 본인만 알기 때문에 본인 외에 누구도 비밀번호를 알 수 없다.
이러한 공개키 암호화 방식의 알고리즘에는 대표적으로 DSA, RSA 등이 있다.
단방향 암호화 방식
암호화를 하는 방법 중에 양방향 외에 단방향 암호화 방식이 있다.
단방향 암호화 방식은 평문에 대해서 암호화는 가능하지만 그 반대로 복호화는 불가한 암호화 방식이다.
단방향 암호화 방식은 주로 해시 알고리즘을 활용하는데 여기서 해시 알고리즘은 같은 입력 값에 같은 출력 값이 나오는 것을 의미한다.
자세한 부분은 밑의 글을 참고하면 좋을 것 같다.
단방향 암호화를 사용하면 복호화를 할 수 없다는 특징으로 인해 공격자가 탈취하더라도 암호문을 풀 수 없다. 그로 인해 단방향 암호화는 주로 비밀번호에 적용된다.
예를 들어 위의 표와 같이 비밀번호를 입력하게 되면 해시 알고리즘을 통해 특정 길이의 값이 출력된다.
그러면 우리가 사용하는 비밀번호는 예시에서 입력값과 같이 생겼는데 어떻게 로그인이나 인증을 할 수 있는 것일까?
사용자 정보가 담기는 DB는 사용자가 입력한 비밀번호 값이 아닌 해시 알고리즘을 통해서 나온 출력 값을 사용자의 비밀번호로 저장한다.
해시 알고리즘의 특징을 생각해 보면 어떤 입력 값이든 항상 고정된 길이의 값이 나오는데 똑같은 입력 값이면 똑같은 출력값이 나오게 된다.
만약 사용자가 비밀번호를 잃어버렸을 경우에 어떨까?
잘 생각해보면 사람들이 사용하는 대부분의 서비스에서 비밀번호를 잊어버려 다시 찾을 때 기존의 비밀번호를 알려주는 것이 아닌 비밀번호를 재설정하라고 나온다.
이렇게 하는 이유가 바로 단방향 알고리즘을 비밀번호에 적용하여 복호화가 되지 않기 때문에 서비스를 제공하는 입장에서도 사용자의 비밀번호를 몰라서 그냥 재설정을 통해 새로운 비밀번호를 생성하라고 하는 것이다.
대표적인 단방향 암호화 알고리즘으로는 SHA-256이 있다.
여기까지 단방향 암호화 방식을 살펴보면 해킹을 할 수 없는 철통보안을 자랑할 것 같지만 실상은 그렇지 않다.
보통의 해시 함수는 충분히 빠른 속도를 제공하는데 공격자가 이를 이용하여 공격할 수 있다. 이러한 공격을 레인보우 테이블이라고 한다.
- 레인보우 테이블
레인보우 테이블은 모든 가능한 문자 조합에 대한 해시 값이 미리 계산된 테이블로 사용자의 비밀번호를 탈취하기 위해 테이블에서 입력 값을 하나씩 대입해 보는 공격이다.
이러한 레인보우 테이블을 예방하기 위한 방법 중에는 Salt와 키 스트레칭이 있다.
- Salt
Salt는 말 그대로 소금을 의미하는데 단방향 암호화를 할 때 소금을 추가적으로 뿌려 해커가 복호화하는 것을 막는 방법이다.
- 키 스트레칭
키 스트레칭은 앞서 해시 함수의 빠른 속도를 의도적으로 늦추는 방법이다.
레인보우 테이블은 가능한 문자 조합을 일일이 대입을 해보며 출력 값을 확인하게 되는데 출력 값이 산출되는 것을 의도적으로 느리게 만든다.
대표적으로 bcrypt 방법이 있다.
참고 자료
'CS > 알고리즘' 카테고리의 다른 글
알고리즘 - 완전 탐색 (0) | 2024.06.20 |
---|---|
알고리즘 (1) | 2024.06.02 |
알고리즘 - 우선순위 큐 (0) | 2023.12.04 |
알고리즘 - 그리디(Greedy) (0) | 2023.08.16 |
알고리즘 - 이진 탐색(Binary Search) (0) | 2023.08.16 |