암호학
암호학은 정보를 허가된 방식으로만 읽고 검증할 수 있도록 수학적 기법과 통신 절차를 연구하는 분야다. 기밀성뿐 아니라 무결성, 인증, 전자서명과 키 관리까지 포함하며 현대 디지털 보안의 핵심 기반을 이룬다.
문서 목차 · 개요
1. 개요
암호학은 정보를 보호하고 통신 상대와 데이터의 진위를 확인하기 위한 원리와 기술을 연구한다.
평문을 알아보기 어려운 암호문으로 바꾸는 암호화가 잘 알려져 있지만, 현대 암호학은 데이터가 바뀌지 않았는지 확인하는 무결성, 상대의 신원을 확인하는 인증, 작성 사실을 증명하는 전자서명도 다룬다.
암호 기술은 알고리즘만으로 안전해지지 않는다.
키를 어떻게 만들고 보관하는지, 난수를 어떻게 얻는지, 프로그램이 오류 없이 구현되었는지, 통신 절차가 공격자의 개입을 막는지까지 하나의 시스템으로 살펴야 한다.
강한 알고리즘을 사용해도 비밀번호를 노출하거나 인증서를 잘못 검증하면 전체 보안이 무너질 수 있다.
2. 기본 용어
평문은 보호하기 전의 정보이고 암호문은 암호화를 거친 결과다.
암호화 알고리즘은 평문과 키를 입력받아 암호문을 만들며, 복호화 알고리즘은 적절한 키로 암호문에서 평문을 되찾는다.
키는 알고리즘의 동작을 결정하는 비밀값 또는 공개 가능한 값이다.
현대 암호학은 알고리즘의 구조를 공개해도 키를 모르면 현실적인 시간 안에 보호된 정보를 알아내기 어려워야 한다는 원칙을 따른다.
알고리즘 자체를 숨기는 데 의존하면 한 번 구조가 알려졌을 때 모든 사용자가 위험해지고 외부 검토도 어렵다.
공개된 설계와 오랜 분석을 견딘 표준 알고리즘을 쓰는 이유다.
공격자는 암호문을 관찰하는 것에 그치지 않고 일부 평문을 알고 있거나 원하는 평문을 암호화해 보거나 변형한 암호문의 복호화 반응을 관찰할 수 있다고 가정한다.
안전성은 공격자의 능력과 목표를 명확히 정의한 뒤 그 목표를 달성할 가능성과 필요한 계산량으로 평가한다.
3. 고전 암호와 한계
고전적인 치환암호는 평문의 글자를 다른 글자로 바꾼다.
카이사르 암호처럼 일정한 칸만큼 문자를 이동시키는 방식은 가능한 키가 적어 모두 시험해 보면 쉽게 풀린다.
단일 문자 치환은 키의 수가 많아도 언어에서 자주 나타나는 글자와 낱말의 빈도를 분석해 공격할 수 있다.
전치암호는 글자 자체를 바꾸지 않고 순서를 섞는다.
치환과 전치를 여러 번 결합하면 구조가 복잡해지지만 손으로 설계한 규칙은 예상하지 못한 패턴을 남길 수 있다.
현대 블록암호도 치환과 위치 섞기의 생각을 활용하지만 정교한 수학적 구조와 충분한 반복, 광범위한 공개 분석을 거친다는 차이가 있다.
고전 암호의 역사는 비밀 규칙을 만드는 사람과 그것을 분석하는 사람의 경쟁을 보여 준다.
암호 해독은 언어 지식, 통계, 오류와 운용 습관을 이용했다.
이 경험은 안전성이 알고리즘의 복잡해 보이는 외형보다 검증 가능한 설계와 올바른 운용에 달려 있음을 알려 준다.
4. 대칭키 암호
대칭키 암호는 암호화와 복호화에 같거나 서로 쉽게 연결되는 비밀키를 사용한다.
계산이 빠르고 큰 데이터를 처리하기 좋아 저장 장치, 네트워크 통신과 백업 암호화에 널리 쓰인다.
통신하는 양쪽이 같은 비밀키를 안전하게 공유해야 한다는 과제가 있다.
블록암호는 정해진 길이의 데이터 블록을 키에 따라 다른 블록으로 변환한다.
같은 키와 같은 입력은 같은 출력을 만들기 때문에 긴 메시지를 안전하게 처리하려면 운용 모드와 고유한 초기값 또는 nonce가 필요하다.
같은 설정을 반복 사용하면 평문의 반복 패턴이나 두 메시지의 관계가 드러날 수 있다.
스트림암호는 키와 nonce에서 생성한 키스트림을 평문과 결합한다.
같은 키스트림을 두 번 사용하면 암호문끼리 비교해 평문 관계를 알아낼 수 있으므로 nonce 재사용을 엄격히 막아야 한다.
nonce는 반드시 비밀일 필요는 없지만 요구되는 범위에서 중복되지 않아야 한다.
현대 시스템은 암호화와 인증을 함께 제공하는 인증 암호 방식을 우선 사용한다.
암호문을 숨기기만 하고 변조 여부를 검사하지 않으면 공격자가 내용을 몰라도 데이터를 바꾸어 프로그램의 반응을 유도할 수 있다.
복호화 결과를 사용하기 전에 인증 태그를 검증해야 한다.
5. 공개키 암호
공개키 암호에서는 서로 다른 공개키와 개인키가 한 쌍을 이룬다.
공개키는 다른 사람에게 배포할 수 있고 개인키는 소유자가 보호한다.
공개키로 암호화한 정보를 개인키로만 복호화하거나, 개인키로 만든 서명을 공개키로 검증하는 방식이 가능하다.
공개키 암호는 처음 만난 상대와 비밀을 설정하고 많은 사용자에게 검증키를 배포하는 문제를 완화했다.
그러나 계산 비용이 대칭키 암호보다 큰 경우가 많아 실제 통신에서는 공개키 기법으로 임시 비밀을 합의하고 본문 데이터는 대칭키로 처리하는 혼합 방식을 사용한다.
공개키가 실제 상대의 것인지 확인하지 않으면 중간자 공격을 받을 수 있다.
공격자가 자신의 공개키를 상대의 키처럼 전달하면 양쪽 통신을 각각 복호화하고 다시 암호화할 수 있다.
인증서, 신뢰할 수 있는 배포 경로, 키 지문 확인과 인증된 키 교환이 필요한 이유다.
6. 해시 함수
암호학적 해시 함수는 임의 길이의 입력을 고정 길이의 값으로 바꾼다.
입력이 조금만 달라져도 출력이 크게 변하며, 해시값에서 원래 입력을 찾거나 같은 해시를 갖는 두 입력을 찾기 현실적으로 어려워야 한다.
해시는 암호화와 다르다.
일반적인 해시에는 복호화 키가 없고 원문을 되찾는 용도로 설계되지 않는다.
파일 무결성 확인, 전자서명에서 긴 메시지를 요약하는 일, 데이터 구조의 연결과 비밀번호 검증의 일부에 활용된다.
단순히 비밀번호를 빠른 해시 함수에 한 번 넣어 저장하는 방식은 안전하지 않다.
공격자는 유출된 해시를 대상으로 흔한 비밀번호를 매우 빠르게 시험할 수 있다.
비밀번호마다 고유한 salt를 사용하고 계산 비용과 메모리 비용을 조절할 수 있는 전용 비밀번호 해시 함수를 써야 한다.
salt는 같은 비밀번호가 같은 해시로 저장되는 것을 막고 미리 계산한 대규모 표의 효율을 낮춘다.
salt는 비밀값이 아니며 레코드와 함께 저장할 수 있다.
서버가 별도로 보호하는 pepper를 추가하기도 하지만 키 관리와 장애 복구 계획이 함께 필요하다.
7. 메시지 인증과 전자서명
메시지 인증 코드는 비밀키와 메시지에서 짧은 태그를 만들고 같은 키를 가진 상대가 태그를 검증하게 한다.
데이터가 전송 중 바뀌지 않았고 키를 가진 주체가 만들었다는 점을 확인할 수 있다.
통신 양쪽이 같은 키를 가지므로 제3자에게 누가 만들었는지 증명하는 용도와는 구분된다.
전자서명은 개인키로 서명을 만들고 공개키로 검증한다.
서명이 유효하면 해당 개인키의 소유자가 메시지에 서명했고 서명 이후 내용이 바뀌지 않았음을 확인할 수 있다.
실제 법적 효력은 기술적 검증 외에도 서명자의 신원 확인, 인증 절차와 관련 법제에 달려 있다.
서명은 보통 원문 전체가 아니라 안전한 해시값과 규정된 서명 형식을 이용한다.
문서 형식이 모호하거나 보이는 내용과 실제 서명 데이터가 다르면 사용자가 속을 수 있다.
서명 전 표시 방식, 문맥, 목적과 검증 결과를 명확히 연결해야 한다.
8. 난수와 키 생성
암호키는 공격자가 예측할 수 없어야 한다.
현재 시각, 사용자 이름이나 일반 의사난수 생성기의 짧은 초기값처럼 추측 가능한 자료로 키를 만들면 알고리즘이 강해도 가능한 키를 빠르게 시험할 수 있다.
암호학적으로 안전한 난수 생성기는 운영체제가 모은 예측하기 어려운 상태를 이용해 필요한 난수를 제공한다.
응용 프로그램은 검증된 운영체제 인터페이스와 암호 라이브러리를 사용하고 자체 난수 공식을 만들지 않는 것이 원칙이다.
사람이 기억하는 비밀번호에서 암호키를 만들 때는 salt와 의도적으로 느린 키 유도 함수를 사용한다.
반복 계산과 메모리 사용은 공격자의 대량 추측 비용을 높인다.
사용자의 기기 성능, 로그인 지연과 공격 비용을 고려해 매개변수를 정기적으로 조정해야 한다.
키의 길이는 알고리즘마다 의미가 다르다.
서로 다른 방식의 키 비트 수를 숫자만 보고 직접 비교할 수 없으며, 알려진 최선의 공격과 목표 보안 기간을 기준으로 표준 권고를 따라야 한다.
9. 키 관리
키 관리는 생성, 배포, 저장, 사용, 교체, 폐기와 사고 대응의 전 과정을 포함한다.
키를 암호화된 데이터와 같은 위치에 평문으로 두면 저장소 하나의 유출로 보호가 사라진다.
접근 권한을 분리하고 전용 보안 장치나 운영체제의 키 저장 기능을 사용할 수 있다.
하나의 키를 너무 많은 목적과 오랜 기간에 사용하면 유출 시 피해 범위가 커진다.
용도별로 키를 분리하고 정해진 주기 또는 사고 발생 시 교체하며, 이전 데이터의 복호화와 감사에 필요한 키를 통제된 방식으로 보관해야 한다.
키를 잃으면 공격자뿐 아니라 정당한 사용자도 데이터에 접근할 수 없다.
백업 키와 복구 절차는 기밀성과 가용성 사이의 균형을 요구한다.
복구 권한을 한 사람에게 집중하지 않고 여러 승인이나 분할된 비밀을 사용하는 방법도 있다.
10. 통신 보안
웹 통신에서는 암호 프로토콜이 서버 인증, 키 합의, 암호화와 무결성 검사를 묶어 제공한다.
사용자는 주소와 인증서 검증을 통해 접속한 서버가 의도한 상대인지 확인하고, 통신마다 새 세션키를 만들어 데이터를 보호한다.
좋은 프로토콜은 메시지의 순서, 역할, 선택한 알고리즘과 세션의 문맥까지 인증한다.
각 구성 요소가 개별적으로 안전해도 연결 방식이 모호하면 이전 메시지를 다시 보내는 재전송 공격이나 서로 다른 용도의 메시지를 바꾸어 쓰는 공격이 가능하다.
순방향 비밀성을 제공하는 키 합의는 장기 개인키가 나중에 유출되더라도 과거에 기록된 세션을 바로 복호화하기 어렵게 한다.
이를 위해 세션마다 임시 비밀값을 만들고 사용 후 폐기한다.
다만 단말 자체가 감염되어 평문이나 세션키가 노출되면 전송 암호만으로 보호할 수 없다.
11. 구현 공격과 부채널
암호 알고리즘의 수학적 안전성과 구현의 안전성은 다르다.
프로그램이 오류 메시지나 처리 시간에서 비밀에 따른 차이를 보이면 공격자는 많은 요청을 관찰해 키나 평문 정보를 추론할 수 있다.
부채널 공격은 실행 시간, 전력 소비, 전자기 신호, 캐시 사용과 오류 반응처럼 계산 결과 이외의 흔적을 이용한다.
민감한 비교를 일정한 시간에 수행하고 비밀값에 따라 메모리 접근이 달라지지 않게 하는 등 구현 단계의 대응이 필요하다.
복호화 전에 인증을 확인하지 않거나 오류 종류를 자세히 노출하면 공격자가 입력을 조금씩 바꾸어 내부 정보를 알아낼 수 있다.
검증된 라이브러리도 안전한 사용 순서와 오류 처리 규칙을 따라야 한다.
12. 양자 계산과 알고리즘 전환
충분히 큰 오류 보정 양자컴퓨터가 실현되면 일부 공개키 알고리즘의 기반 문제가 효율적으로 풀릴 수 있다는 우려가 있다.
대칭키와 해시도 영향을 받지만 필요한 키 길이를 늘리는 방식으로 대응할 여지가 상대적으로 크다.
양자내성암호는 양자 공격에도 견디도록 다른 수학 문제를 이용하는 공개키 기법을 연구하고 표준화하는 분야다.
새 알고리즘은 안전성뿐 아니라 키와 서명의 크기, 처리 속도, 구현 복잡성과 부채널 저항성을 검토해야 한다.
암호 체계의 전환은 알고리즘 이름을 바꾸는 작업으로 끝나지 않는다.
어디에서 어떤 키와 인증서를 사용하는지 목록을 만들고, 여러 알고리즘을 함께 지원하며, 오래 보관할 데이터의 보호 기간을 고려해야 한다.
지금 수집한 암호문을 미래에 복호화하려는 공격 가능성 때문에 장기 기밀 정보는 미리 전환 계획을 세울 필요가 있다.
13. 안전하게 사용하는 원칙
자체 암호 알고리즘과 자체 프로토콜을 새로 설계하지 않고 공개 검토된 표준과 최신 유지보수 라이브러리를 사용한다.
오래되어 취약점이 알려진 알고리즘과 운용 모드는 호환성만을 이유로 계속 쓰지 않으며 단계적인 폐기 계획을 마련한다.
기밀성, 무결성, 인증과 가용성 가운데 무엇을 보호할지 먼저 정의한다.
공격자가 내부 사용자일 수 있는지, 기기를 훔칠 수 있는지, 서버를 조작할 수 있는지에 따라 필요한 통제가 달라진다.
위협 모형이 없으면 강한 암호 기능을 중요하지 않은 곳에 적용하고 실제 위험을 놓치기 쉽다.
암호 기술은 접근 통제, 업데이트, 백업, 로그, 사용자 교육과 함께 작동해야 한다.
피싱으로 사용자의 인증 정보가 넘어가거나 소프트웨어 공급망이 변조되면 전송 암호가 정상이어도 계정과 데이터가 침해될 수 있다.
암호학의 목적은 모든 위험을 제거하는 것이 아니라 공격 비용을 높이고 실패를 발견하며 피해 범위를 제한하는 데 있다.
알고리즘 선택보다 키 관리와 구현, 운영 절차를 포함한 전체 수명주기를 점검할 때 암호 기술은 신뢰할 수 있는 디지털 사회의 기반이 된다.