용어정리
- 평문 : 누구나 읽을 수 있는 글
- 암호문 : 아무도 읽을 수 없는 글
- 암호화 : 평문을 암호문으로 만드는 것
- 복호화 : 암호문을 평문으로 만드는 것
- 암호화키 : 평문을 암호문으로 만드는 규칙
- 복호화키 : 암호문을 평문으로 만드는 규칙
암호화를 하는 이유는 앞서 패킷분석을 해봤듯이 원문이 그대로 노출 될 경우 중요 정보가 유출될 수 있기 때문이다.
ROT13
영어를 13글자 밀어서 암호화 하는 방식
영어만 암호화된다는 단점이 있다. -> 이를 보안하기 위해 ROT47 방식(대/소/숫/특수 94개를 반으로 나누어서 섞어서 사용)이 등장
소스코드
def rot47(s):
x = []
for i in range(len(s)):
j = ord(s[i])
if j >= 33 and j <= 126:
x.append(chr(33 + ((j + 14) % 94)))
else:
x.append(s[i])
return ''.join(x)
대칭키 (Symmetric Key)
암호화키와 복호화키가 서로 대칭을 이루는 키다. 대칭키의 경우 치환, 순열, 매트릭스를 사용한다. 대칭키의 경우 암호화/복호화 속도가 빠르다는 장점이 있지만, 문제점은 이러한 대칭키를 비밀리에 상대방에게 줄 방법이 없다라는 점과 여러 사람이 통신할 때 키의 개수가 많아진다는 점이다.
특징
- 비밀(개인)키(Secret Key) : 키를 비밀리에 보관해야 한다.
- 단일키(Single Key) : 사실상 하나의 키다.
- 세션키(Session Key) : 한번의 세션에서만 사용한다.
종류
- DES, 3DES
- 최초의 표준 대칭키
- 블록 암호화 방식을 사용한다 (64bit이지만 8bit을 패리티 비트로 채우기 때문에 사실상 56bit이다.)
- 3DES는 DES를 3번 반복한 것
- AES(Rijndael)
- 최근에 사용하는 표준 암호화
- SPN(Substitution Permutation Network) : 치환과 전치의 반복사용
- 키의 길이 : 128, 192, 256 등
- SEED, HIGHT, LEA : 국산 알고리즘 -> 남이 만든거는 믿을 수 없기 때문에 사용
공개키(대칭키로 사용하는 방식, 속도 빠름)
누구나 개인(비밀)키(Private Key)와 공개키(Public Key)를 가지고 있고, 이름 그대로 개인키의 경우 누구도 모르는 자기만 알 수 있게 안전하게 보관하고, 공개키의 경우 거래 상대에게 제공한다.
공개키의 장점은 대칭키의 단점을 완벽하게 보완한다는 것이다. ->
상대의 공개키 + 자신의 개인키(대칭키) = 자신의 공개키 + 상대의 개인키(대칭키)
하지만 아래 그림과 같은 문제점이 있다.
공개키(비대칭키로 사용하는 방식, 속도 느림)
대칭으로 사용했을 때의 문제점(MITM)을 해결하기 위해 개인키와 공개키를 한쌍으로 사용하는 방식을 사용하게 됨
RSA(사실상의 표준 공개키)
양방향 암호화 가능
- 기밀성 : 송신자가 수신자의 공개키로 암호화 -> 수신자는 자신의 개인키로 복호화
- 인증 : 송신자가 자신의 개인키로 암호화 -> 수신자는 송신자의 공개키로 복호화 (전자서명)
- 전자서명(인증부분에서 원문을 해쉬값으로 변환하는 과정이 추가됨)(#해쉬참고)
- 생성 : 원문의 해쉬값에 송신자의 개인키로 서명(암호화)을 하고 원문과 함께 보냄
- 검증 : 서명된 해시값을 송신자의 공개키로 복호화하고 원문의 해쉬값과 비교
- 일치 : 무결성 검증, 인증, 부인봉쇄 확인
- 예 : 은행 이체의 경우 이체를 할 때 비밀번호(개인 키)를 입력하는데 이것이 인증, 부인봉쇄를 한다.
- 전자서명(인증부분에서 원문을 해쉬값으로 변환하는 과정이 추가됨)(#해쉬참고)
ECC(Elliptic Curve Cryptography : 타원 곡선 암호화)
RSA알고리즘의 대안으로 나온 암호화로 이산대수의 어려움에 근거한 방식으로 만들어 졌다.
RSA보다 짧은 길이로 동등한 수준의 보안을 제공한다는 장점이 있다. 이러한 장점은 CPU/ Memory/ Power 소모량을 감소시키고, 이에 따라 Mobile환경에 적합하다.
# RSA1024bit와 ECC160bit이 제공하는 보안수준이 비슷함
해쉬 알고리즘
원문이 조금이라도 달라지면 해쉬값이 달라지는 특징을 이용하여 원문 변조를 확인할 수 있다. -> 무결성 검증
특징
- 고정길이로 출력 : 원문의 길이와 관계없이 항상 일정한 길이로 출력됨
- 일방향 함수 : 해쉬함수와 해쉬값을 알아도 원문 복구는 불가능하다.
- 충돌방지 : 원문이 다르면 해쉬값도 다르다 -> 완전히 0퍼는 아니지만 0퍼에 수렴한다.
- MD5(128bit), SHA-1(160bit), SHA-256(256bit) 등
다양한 알고리즘이 있지만 MD5, SHA-1 등과 같이 오래된 알고리즘은 컴퓨터의 발전에 따라 더이상 안전하지 않게 되었다.(크랙킹이 가능해짐) 아래 사진은 서로 다르지만 같은 해쉬값을 가지고 있는 .pdf파일이다. 또한 안전하지 않는 알고리즘은 ISMP-P, ISO27001에서 인증을 해주지 않는다.
인증서
인증서는 공개키가 진짜 자신이 통신하고자 하는 상대의 공개키가 맞는지에 대해 인증을 해주는 것으로 인증서를 통해 공개키를 검증할 수 있다.
인증서
- 형식 : X.509v3
- 인증서의 주요 내용 : 서명알고리즘, 유효기간, 발급자, 주체, 주체의 공개키, 서명된 해시값 등
- 공개키가 올바른지 확인 (주체의 것이 맞는지 검증)
- 방법은 전자서명과 비슷함,
- 생성 : 원문(공개키)의 해시값을 구해서 송신자(CA)의 개인키로 서명(암호화)
- 검증 : 송신자(CA : 인증기관)의 공개키로 서명된 해시값을 복호화한 후, 원문(공개키)의 해시값을 구해서 비교해봄
- 검증시 : 통신하는 상대방 <- 인증해주는 인증기관 <- 인증기관을 인증하는 Root 인증기관(컴퓨터에 Root인증기관의 서명이 있어 그것으로 마지막으로 확인)의 꼬리물기 형식을 가짐
공인인증서
- 공인인증기관이 서명한 인증서
- 기관 : KOSCOM(증권전산), 한국무역정보통신, 한국전자인증, 한국정보인증, 금융결제원
- 전자서명법(2020년 5월) : 전자서명에 동등한 법적효력 부여
PKI(Public Key Infrastructure)
PKI기관
- RA(Registration Authority, 등록기관) : 인증서 신청 업체를 검증하고 등록을 대행하는 역할 (사업자등록증, 인감증명, 인감증명, 인감도장, 등기부등본 등)
- CA (Certificate Authority, 인증기관) : 인증서를 발행하여 인증해주는 기관
- RootCA (최상위 인증기관, 美PCA) : 인증기관을 인증(검증)해주는 기관
- Repository : 인증서(공개키)를 모아놓은 데이터베이스(LDAP)
우리나라의 공인인증 체계
- NPKI(National Public Key Infrastructure) : PAA(정책기관 : 미래부) -> KISA(RootCA) -> CA 5개기관(무역정보통신, Koscom, 한국전자 인증, 한국정보인증, 금융결제원) -> 은행들
- GPKI : 행자부
- MPKI : 국방부
- EPKI : 교육부 ex) 나이스
CRL(Certificate Revocation Authority) : 인증서 취소 목록
- 일반일들이 조회하기 전까지는 가짜 인증서를 확인하기 어려움을 가진다
- OCSP (Online Certificate Status Protocol) : 온라인에서 실시간으로 인증서의 유효성을 검증하는 프로토콜
암호화의 응용
SSL/TLS
암호화를 웹에 적용시킨 웹 암호화 통신 프로토콜이다. 브라우저와 서버가 어떤 암호화 방식을 사용할건지 협의(우선순위 있음)하고 그 방식으로 암호화 통신을 진행한다.
원리
- 웹서버가 자신의 공개키를 인증서 형식으로 제공
- 웹브라우저는 서버_공개키를 기반으로 세션키를 생성
- 생성된 세션키를 서버_공개키로 암호화하여 서버로 전달
- 서버는 서버_개인키를 이용하여 암호화된 세션키를 복호화
- 안전하게 서로 세션키(대칭키)를 가지게 됨
- 브라우저와 서버는 세션키로 암호화/복호화하며 데이터를 주고받음
- 세션이 만료되거나 일반적으로 브라우저를 닫으면 세션키가 사라짐
사례
카카오톡의 경우 전송자의 말을 수신자에게 전달할 때 수신자에게 수신자의 세션키로 암호화해서 보내야 하므로 서버에서 전송자의 세션키로 전송자의 말을 복호화하는 과정을 거쳐야한다. -> 서버에서 원문이 노출됨
텔레그램의 경우 Diffie-Hellman방식을 사용하기에 이러한 보안 문제에 대해 대응했다.
전자봉투
- 생성 : 원문의 해쉬값에 송신자의 개인키로 서명(암호화)하고 원문 및 송신자의 공개키를 포함하여 세션키로 암호화하고, 세션키는 수신자의 공개키로 암호화해서 같이 수신자에게 보냄
- 검증 : 수신자의 개인키로 세션키를 복호화하고, 복호화하여 얻은 세션키로 원문, 암호화된 원문 해쉬값, 송신자의 공개키를 복호화함 이후에 송신자의 공개키로 원문 해쉬값을 복호화하고, 원문의 해쉬값을 계산해서 비교
기타
랜섬웨어 : 대부분 RSA2048bit으로 암호화하고 공격자의 공개키가 들어있어서 파일을 공격자의 공개키로 암호화함 -> 즉 파일은 공격자의 개인키로만 복호화 할 수 있음
가상화폐 : 주로 해쉬의 원리(SHA-256bit)를 이용
- 앞 블록에 대한 해쉬값을 다음 블록의 헤더에 포함시킴 (Chain)
- 중간 블록을 바꿀 수 없음 (무결성 검증)
- 기밀성은 제공하기 어려움 : 블록안에 거래내역이 모두 들어있음
'SK Rookies 9 > Network System Secure' 카테고리의 다른 글
로그 분석 (0) | 2022.09.22 |
---|---|
Metasploit 실습 (0) | 2022.09.21 |
Exploit (0) | 2022.09.20 |
WireShark (0) | 2022.09.18 |
9월 15일 (0) | 2022.09.16 |